我必须在 Prolog 中创建家庭关系才能完成任务,我偶然发现了这个问题。
man(john).
woman(lisa).
married(john,lisa).
?- married(john,X).
X = lisa.
?- married(X,john).
false.
如何使这个谓词以两种方式工作?
如果约翰嫁给了丽莎,那么丽莎就嫁给了约翰。
对于事实,我只能使用性别、 parent 和已婚:
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,而不是尝试使已婚/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.
关于Prolog 双向谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329193/