prolog - Prolog 规则中目标(语句)的顺序

标签 prolog prolog-dif declarative-programming logical-purity

最近开始学习Prolog,遇到一个奇怪的问题。 在这里您可以看到一个代码示例(我使用 SWI-Prolog 7.2.3),它给出了关系树和我的 2 个任务的解决方案。

/*   File:    ancestors.pl
 Author:  Dave Robertson
 Purpose: Relationships in a family tree

Suppose we have a family tree like this :

alan andrea   bruce betty      eddie elsie   fred  freda
 |     |        |     |          |     |       |     |
 |_____|        |_____|          |_____|       |_____|
    |              |                |             |
  clive        clarissa            greg         greta
   |  |__________|___|              |             |
   |__________|__|                  |_____________|
          |   |                            |
        dave doris                        henry

which is defined in Prolog by the following 3 sets of predicates:

*/

%   parent(Parent, Child).
%   Parent is the parent of Child.

parent(alan, clive).
parent(andrea, clive).
parent(bruce, clarissa).
parent(betty, clarissa).
parent(clive, dave).
parent(clarissa, dave).
parent(clive, doris).
parent(clarissa, doris).
parent(eddie, greg).
parent(elsie, greg).
parent(fred, greta).
parent(freda, greta).
parent(greg, henry).
parent(greta, henry).

%%   PROBLEM 1
%%   How do you find out if someone is the ancestor of someone else ?
ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y).

%%   PROBLEM 3
%%   How do you know if someone is related to someone else ?
relative(X,Y) :-  ancestor(X,Y).
relative(X,Y) :-  ancestor(Y,X).
relative(X,Y) :-  ancestor(Z,X), ancestor(Z,Y), X\==Y.

当我想找到戴夫的亲戚时,我会这样做:

relative(dave,X).
X = clive ;
X = clarissa ;
X = alan ;
X = andrea ;
X = bruce ;
X = betty ;
X = doris ;
X = doris ;
X = clive ;
X = doris ;
X = clive ;
X = doris ;
X = clarissa ;
X = doris ;
X = clarissa ;
X = doris ;
false.

然后我改变了相对的定义:

relative(X,Y) :-  ancestor(X,Y).
relative(X,Y) :-  ancestor(Y,X).
relative(X,Y) :-  X\==Y, ancestor(Z,X), ancestor(Z,Y).

我只是更改了最后一个语句中目标的顺序。 现在我有以下输出:

relative(dave,X).

X = clive ;
X = clarissa ;
X = alan ;
X = andrea ;
X = bruce ;
X = betty ;
X = dave ;
X = doris ;
X = dave ;
X = doris ;
X = clive ;
X = dave ;
X = doris ;
X = clive ;
X = dave ;
X = doris ;
X = clarissa ;
X = dave ;
X = doris ;
X = clarissa ;
X = dave ;
X = doris ;
false.

我在输出中看到戴夫!这怎么发生的?我写了 X\== Y...有人能给我一个很好的解释吗?

还有一个问题。如何使我的程序不写出相同的答案?

谢谢!

最佳答案

(\==)/2 不是纯粹的关系,只能从操作上理解。如果您使用它,交换目标顺序可能会产生声明性错误的结果:

?- X \== Y, X = Y.
X = Y.

请使用 dif/2 作为纯粹且完全声明性的方式来声明术语的不相等性。

?- dif(X, Y), X = Y.
false.

参见了解更多信息。

关于prolog - Prolog 规则中目标(语句)的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33732576/

相关文章:

ios - 将 NSString 转换为 Objective-C 控件

java - 将命令式 Java 转换为函数式 Java(游戏)

prolog - prolog 中的上下文相关生成

prolog - 如何创建一个规则,使 Prolog 中的所有关系对称?

prolog - 从列表中删除简单的 Prolog

list - 检查任何元素的频率是否超过限制

prolog - 使用\==/2或dif/2

Prolog fd_domain 未定义

列表 - 计算与其上一项相关的原子

scala - 在我的算法中替换命令式 PriorityQueue