swi-prolog 中的不相等操作
Not Equal Operation in swi-prolog
我正在尝试比较 prolog 中的两个 peano 的号码,但有些结果是错误的。
任何人都可以帮助我,这是我的代码:
%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.
第一次输出错误
谢谢。
这样的谓词不需要三个参数,毕竟您要描述两个数字之间的关系。你的最后一条规则应该再次调用谓词本身:
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))) ;
.
.
.
如果您不需要找出两个数字的实际顺序(例如,基于比较的排序),而只需要声明安全术语不相等,请使用广泛使用的内置谓词 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
我正在尝试比较 prolog 中的两个 peano 的号码,但有些结果是错误的。
任何人都可以帮助我,这是我的代码:
%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.
第一次输出错误
谢谢。
这样的谓词不需要三个参数,毕竟您要描述两个数字之间的关系。你的最后一条规则应该再次调用谓词本身:
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))) ;
.
.
.
如果您不需要找出两个数字的实际顺序(例如,基于比较的排序),而只需要声明安全术语不相等,请使用广泛使用的内置谓词 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