純粹的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
提交
取消
