這裏是你如何能做到這一點,保存logical-purity!
在下文中,我們使用元謂詞(splitlistIfAdj/3
, tfilter/3
和 maplist/3
)和物化長期等號/不等謂詞((=)/3
和dif/3
)。
讓我們E = a
和Xs0 = [a,a,a,b,a,b,a,a,b,a,a,a,a]
,並建立count/3
一步一步:
首先,讓Xs1
包含運行項目在Xs0
:
?- Xs0 = [a,a,a,b,a,b,a,a,b,a,a,a,a], splitlistIfAdj(dif,Xs0,Xs1).
Xs0 = [ a,a,a, b, a, b, a,a, b, a,a,a,a ],
Xs1 = [[a,a,a],[b],[a],[b],[a,a],[b],[a,a,a,a]].
運行Xs1
名單包含全部運行。假設Xs2
只包含我們感興趣的產品:
?- Xs1 = [[a,a,a],[b],[a],[b],[a,a],[b],[a,a,a,a]], tfilter(\[X|_]^(X=a),Xs1,Xs2).
Xs1 = [[a,a,a],[b],[a],[b],[a,a],[b],[a,a,a,a]],
Xs2 = [[a,a,a], [a], [a,a], [a,a,a,a]].
幾乎完成!最後,我們繪製Xs2
(的E
-runs列表)到相應的運行長度Xs
:
?- Xs2 = [[a,a,a],[a],[a,a],[a,a,a,a]], maplist(length,Xs2,Xs).
Xs2 = [[a,a,a],[a],[a,a],[a,a,a,a]],
Xs = [ 3, 1, 2, 4].
現在,讓我們把它放在一起!
count(E,Xs0,Xs) :-
splitlistIfAdj(dif,Xs0,Xs1),
tfilter(E+\[X|_]^(X=E),Xs1,Xs2), % works for _any_ item E
maplist(length,Xs2,Xs).
讓我們運行一些查詢:
?- count(a,[a,a,a,a,b,a,a,a],Xs).
Xs = [4,3]. % succeeds deterministically
?- count(a,[a,a,a,b,a,b,a,a,b,a,a,a,a],Xs).
Xs = [3,1,2,4]. % succeeds deterministically
由於代碼單調,我們得到更普遍的查詢邏輯的聲音回答,太:
?- count(E,[a,a,a,b,a,b,a,a,b,a,a,a,a],Xs).
Xs = [3,1,2,4], E = a ;
Xs = [1,1,1], E = b ;
Xs = [], dif(E,a), dif(E,b) .
你的問題相當模糊,所以我只給出一個提示:使用4個參數而不是3:2作爲輸入,1作爲輸出,1作爲當前麻木呃找到的元素(初始爲0)。 – Steven 2014-10-17 03:50:28
@Kay,實際上我輸入的列表只包含兩個不同的元素,我想計算一個,如果它,結果應該只計算該元素。例如輸入計數(a,[a,a,a,b,a,b,a,a,b,a,a,a,a],X)。並輸出 X = [3,1,2,4] – 2014-10-17 08:35:56