如何在prolog中恰当地表达不等式?
TL;DR:如何在prolog中恰当地表达不等式?,prolog,prolog-dif,iso-prolog,gnu-prolog,logical-purity,Prolog,Prolog Dif,Iso Prolog,Gnu Prolog,Logical Purity,TL;DR:兄弟姐妹(a,X)成功地回答了X=a,但兄弟姐妹(a,a)失败 我有以下Prolog文件: children(a, c). children(a, d). children(b, c). children(b, d). sibling(X, Y) :- X \== Y, A \== B, children(X, A), children(X, B), children(Y, A), children(Y, B). 对我来说似乎很清楚,如果父母是一样的,两个人就
兄弟姐妹(a,X)
成功地回答了X=a
,但兄弟姐妹(a,a)
失败
我有以下Prolog文件:
children(a, c).
children(a, d).
children(b, c).
children(b, d).
sibling(X, Y) :-
X \== Y, A \== B,
children(X, A), children(X, B),
children(Y, A), children(Y, B).
对我来说似乎很清楚,如果父母是一样的,两个人就是兄弟姐妹。而且,一个人不是他们自己的兄弟姐妹
但当我尝试在GNU Prolog上运行一些查询时,我得到了一些奇怪的结果:
| ?- sibling(a, b).
true ? a
true
true
yes
这是预期的行为<代码>a和b
是兄弟。有三个结果,这有点奇怪,但我假设Prolog是绑定的a=c,B=d
和a=d,B=c
| ?- sibling(a, a).
no
我认为这意味着a
和a
不是兄弟姐妹
| ?- sibling(a, X).
X = a ? a
X = b
X = a
X = b
X = a
X = b
X = a
X = b
(15 ms) yes
这就是我被卡住的地方:它说X=a
,这意味着兄弟姐妹(a,a)
是真的,但是兄弟姐妹(a,a)
在前面的查询中失败了
我觉得我不理解Prolog中\==
的实际功能
发生了什么,我如何解决这个问题?尝试将不等式移到谓词的末尾。也许它给你的是真的,因为它还没有被实例化
sibling(X,Y):- children(X, A), children(X, B),
children(Y, A), children(Y, B),
X \== Y, A \== B.
TL;DR:使用-或(在符合要求的系统上,如)
好问题,+1 事实上,这是我问自己的一个问题,答案与:逻辑纯度是什么的核心方面 使Prolog成为一种非常特殊的语言,因为它使您能够:
- 描述而不是处方
- 编写关系型而不仅仅是功能型的代码
- 考虑问题/解决方案,而不是搜索过程本身的各个步骤
- 在更高的层次上运作,不要迷失在细节中
但是,请注意:Prolog的一些特性在使用时会破坏声明性语义。为了避免这种情况,请尝试将应用程序分为两部分:一部分是处理副作用(输入/输出)的不纯shell,另一部分是包含纯单调Prolog代码的逻辑纯基。谢谢大家!@重复哦,大写字母,我没看到,抱歉haha@parchment:如果使用不纯原语,排序通常很重要。我建议你通过@repeat检查这个伟大的答案。使用
dif/2
可获得全方位可用的纯质量。请参阅。如果您正在使用GNU,请使用。