Prolog双向谓词

时间:2017-11-16 12:02:46

标签: prolog predicate bidirectional

我必须在Prolog中为作业创建家庭关系,我偶然发现了这个问题。

man(john).
woman(lisa).
married(john,lisa).

?- married(john,X).
X = lisa.

?- married(X,john).
false.

如何使这个谓词以两种方式工作? 如果约翰与丽莎结婚,那么丽莎就和约翰结婚了。

事实上,我只能使用性别,父母和已婚:

man(john).
woman(lisa).
parent(john,steve).
parent(lisa,steve).
married(john,lisa).

该要求使我solution无法使用。我不能只添加关系wife(lisa,john).,因为我必须自己定义妻子,丈夫等,就像。

wife(X,Y) :- woman(X),married(X,Y).

2 个答案:

答案 0 :(得分:3)

您可以相应地定义您的谓词妻子/ 2,而不是尝试结婚/ 2双向。如果已婚/ 2的第一个参数总是丈夫而第二个永远是妻子,那么只需翻转第二个目标的论点:

wife(X,Y) :-
   woman(X),
   married(Y,X).      % <- changed to Y,X instead of X,Y

根据您给出的事实,这会产生预期的结果:

?- wife(X,Y).
X = lisa,
Y = john.

如果你的事实还包括另一种方式,例如:

woman(ann).
man(anton).
married(ann, anton). 

你可以为妻子/ 2包括第二条规则(即你的原始规则)来处理这样的配对:

wife(X,Y) :-
   woman(X),
   married(Y,X).
wife(X,Y) :-          % <- new rule
   woman(X),          
   married(X,Y). 

使用附加规则和事实,上述查询现在产生:

?- wife(X,Y).
X = lisa,
Y = john ;
X = ann,
Y = anton.

答案 1 :(得分:-1)

如果你不能添加辅助关系(听起来像是家庭作业),请尝试使用谓词@<,该谓词按照“标准顺序”运行:

married(A,B) :- A @< B, married(B,A).

但请注意,此解决方案还带来了一些消极方面(请阅读this answer)。