所以我刚刚开始编程PROLOG(SWI发行版)。我有很好的逻辑基础,我熟悉事实,规则,量化和所有词汇。
据我所知,您可以定义一个事实,例如:
married(a,b).
我知道如果您进行如下查询:
?: married(X,b).
答案是“a”。我的问题是,如果我想制定一个使用先前声明的事实的规则,它会认为“a与b结婚”,但它是否会认为“b与a结婚”或者我是否必须声明另一个事实像:
married(b,a).
让它起作用?对于任何可以表现为事实的双边关系都是如此。
答案 0 :(得分:5)
你的意思是关系是自动对称的吗?然后没有 - 假设你有一个带有edge(a,b)
的有向图,那么你不希望推断出另一个方向edge(b,a)
。那么,大于2的arity的关系呢?
您始终可以创建谓词的对称闭包:
r_sym(X,Y) :-
r(X,Y).
r_sym(X,Y) :-
r(Y,X).
使用新的谓词名称可防止无限派生链r(X,Y) -> r(Y,X) -> r(X,Y) -> ....
。