Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在prolog中恰当地表达不等式?_Prolog_Prolog Dif_Iso Prolog_Gnu Prolog_Logical Purity - Fatal编程技术网

如何在prolog中恰当地表达不等式?

如何在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). 对我来说似乎很清楚,如果父母是一样的,两个人就

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).
对我来说似乎很清楚,如果父母是一样的,两个人就是兄弟姐妹。而且,一个人不是他们自己的兄弟姐妹

但当我尝试在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程序既有过程语义(定义执行步骤及其顺序)又有声明语义(允许您声明应该保持的关系,并让Prolog处理器自己找到正确的执行方式)


但是,请注意:Prolog的一些特性在使用时会破坏声明性语义。为了避免这种情况,请尝试将应用程序分为两部分:一部分是处理副作用(输入/输出)的不纯shell,另一部分是包含纯单调Prolog代码的逻辑纯基。谢谢大家!@重复哦,大写字母,我没看到,抱歉haha@parchment:如果使用不纯原语,排序通常很重要。我建议你通过@repeat检查这个伟大的答案。使用
dif/2
可获得全方位可用的纯质量。请参阅。如果您正在使用GNU,请使用。