【问题标题】:Deduction in PrologProlog中的演绎
【发布时间】: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


    【解决方案1】:

    在您的 breathable 示例中,您需要添加一条规则:

    atom(X, Y) :- breathable(Y), part(Y, X).
    

    如果没有这条规则,它的逻辑就不会在您现有的规则库和事实架构中隐含且始终如一。在某种程度上,它与您现有的规则相反。从纯粹逻辑的角度来看,蕴涵的反面并不一定因为原始蕴涵为真而成立。在给出的简单示例中,atom(oxygen, o) 的真实性是由现有规则 plus 当前可用的特定事实的逆向确定的。这基本上是 abduction 逻辑的一种形式,而不是您的问题标题所暗示的 deduction。如果没有新的atom/2 规则,如果稍后添加新的part 事实而不更改事实架构,那么该溯因过程可能会导致示例查询失败或不可证明,与当前结果不同。所以没有明确的规则是不可靠的。

    【讨论】:

    • 您的回答很有帮助,谢谢。让我困惑的是,我可以使用纯粹的演绎(不涉及绑架)获得想要的结果(例如,手工)。从句子 1. forall XY: Breathable(X) -> (part(X,Y) and atom(Y,o)) 2. part(air,oxygen) 3. Breathable(air) 来看,它首先纯粹演绎-顺序逻辑 4. atom(oxygen,o)。我怀疑这与您的最后两句话有关,我不完全理解。可以举个例子吗?
    • @VelvetGhost 因为您混合了事实和规则,所以您可以“推断”,但前提是您假设您当前可用的事实是您的完整事实集。我(很差地)试图在我的回答中解释说,如果增加事实,扣除可能会改变。如果严格从规则的角度来看,没有附加规则就无法推断出你想要的结果。
    • 谢谢。接受了这个答案。我使用 Prolog 代码实现了一个溯因逻辑编程系统来获得我想要的。
    • @VelvetGhost 我希望我的回答对您有所帮助。您可以发布您的解决方案作为答案,如果您愿意,也可以接受您自己的答案!
    【解决方案2】:

    你可能想错了。目前您已经写了:“x(X) 持有给定a(X)b(X) 持有,或者Xmary”。

    不是相反的方式。如果你想写:“a(A) 持有给定AjimX(A)”,你应该写:

    a(jim).
    a(A) :-
        x(A).
    

    所以你可能想写:

    a(jim).
    a(A) :-
        x(A).
    
    b(jack).
    b(B) :-
        x(B).
    
    x(mary).
    

    【讨论】:

    • 这适用于我给出的简化示例,但通常不会做我想要的。请参阅更新的问题。谢谢。
    【解决方案3】:

    “x(mary) 必须满足这些条件。事实就是这样。因此 a(mary) 和 b(mary) 都为真。”

    让我们用代码来表达,好吗?

    a(X) :- x(X).
    b(X) :- x(X).
    

    这应该会产生预期的结果。

    【讨论】:

    • 这适用于我给出的简化示例,但通常不会做我想要的。请参阅更新的问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2023-03-28
    • 2019-11-04
    相关资源
    最近更新 更多