我一直在努力适应 Prolog 和 Horn 子句,但是从形式逻辑的过渡仍然感到尴尬和被迫。我知道将所有内容都采用标准格式有很多好处,但是:
在 Prolog 中定义物质条件运算符的最佳方法是什么,其中之一和OR成功?也就是说,没有when的语句没有.-->
A --> B
A = true
B = true
B = false
if->then
fail
if
false
else
另外, Horn 子句的不明显优势到底是什么?
在Prolog中定义物质条件运算符的最佳方法是什么-->
当A
和B
只是与原子true
和绑定的变量时false
,这很容易:
cond(false, _).
cond(_, true).
但总的来说,没有最好的方法,因为 Prolog 没有提供适当的否定,只有作为 failure的否定,这是非单调的。最接近实际命题的A
,B
通常是
(\+ A ; B)
它试图证明A
,然后继续B
ifA
不能被证明(这并不意味着由于封闭世界假设它是错误的)。
然而,在 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 ) 时间内完成,这使它成为一个非常糟糕的排序程序。
另请参阅此问题。