我必须在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).
答案 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)。