2

我对这些东西很陌生。希望这不是一个非常幼稚的问题。

我在 Prolog 中尝试了以下公式:A ⇒ B

并且鉴于B是真的,我评估A并且它说 FALSE。

我的问题是为什么 FALSE?(为什么不是 TRUE?)鉴于当前信息,我们对B一无所知。Prolog 是否基于以下假设工作​​:对于任何未知事物,它会输出 FALSE?

如果这是一个假设,这有多普遍?

想到的另一件事是,它正在寻找输入查询和公理的结合的分配(基本上是 SAT 求解)。由于结果输出为 TRUE,无论A有什么值,它只是随机选择一个(或默认为零?)。

基于一阶逻辑的性质,它是半可判定的。如果一个句子A 在逻辑上暗示了一个句子B,那么这可以被发现,但反过来就不行。那么,在没有 TRUTH 证明的情况下,后一种情况在实践中是如何处理的呢?

PS1。关于 Prolog 如何工作的一点解释,也可能有用。它是否使用 SAT 求解器作为黑匣子?还是贪心搜索算法?

在此处输入图像描述

4

2 回答 2

3

Prolog 是否基于以下假设工作​​:对于任何未知事物,它会输出 FALSE?

是的,确实如此。此行为反映了封闭世界假设 (CWA),即如果未明确说明事实,则将其视为错误。

如果这是一个假设,这有多普遍?

很常见——大多数数据库都使用这个假设。

它可以帮助您了解 Prolog 的推理方法:SLD 解析

于 2014-08-11T05:28:28.787 回答
0

为了推理 Prolog 中的不确定性,您可以为三值逻辑编写一个解释器。在这个解释器中,真值是truefalseunknown

:- initialization(main).
main :-
    three_valued_logic(((true,false);unknown),Result),
    writeln(Result).

three_valued_logic(true,true).
three_valued_logic(false,false).
three_valued_logic(unknown,unknown).
three_valued_logic(not(A),false) :-
    three_valued_logic(A,true).
three_valued_logic(not(A),true) :-
    three_valued_logic(A,false).
three_valued_logic(not(A),unknown):-
    three_valued_logic(A,unknown).
three_valued_logic((A,B),true) :-
    three_valued_logic([A,B],[A1,B1]),
    (A1==true;B1==true).
three_valued_logic((A,B),false) :-
    three_valued_logic([A,B],[A1,B1]),
    (A1==false;B1==false).
three_valued_logic((A,B),unknown) :-
    three_valued_logic([A,B],[A1,B1]),
    (A1==unknown;B1==unknown).
three_valued_logic((A;B),unknown) :-
    three_valued_logic([A,B],[A1,B1]),
    (A1==unknown;B1==unknown),(A1==false;B1==false).
three_valued_logic((A;B),false) :-
    three_valued_logic([A,B],[A1,B1]),
    (A1==false,B1==false).
three_valued_logic((A;B),true) :-
    three_valued_logic([A,B],[A1,B1]),
    (A1==true;B1==true).
three_valued_logic([],[]).
three_valued_logic([A|B],[A1|B1]) :-
    three_valued_logic(A,A1),three_valued_logic(B,B1).

在这个例子中,真值((true,false);unknown)unknown,,而是。(false,unknown)false

于 2019-05-22T22:29:27.550 回答