逻辑纯度为/ 2和地面/ 1

时间:2015-01-17 15:05:57

标签: prolog logical-purity

问题

我有一个与逻辑纯度相关的问题。

这个节目是纯粹的吗?

when(ground(X), X > 2).

有关上下文的一些[ir]相关详细信息

我试图编写具有良好终止属性的纯谓词。例如,我想编写一个谓词list_length/2来描述列表与其长度之间的关系。我希望实现与内置谓词length/2相同的终止行为。

我的问题试图找出以下谓词是否纯粹:

list_length([], 0).
list_length([_|Tail], N):-
    when(ground(N), (N > 0, N1 is N - 1)),
    when(ground(N1), N is N1 + 1),
    list_length(Tail, N1).

我可以用 ...

实现我的目标
:- use_module(library(clpfd)).
:- set_prolog_flag(clpfd_monotonic, true).

list_length([], 0).
list_length([_|Tail], N):-
    ?(N) #> 0,
    ?(N1) #= ?(N) - 1,
    list_length(Tail, N1).

...或者我可以使用var/1nonvar/1!/0,但后来hard来证明谓词是纯粹的。

list_length([],0).
list_length([_|Tail], N):-
    nonvar(N), !,
    N > 0,
    N1 is N - 1,
    list_length(Tail, N1).
list_length([_|Tail], N):-
    list_length(Tail, N1),
    N is N1 + 1.

1 个答案:

答案 0 :(得分:4)

  

当/ 2和地面/ 1时的逻辑纯度

请注意,ISO内置ground/1nonvar/1一样不纯。 但似乎你在谈论when/2的条件。事实上,when/2的任何可接受的条件都是尽可能纯净的。所以这不仅适用于ground/1

  

这个节目是纯粹的吗?

when(ground(X), X > 2).

是的,就目前的纯洁感而言。也就是说,将library(clpfd)视为纯粹的同一意义。在逻辑编程和Prolog的早期阶段,比如说在20世纪70年代,纯粹的程序只有在成功的情况下才会成功,如果是真的则会失败。没别了。

但是,今天,我们接受ISO errors,就像发出类型错误代替无声失败一样。事实上,从实际的角度来看,这更有意义。想想X = non_number, when(ground(X), X > 2 )。请注意,此错误系统是在Prolog中相对较晚引入的。

虽然Prolog I明确地报告了内置错误 1 ,随后的DEC10-Prolog(例如1978年,1982年)和C-Prolog都没有包含可靠的错误报告系统。相反,打印了一条消息,并且谓词失败,从而将错误与逻辑错误混淆。从这时起,Prolog标志warning(ISO / IEC 13211-1:1995中的7.11.2.4)仍然存在值unknown,导致尝试执行未定义的谓词以打印警告并失败。

所以捕获的地方在哪里?考虑

?- when(ground(X), X> 2), when(ground(X), X < 2).
when(ground(X), X>2),
when(ground(X), X<2).

这些when/2虽然完全正确,但现在为产生不一致作为答案做出了很多贡献。毕竟,上面写着:

  

是的,查询为真,提供同样的查询为真。

将此与SICStus或SWI的library(clpfd)

进行对比
| ?- X #> 2, X #< 2.
no

因此library(clpfd)能够检测到这种不一致性,而when/2必须等到它的参数被打开。

获得这样的条件答案通常非常令人困惑。事实上,许多情况下,许多人更喜欢更平凡的实例化错误,以便稍微清理一下。

对此没有明显的一般答案。毕竟,许多有趣的约束理论是不可判定的。是的,非常无害的library(clpfd)允许你制定不可判定的问题!因此,我们将不得不忍受不包含解决方案的条件答案。

然而,一旦你得到一个纯粹的无条件解决方案,或者一旦你真正失败,你就会知道这会成功。

list_length/2

使用library(clpfd)的定义实际上比w.r.t略好一些。终止比Prolog序言的agreed upon终止。考虑:

?- N in 1..3, list_length(L, N).

此外,目标length(L,L)以非常自然的方式产生类型错误。也就是说,没有任何明确的测试。

使用when/2的版本存在一些“自然”违规行为,例如length(L,0+0)失败但length(L,1+0)成功。否则它似乎很好 - 仅靠建筑。


1)最早的帐户是在G. Battani,H.Meloni的第9页。 Interpréteurdulangage de programmation Prolog。 Rapport de D.E.A.在那里,一个错误的内置被一个从未解决过的目标所取代。在目前的术语加上II-3-6 a的/ 3中,p.13将在当前具有freeze/2的系统中:

plus(X, Y, Z) :-
   (  integer(X), integer(Y), ( var(Z) ; integer(Z) )
   -> Z is X+Y
   ;  freeze(_,erreur(plus(X,Y,Z)))
   ).

所以plus/3不是“多方位”。