在实践中第一顺序逻辑,如何处理不可判断性?

时间:2014-08-09 05:53:38

标签: prolog logic computation decidable

我对这些事情很陌生。希望这不是一个非常天真的问题。

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

如果 B 为真,我会评估 A ,然后显示为FALSE。

我的问题是为什么错了? (为什么不是TRUE?)鉴于目前的信息,我们对 B 一无所知。 Prolog是否基于这样的假设:对于任何未知的东西,它输出FALSE?

如果这是一个假设,这有多常见?

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

基于一阶逻辑的属性,它是半可否​​的。如果句子 A 在逻辑上暗示句子 B ,则可以发现这一点,但不是相反。那么,当没有TRUTH证据时,如何在实践中处理后一种情况?

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

enter image description here

3 个答案:

答案 0 :(得分:2)

  

Prolog的工作原理是假设对于任何未知的东西,它会输出FALSE吗?

是的,确实如此。此行为反映了Closed-World Assumption (CWA),如果事实未明确说明,则视为错误。

  

如果这是一个假设,这有多常见?

很常见 - 大多数数据库都使用这种假设。

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

答案 1 :(得分:0)

要在Prolog中进行不确定性推理,您可以为three-valued logic编写解释器。在此解释器中,真值是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

答案 2 :(得分:-1)

纯粹的Prolog并没有使用封闭的世界假设。因此,如果 你得到了答案" false"或"不",这意味着不可导出。 或象征性地书写:

" false"的含义或"不"纯粹的Prolog:

~ (Database |- Query)              (i)

这并不意味着可以推导出Query的否定。 所以一个答案" false"或者" no",并不代表符号:

" false"错误的含义或"不"纯粹的Prolog:

Database |- ~Query                 (ii)

有一些运算符,例如否定为失败(+)/ 1,其中 允许Prolog翻译从(i)移动到(ii)。但是这个 不再是纯粹的Prolog,而是在引擎盖下(例如)(+)/ 1 可以用不合逻辑的运算符实现,例如cut(!)。

是的,剪切(!)不再是纯粹的Prolog,它不是声明性的。 例如,作为失败(+)/ 1的否定实现如下:

\+ X  :- X, !, fail.
\+ _.

否定因为失败会导致意义转移等问题 参数是否被实例化。还有其他方法 为Prolog程序添加负面知识,但在普通程序中找不到 Prolog解释器,因为它们比cut(!)方法更复杂。

再见