7

我一直在努力适应 Prolog 和 Horn 子句,但是从形式逻辑的过渡仍然感到尴尬和被迫。我知道将所有内容都采用标准格式有很多好处,但是:

在 Prolog 中定义物质条件运算符的最佳方法是什么,其中之一和OR成功?也就是说,没有when的语句没有.-->A --> BA = trueB = trueB = falseif->thenfailiffalseelse

真值表

另外, Horn 子句的不明显优势到底是什么?

4

1 回答 1

3

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

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

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

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

(\+ A ; B)

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

然而,在 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 ) 时间内完成,这使它成为一个非常糟糕的排序程序。

另请参阅此问题

于 2012-11-26T20:06:31.993 回答