在Prolog中定义条件材料

时间:2012-11-26 19:46:44

标签: prolog logic

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

在Prolog中定义材质条件运算符-->最佳方式是什么,其中A --> B成功A = trueB = true或者B = false?也就是说,if->then fail语句在iffalseelse没有{{1}}。

truth table

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

1 个答案:

答案 0 :(得分:3)

  

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

AB只是要绑定到原子truefalse的变量时,这很容易:

cond(false, _).
cond(_, true).

但总的来说,没有最好的方法,因为Prolog没有提供适当的否定,只有negation as failure,这是非单调的。与实际命题AB最接近的通常是

(\+ A ; B)

试图证明A,然后如果B 无法证明则继续A(这并不意味着由于closed-world assumption)。

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

  

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

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

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

sort(L, S) :-
    permutation(L, S),
    sorted(S).
sorted([]).
sorted([_]).
sorted([X,Y|L]) :-
    X < Y,
    sorted([Y|L]).

S按排序顺序包含L元素的含义的逻辑规范。但是,它也有一个程序意义,即:尝试L的所有排列,直到你有一个它排序的排列。在最坏的情况下,此过程贯穿所有 n !排列,即使排序可以在O( n lg n )时间内完成,使其成为一个非常糟糕的排序程序。

另见this question