swi-prolog中的非等运算

swi-prolog中的非等运算,prolog,compare,successor-arithmetics,Prolog,Compare,Successor Arithmetics,我试图在序言中比较两个皮亚诺的数字,但有些结果是错误的 任何人都可以帮助我,这是我的代码: %Not Equal notequal(0,s(A),X). notequal(s(A),0,X). notequal(s(A),s(B),C):- A/=B . 或 输出: ?- notequal(s(0),s(s(0)),S). false. ?- notequal(s(0),0,S). true . ?- notequal(0,s(0),S). true. 第一次输出错误 谢谢。这样的谓词不

我试图在序言中比较两个皮亚诺的数字,但有些结果是错误的

任何人都可以帮助我,这是我的代码:

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

输出:

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

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

?- notequal(0,s(0),S).
true.
第一次输出错误


谢谢。

这样的谓词不需要三个参数,毕竟你想描述两个数字之间的关系。最后一条规则应该再次调用谓词本身:

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))) ;
.
.
.

如果您不需要找出两个数字的实际顺序,例如,对于基于比较的排序,而只需要说明安全术语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
?- dif(A, B).
dif(A, B).             % residual goal indicates pending disequality constraint