Prolog双向谓词

Prolog双向谓词,prolog,predicate,bidirectional,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(

为了一项任务,我不得不在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).
这个要求使我无法使用。我不能只添加关系
妻子(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
如果您的事实也包括相反的配对,例如:

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). 

我不明白你为什么说链接的答案不可用。虽然没有做任何工作,它不会给你问题的完整答案,但这里使用了所需的原则。没有任何评论就否决这个答案是毫无帮助的。请让我们知道什么是错误的…事实上,它帮助了很多,你提到的那些消极方面在我的情况下并不重要,因为我不需要关于伴侣顺序的额外信息:已婚(约翰,丽莎)和已婚(丽莎,约翰)对我的需求是一样的。我还了解了“术语的标准顺序”:
woman(ann).
man(anton).
married(ann, anton). 
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.