在Prolog中定义条件

我一直在努力适应Prolog和Horn的条款,但是从形式逻辑的转变仍然感到尴尬和被迫。 我明白,以标准形式提供所有内容是有好处的,但是:

什么是确定的实质条件操作的最佳方式-->在序言,其中A --> B成功,当任一A = trueB = true OR B = false ? 也就是说, if->then语句在if没有else时为false时不会fail

另外,Horn子句的非显而易见的优势究竟是什么?


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

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

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

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

(+ 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

上一篇: Defining the material conditional in Prolog

下一篇: Memory leak using tornado's gen.engine