2017-12-01 8 views
1

두 개의 peano의프롤로그에 비교하려고하지만 일부는 잘못된 것입니다.swi-prolog에서 같지 않음 작업

누구든지 나를 도울 수, 이쪽은 내 코드입니다 :

%Not Equal 
notequal(0,s(A),X). 
notequal(s(A),0,X). 
notequal(s(A),s(B),C):- A/=B . 

또는

%Not Equal 
notequal(0,s(A),X). 
notequal(s(A),0,X). 
notequal(s(A),s(B),C):- minus(A,s(0),S1),minus(B,s(0),S2),notequal(S1,S2,C) . 

출력 :

?- notequal(s(0),s(s(0)),S). 
false. 

?- notequal(s(0),0,S). 
true . 

?- notequal(0,s(0),S). 
true. 

먼저 출력 잘못된

고맙습니다.

답변

4

두 술어 사이의 관계를 설명하려는 경우 이러한 술어에는 세 개의 인수가 필요하지 않습니다. 그리고 마지막 규칙은 다시 조건 자체를 호출해야합니다 :

notequal(0,s(_)). 
notequal(s(_),0). 
notequal(s(A),s(B)) :- % s(A) and s(B) are not equal if 
    notequal(A,B).  % A and B are not equal 

를이 원하는 답변을 얻을 수 :

?- notequal(0,0). 
false. 

?- notequal(0,s(0)). 
true. 

?- notequal(s(0),s(0)). 
false. 

?- notequal(s(s(0)),s(0)). 
true ; 
false. 

?- notequal(s(s(0)),0). 
true ; 
false. 

또한 인스턴스를 하나 개의 인수와 함께이를 사용할 수 있습니다

?- notequal(s(0),B). 
B = 0 ; 
B = s(s(_G2450)). 

?- notequal(A,s(0)). 
A = 0 ; 
A = s(s(_G2450)). 

로 이 두 가지 대답으로 모든 가능성을 다룰 수 있습니다. 심지어 가장 일반적인 쿼리가 생산 솔루션 : 만

?- notequal(A,B). 
A = 0, 
B = s(_G2456) ; 
A = s(_G2456), 
B = 0 ; 
A = s(0), 
B = s(s(_G2460)) ; 
A = s(s(_G2460)), 
B = s(0) ; 
A = s(s(0)), 
B = s(s(s(_G2464))) ; 
. 
. 
. 
+1

유 너무 감사합니다 –

2

는 비교 기반이 —을 정렬, 말 — 두 숫자의 실제 순서를 찾을 필요가없는 경우 만 안전 용어 disequality을 명시 할 필요는을 사용하여 널리 사용 가능한 내장 술어 dif/2!

일부 샘플 쿼리 :이 또한 안전하게 가장 일반적인 경우 작동

?- dif(0, 0). 
false. 

?- dif(0, s(0)). 
true. 

?- dif(s(0), s(0)). 
false. 

?- dif(s(s(0)), s(0)). 
true. 

?- dif(s(s(0)), 0). 
true. 

:

?- dif(A, B). 
dif(A, B).    % residual goal indicates pending disequality constraint