术语等式/不等式的具体化

纯粹的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 stack

2做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

为了克服这个问题,并保留好的声明性属性,需要一些比较谓词。



如何定义这个比较谓词?



largeQ
浏览 508回答 3
3回答

茅侃侃

首先,名称应该更具有声明性,比如equality_truth/2.
打开App,查看更多内容
随时随地看视频慕课网APP