Prolog 双向谓词

标签 prolog predicate bidirectional

我必须在 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/

相关文章:

math - 序言中的幂函数

prolog - 编辑 Prolog 程序输出计算结果

java - 用于表达测试一个 `Predicate` 是否比另一个 `Predicate` 更严格的操作的 API?

java - 使用泛型和继承来谓词 java 8

java - Hibernate OneToMany 双向关系很慢

Prolog - 没有返回所需的值

Prolog 检查列表是否严格递减序列

sql - 在内连接条件之前过滤表

oracle - 无向图中的最小 ID

java - Java 中的双向关系