我一直试图适应Prolog和Horn条款,但从形式逻辑的过渡仍然感到尴尬和被迫。我知道以标准形式拥有所有东西都有好处,但是:
在Prolog中定义材质条件运算符-->
的最佳方式是什么,其中A --> B
成功A = true
和B = true
或者B = false
?也就是说,if->then
fail
语句在if
为false
时else
没有{{1}}。
另外,究竟是什么 Horn条款的非显而易见的优点?
答案 0 :(得分:3)
定义材质条件运算符的最佳方法是什么?>在Prolog
当A
和B
只是要绑定到原子true
和false
的变量时,这很容易:
cond(false, _).
cond(_, true).
但总的来说,没有最好的方法,因为Prolog没有提供适当的否定,只有negation as failure,这是非单调的。与实际命题A
和B
最接近的通常是
(\+ 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 )时间内完成,使其成为一个非常糟糕的排序程序。