在Prolog中定义条件
我一直在努力适应Prolog和Horn的条款,但是从形式逻辑的转变仍然感到尴尬和被迫。 我明白,以标准形式提供所有内容是有好处的,但是:
什么是确定的实质条件操作的最佳方式-->
在序言,其中A --> B
成功,当任一A = true
和B = true
OR B = false
? 也就是说, if->then
语句在if
没有else
时为false
时不会fail
。
另外,Horn子句的非显而易见的优势究竟是什么?
在Prolog中定义物质条件操作符 - >的最佳方法是什么?
当A
和B
只是变量绑定到原子true
和false
,这是很容易:
cond(false, _).
cond(_, true).
但总的来说,没有最好的办法,因为Prolog没有提供适当的否定,只有否定,因为失败,这是非单调的。 最接近的实际命题是A
和B
(+ A ; B)
试图证明A
,然后继续B
如果A
不能被证明(这并不意味着它由于封闭世界的假设是假的)。
但是,否定,应在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)时间完成,使其成为一个非常差的排序程序。
另请参阅此问题。
链接地址: http://www.djcxy.com/p/11477.html