这里是你如何能做到这一点,保存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