纯粹的PROLOG程序以清晰的方式区分术语的平等和不平等,但执行效率低下;即使所有相关术语都是有根据的。最近的一个例子是这个答案..在这个定义中,所有的答案和失败都是正确的。考虑:?- Es = [E1,E2], occurrences(E, Es, Fs).
Es = Fs, Fs = [E, E],
E1 = E2, E2 = E ;
Es = [E, E2],
E1 = E,
Fs = [E],
dif(E, E2) ;
Es = [E1, E],
E2 = E,
Fs = [E],
dif(E, E1) ;
Es = [E1, E2],
Fs = [],
dif(E, E1),
dif(E, E2).虽然程序从声明性的角度来看是完美无缺的,但它在当前系统(如B、SICStus、SWI、YAP)上的直接执行是不必要的低效。对于下面的目标,选择点将保持打开状态每人元素。?- occurrences(a,[a,a,a,a,a],M).
M = [a, a, a, a, a] ;
false.这可以通过使用足够大的aS如下。您可能需要调整I这样,列表仍然可以表示;在SWI中,这意味着第一I必须足够小,以防止全局堆栈出现资源错误,如下所示:?- 24=I,N is 2^I,length(L,N), maplist(=(a),L).
ERROR: Out of global stack2做I必须足够大以引发本地堆栈的资源错误:?- 22=I,N is 2^I,length(L,N), maplist(=(a),L), ( Length=ok ; occurrences(a,L,M) ).
I = 22,
N = 4194304,
L = [a, a, a, a, a, a, a, a, a|...],
Length = ok ;
ERROR: Out of local stack为了克服这个问题,并保留好的声明性属性,需要一些比较谓词。如何定义这个比较谓词?
添加回答
举报
0/150
提交
取消