PROLOG的事实是双边的吗?

Jul*_*cia 1 prolog

所以我刚刚开始在PROLOG(SWI发行版)中编程.我有很好的逻辑基础,我熟悉事实,规则,量化和所有词汇.

据我所知,您可以定义一个事实,例如:

married(a,b).
Run Code Online (Sandbox Code Playgroud)

而且我知道如果您进行如下查询:

?: married(X,b).
Run Code Online (Sandbox Code Playgroud)

答案是"a".我的问题是,如果我想制定一个使用先前声明的事实的规则,它会认为"a与b结婚",但它是否会认为"b与a结婚"或者我是否必须声明另一个事实喜欢:

married(b,a).
Run Code Online (Sandbox Code Playgroud)

它的工作?任何可以表示为事实的双边关系都是如此.

lam*_*y.x 5

你是说这种关系是自动对称的吗?然后没有 - 假设你有一个有向图edge(a,b),那么你不希望edge(b,a)推断出另一个方向.那么,大于2的arity关系怎么样?

您始终可以创建谓词的对称闭包:

r_sym(X,Y) :-
  r(X,Y).
r_sym(X,Y) :-
  r(Y,X).
Run Code Online (Sandbox Code Playgroud)

使用新的谓词名称可以防止无限的派生链r(X,Y) -> r(Y,X) -> r(X,Y) -> .....