我对这些事情很陌生。希望这不是一个非常天真的问题。
我在Prolog中尝试了以下公式: A⇒B
如果 B 为真,我会评估 A ,然后显示为FALSE。
我的问题是为什么错了? (为什么不是TRUE?)鉴于目前的信息,我们对 B 一无所知。 Prolog是否基于这样的假设:对于任何未知的东西,它输出FALSE?
如果这是一个假设,这有多常见?
我想到的另一件事是,它找到了对输入查询和公理(基本上是SAT求解)的结合的赋值。由于结果输出为TRUE,无论 A 具有什么值,它只是随机选择一个(或默认为零?)。
基于一阶逻辑的属性,它是半可否的。如果句子 A 在逻辑上暗示句子 B ,则可以发现这一点,但不是相反。那么,当没有TRUTH证据时,如何在实践中处理后一种情况?
PS1。关于Prolog如何工作的一点解释也可能有用。它是否使用SAT求解器作为黑盒子?还是贪婪的搜索算法?
答案 0 :(得分:2)
Prolog的工作原理是假设对于任何未知的东西,它会输出FALSE吗?
是的,确实如此。此行为反映了Closed-World Assumption (CWA),如果事实未明确说明,则视为错误。
如果这是一个假设,这有多常见?
很常见 - 大多数数据库都使用这种假设。
您可以帮助您了解Prolog的推理方法:SLD Resolution。
答案 1 :(得分:0)
要在Prolog中进行不确定性推理,您可以为three-valued logic编写解释器。在此解释器中,真值是true
,false
和unknown
:
:- 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)
" 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(!)方法更复杂。
再见