如何在序言中陈述事实?什么对两种方式都有效



在Prolog中这样做的正确方法是什么:

"杰克和艾米结婚了">

married(jake, amy).

这个声明说杰克和艾米结婚了,但不是艾米和杰克结婚了。所以为了解决这个问题,我想添加这个

married(amy, jake).

但这感觉是多余的,可能会打乱一些搜索。

还有别的办法吗?

您可以编写一个辅助谓词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 ;
...

最新更新