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

https://stackoverflow.com/questions/47591329/

相关文章:

reactjs - 如何修复输入复选框需要双击才能使样式为 'check' ed(React/JSX

qt - Qt如何隐藏状态栏

svg - 使用 textLength 属性

html - 有没有办法修复 Outlook 2016 上的 HTML 电子邮件宽度?

php - 最小年龄验证 laravel

ms-access - MS Access 多控制按键 CTRL+A Handler

angular - 如何使用 Angular5 检查表单控件的变化

python - 如何在终端 Mac 上使用 python 3

scala - 创建一个 bool 特征来检查两列是否相同

delphi - 如何重建所有项目中的所有配置和所有目标平台?