如何在prolog中陈述一个事实什么在两种方式中都起作用?

如何在prolog中陈述一个事实什么在两种方式中都起作用?,prolog,Prolog,在Prolog中执行此操作的正确方法是什么: 杰克和艾米结婚了 married(jake, amy). 这份声明说杰克和艾米结婚了,但艾米没有和杰克结婚。 所以为了解决这个问题,我想加上这个 married(amy, jake). 但这感觉是多余的,可能会打乱一些搜索 还有其他方法吗?您可以编写一个helper谓词partner/2来执行此操作: partner(X,Y):- married(X,Y). partner(X,Y):- married(Y,X). 或更短: partner(X

在Prolog中执行此操作的正确方法是什么:

杰克和艾米结婚了

married(jake, amy).
这份声明说杰克和艾米结婚了,但艾米没有和杰克结婚。 所以为了解决这个问题,我想加上这个

married(amy, jake).
但这感觉是多余的,可能会打乱一些搜索


还有其他方法吗?

您可以编写一个helper谓词partner/2来执行此操作:

partner(X,Y):- married(X,Y).
partner(X,Y):- married(Y,X).
或更短:

partner(X,Y):- married(X,Y) ; married(Y,X).
给出输出

?- partner(X,Y).
X = jake,
Y = amy ;
X = amy,
Y = jake ;
false.
但是,如果您这样定义它:

mar(jake, amy).
mar(X,Y):- mar(Y,X).
在一个不幸的星座中调用时,您可能会陷入无限循环

?- mar(X,Y).
X = jake,
Y = amy ;
X = amy,
Y = jake ;
X = jake,
Y = amy ;
...

您可以编写一个助手谓词partner/2来执行此操作:

partner(X,Y):- married(X,Y).
partner(X,Y):- married(Y,X).
或更短:

partner(X,Y):- married(X,Y) ; married(Y,X).
给出输出

?- partner(X,Y).
X = jake,
Y = amy ;
X = amy,
Y = jake ;
false.
但是,如果您这样定义它:

mar(jake, amy).
mar(X,Y):- mar(Y,X).
在一个不幸的星座中调用时,您可能会陷入无限循环

?- mar(X,Y).
X = jake,
Y = amy ;
X = amy,
Y = jake ;
X = jake,
Y = amy ;
...