純粹的PROLOG程序以清晰的方式區(qū)分術(shù)語的平等和不平等,但執(zhí)行效率低下;即使所有相關(guān)術(shù)語都是有根據(jù)的。最近的一個例子是這個答案..在這個定義中,所有的答案和失敗都是正確的??紤]:?- 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).雖然程序從聲明性的角度來看是完美無缺的,但它在當(dāng)前系統(tǒng)(如B、SICStus、SWI、YAP)上的直接執(zhí)行是不必要的低效。對于下面的目標(biāo),選擇點將保持打開狀態(tài)每人元素。?- occurrences(a,[a,a,a,a,a],M).
M = [a, a, a, a, a] ;
false.這可以通過使用足夠大的aS如下。您可能需要調(diào)整I這樣,列表仍然可以表示;在SWI中,這意味著第一I必須足夠小,以防止全局堆棧出現(xiàn)資源錯誤,如下所示:?- 24=I,N is 2^I,length(L,N), maplist(=(a),L).
ERROR: Out of global stack2做I必須足夠大以引發(fā)本地堆棧的資源錯誤:?- 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為了克服這個問題,并保留好的聲明性屬性,需要一些比較謂詞。如何定義這個比較謂詞?
術(shù)語等式/不等式的具體化
largeQ
2019-07-13 16:04:32