在Prolog中定义条件材料

Qui*_*hud 7 logic prolog

我一直试图适应Prolog和Horn条款,但从形式逻辑的过渡仍然感到尴尬和被迫.我知道以标准形式提供所有东西都有好处,但是:

在Prolog中定义材料条件运算符的最佳方法是什么-->,在OR 和OR A --> B时成功?也就是说,是不言的时候是没有的.A = trueB = trueB = falseif->thenfailiffalseelse

真相表

另外,Horn条款的非显而易见的优点究竟什么?

Fre*_*Foo 3

在 Prolog 中定义材质条件运算符 --> 的最佳方法是什么

AB只是绑定到原子true和 的变量时false,这很容易:

cond(false, _).
cond(_, true).
Run Code Online (Sandbox Code Playgroud)

但总的来说,没有最好的方法,因为 Prolog 不提供正确的否定,只提供作为失败的否定,这是非单调的。你能得到的最接近实际的建议A通常B

(\+ A ; B)
Run Code Online (Sandbox Code Playgroud)

它试图证明A,然后继续B如果A 不能被证明(这并不意味着由于封闭世界假设 而它是错误的)。

然而,在 Prolog 中应谨慎使用否定。

另外,霍恩条款的非明显优势到底是什么?

他们有一个简单的程序阅读。Prolog 是一种编程语言,而不是定理证明者。编写具有明确逻辑含义的程序是可能的,但它们仍然是程序。

要了解差异,请考虑经典的排序问题。如果L是一个没有重复的数字列表,那么

sort(L, S) :-
    permutation(L, S),
    sorted(S).
sorted([]).
sorted([_]).
sorted([X,Y|L]) :-
    X < Y,
    sorted([Y|L]).
Run Code Online (Sandbox Code Playgroud)

是按排序顺序S包含 的元素含义的逻辑规范。L然而,它还有一个程序上的含义,即:尝试所有排列,L直到得到一个已排序的排列。在最坏的情况下,这个过程会遍历所有n!排列,尽管排序可以在 O( n lg n ) 时间内完成,这使得它成为一个非常糟糕的排序程序。

另请参阅这个问题