问题
我有一个与逻辑纯度相关的问题。
这个节目是纯粹的吗?
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).
我可以用clpfd ...
实现我的目标:- 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/1
,nonvar/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.
答案 0 :(得分:4)
当/ 2和地面/ 1时的逻辑纯度
请注意,ISO内置ground/1
与nonvar/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
不是“多方位”。