Prolog 双向谓词

Sav*_*ava 5 predicate prolog bidirectional

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

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

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

?- married(X,john).
false.
Run Code Online (Sandbox Code Playgroud)

如何使这个谓词以两种方式起作用?如果约翰嫁给了丽莎,那么丽莎也嫁给了约翰。

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

man(john).
woman(lisa).
parent(john,steve).
parent(lisa,steve).
married(john,lisa).
Run Code Online (Sandbox Code Playgroud)

这个要求使得这个解决方案对我来说无法使用。我不能只添加关系,wife(lisa,john).因为我必须自己定义妻子、丈夫等。

wife(X,Y) :- woman(X),married(X,Y).
Run Code Online (Sandbox Code Playgroud)

tri*_*elt 0

如果您无法添加辅助关系(听起来像家庭作业),请尝试使用@<对“标准术语顺序”进行操作的谓词:

married(A,B) :- A @< B, married(B,A).
Run Code Online (Sandbox Code Playgroud)

但请注意,此解决方案也带来了一些负面影响(请阅读此答案)。