所以我刚刚开始在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)
它的工作?任何可以表示为事实的双边关系都是如此.
你是说这种关系是自动对称的吗?然后没有 - 假设你有一个有向图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) -> .....