2012-07-24 2 views
0

exShell이라는 과제를위한 코드를 받았습니다. 그것의 코드는 부정을 위해 (not)/1을 사용합니다. 저는 현재 모든 인스턴스를 (\+)/1으로 대체했습니다. 그러나 왜 그것이 그곳에 있을지 궁금합니다. (\+)/1의 별칭을 (not)/1으로 할 수 있습니까, 아니면 cprolog 또는 다른 프롤로그 컴파일러 (예 : cprolog)의 규칙입니다.프롤로그에서 별칭`(not)/1`

solve(not A, C, Rules, (not Proof, C), T, Ask) :- !, 
    T1 is -1 * T, 
    solve(A, C1, Rules, Proof, T1, Ask), 
    C is -1 * C1. 

이것은 사용 된 예입니다.

+0

예 (들)? –

+4

'(not)/1'과'(\ +)/1'은 이미 별명입니다. 오직'(not)/1'은'(\ +)/1'이 사용되지 않는 반면에, (not)/1'은 사용되지 않습니다. 자세한 설명은 [이 답변] (http://stackoverflow.com/a/8523825/1027951)을 참조하십시오. '+'는 증명할 수있는 것이고 실제로는 반박하지 않는 것을 의미합니다. "증명할 수 없다"는 의미는 "not"보다 옳습니다. – m09

+1

@ 모그 : 나는 적어도 당신의 코멘트를 링크 된 대답만큼 설명 적이라고 생각한다. ... – CapelliC

답변

0

다음은 not처럼 보이는 단항 연산자입니다 (예 : op(500,fy,not)과 같이, solve/6 술어가 처리중인 기호 데이터로 사용됩니다. 예 :

?- op(500,fy,not). 

Yes 
?- write(not 3). 
not 3 

Yes 
?- write_canonical(not 3). 
not(3) 

Yes 
?- not 3 =.. X . 

X = [not, 3] 

Yes 
?- 
+0

그럼 왜 컴파일러를 깨뜨리는거야? 또한이 명령은 모두 내 리스너에서 작동하지만 변수 나 술어에 대한 사용이 아니라면 오류가 발생하므로 기호 데이터가 무엇을 의미하는지 이해하지 못합니다. – rumble

+0

모든 Prolog 복합 항은 기호 데이터입니다. 그것은 단지 데이터 일 뿐이며 명령이 아닙니다. 'not (3)'이라는 단어는 펑터가 'not'이고 인자가 '3'입니다. 'arg' 또는'= ..'등으로 복합 용어를 검사합니다. 여러분이 보았던 것에서 여러분이 사용하는 어딘가에서 정의 된 술어'solve'가 있습니다. 명백히'not (X) '라는 형태의 용어를 다루기로되어있다. 또는 당신이 올린 것에서처럼 보입니다. 만약 당신이 "변수에"not "를 사용한다면 Prolog를 사용하여 그것을 처리 할 수 ​​있습니다; 하지만 당신은 그것을 처리하는 술어'해결 '을 보여줍니다. 나는. Prolog에서 그 자체로가 아니라 술어'solve'를 통해. –

+0

그래서 분명히하기 위해'not (x)'는 논리적으로'\ +'와 동등합니다.이 프로그램의 경우'not '는 오류를 유발합니다. 이행. 이전 게시물에서 'not'가 가치가 떨어지는 것처럼 들립니다. 죄송합니다. 저는 프롤로그에 매우 익숙합니다. – rumble