2010-06-28 11 views
10

프롤로그에서 상수를 정의하는 방법이 있습니까?프롤로그 상수

지금

list1([1, 2, 3]). 
list2([4, 5, 6]). 

predicate(L) :- 
    list1(L1), 
    list2(L2), 
    append(L1, L2, L). 

입니다 내가 사용하고있어 해결 방법

list1 :- [1, 2, 3]. 
list2 :- [4, 5, 6]. 

predicate(L) :- append(list1, list2, L). 

같은 것을 쓰고 싶습니다하지만이 같은 "쓸모없는"변수를 바인딩 조금 서투른 상수에 액세스해야 할 때마다

또 하나의 (심지어 더 못생긴) 나는 빌드 체인에 cpp를 포함시키는 것이 좋습니다.

(내 실제 응용 프로그램에서 목록이 많은 장소에 사용되는 대형 LUT입니다.)

+3

해결 방법이 아닙니다. 이것을 사실 선언이라고합니다. 인수가'[1,2,3]'이면 'list1/1'은 연속적인 목표라는 사실을 선언합니다. 프롤로그에는 변수가 없으므로 모든 "값"(원자 또는 용어)이 일정하고 각 "변수"(값 이름)가 비 결정적 상수라고 가정 할 수 있습니다. 각각의 "변수"(예 :'L1')는'(1 + 2 * 3)'과 같은 것을 가질 수 있으며 해석되지 않습니다. 'append '의 인자로'list1'을 넘겨 주면 그것은 atom로 해석됩니다. 당신은'myappend (list1, list2, [1,2,3])를 정의 할 수 있습니다. , 4,5,6]). – ony

+0

상수를 사용하지 않기 위해 실제 선언을 사용하라 – aioobe

답변

11

난 당신이 일부 구현은 할 수 있지만 '순수'프롤로그에 (당신이 가까운 무언가를 그렇게 할 수 있다고 생각하지 않습니다 예를 들어 ECLiPSe에는 선반이 있습니다.

이유는 : 오른쪽과 왼쪽 모두 근거 용어이기 때문에

1) 당신은

list1 :- [4, 5, 6]. 

또는

list1 = [4, 5, 6]. 

같은 것들을에게 을 쓸 수 없습니다 일치하지 않는

2) 왼쪽 이제 변수이지만, 변수 만 술어 머리/몸에 사용할 수 있기 때문에 당신은

List1 :- [4, 5, 6]. 

또는

List1 = [4, 5, 6]. 

같은 것들을 쓸 수 없습니다 .

당신은 같은 멀티 옵션 술어 정의하는 것입니다 무엇을 할 수 있는지 :

myList([1, 2, 3]). 
myList([4, 5, 6]). 

을 한 후 모든 bagof와 값 (또는 유사한 조건) 검색 :

predicate(L) :- 
    bagof(ML, myList(ML), MLs),   
    concat(MLs, L). 

MLs 인을 myList(ML)을 만족하는 모든 ML 값 목록과 물론 concat 목록은 목록의 목록을 연결합니다.

+0

나는 대답에 동의하며'p ([1,2, 3]). 또는'x.'와 같은 0-arity 용어는 일반적으로 PROLOG에서 _global_ 상수를 정의하고, 술어의 정의에서 로컬 일 때 이러한 용어를 사용하는 방법입니다. 여기에는'List1 = [ – sharky

+0

은 백팩의 끝에 쉼표가 없어야합니까? ML을 단일 목록으로 가져올 수 없습니다. –

+0

@PulkitVerma, 오른쪽 소리, 편집 됨. – Mau

2

아니요, Prolog에서는이를 수행 할 수 없으며 술어를 통해이를 정의하는 것이 현명한 방법입니다.

또는 더 나은 방법으로, 조회 함수를 술어에 캡슐화하십시오.

그렇다면 실제로 사전 처리를 사용하려면 term_expansion/2이 있지만 조심하지 않으면 코드를 읽을 수없고 지저분해질 수 있습니다.

또한 기능 표기법 (기능 논리 언어는 Mercury과 같은)을 포함하는 Prolog의 확장을 살펴볼 수 있습니다. 그러나 이것들은 Prolog보다 더 이국적입니다.