【发布时间】:2017-07-18 11:06:54
【问题描述】:
这是一个基本的 Prolog 问题。我正在尝试实现可能像这样非正式表达的推理:
x(X) 为真的(必要但不充分)条件是 a(X) 和 b(X) 必须成立。我们知道 x(mary)。 x(mary) 必须满足这些条件。 是的情况。因此 a(mary) 和 b(mary) 都是真的。
以下代码显然没有符合我的想法:
a(jim).
b(jack).
x(X) :- a(X), b(X).
x(mary).
如果我现在问 a(mary),Prolog 会回答否。
我很确定我理解它为什么会这样回答。我只是不知道如何正确实现我想要的。
更新:
上面的例子被简化了。在我正在处理的实际问题中,a 和 b 交织在一起。而不是x(X) :- a(X), b(X).,我实际上有r(A,B,C) :- p(A,D), p(C,E), a(D,n), a(E,c), s(B,E,F,2), s(C,E,D,1), s(C,E,F,1).。也就是说,要使r(A,B,C) 成立,右边的所有相互关联的条件必须一起。现在用一系列规则p(A,D) :- r(A,B,C). a(D,n) :- r(A,B,C).等等来代替它似乎不太合适,因为据我了解,p(A,D)中的D不再与D中的相同a(D,n),这些现在是完全独立的规则。我可以在(演绎的)自动定理证明器中轻松实现我想要的推理,用于一阶逻辑,我比 Prolog 更熟悉。
另一个例子。考虑这个 Prolog 代码:
breathable(X) :- part(X,Y), atom(Y,o).
part(air,oxygen).
breathable(air).
空气是透气的。空气中含有氧气。我想推断atom(oxygen,o)。但 Prolog 会回答不。
【问题讨论】:
标签: prolog