在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 ;
...