我是Prolog的新手,并尝试使用Lists进行一些编程,
我想这样做:
?- count_occurrences([a,b,c,a,b,c,d], X).
X = [[d, 1], [c, 2], [b, 2], [a, 2]].
这是我的代码,我知道它不完整,但是我正在尝试:
count_occurrences([],[]).
count_occurrences([X|Y],A):-
occurrences([X|Y],X,N).
occurrences([],_,0).
occurrences([X|Y],X,N):- occurrences(Y,X,W), N is W + 1.
occurrences([X|Y],Z,N):- occurrences(Y,Z,N), X\=Z.
我的代码是错误的,所以我需要一些帮助或帮助。
这是我使用bagof/3
和的解决方案findall/3
:
count_occurrences(List, Occ):-
findall([X,L], (bagof(true,member(X,List),Xs), length(Xs,L)), Occ).
一个例子
?- count_occurrences([a,b,c,b,e,d,a,b,a], Occ).
Occ = [[a, 3], [b, 3], [c, 1], [d, 1], [e, 1]].
怎么运行的
bagof(true,member(X,List),Xs)
满足对于列表中的每个独特的元素X
与Xs
是与它的长度的列表等于出现的次数X
中List
:
?- bagof(true,member(X,[a,b,c,b,e,d,a,b,a]),Xs).
X = a,
Xs = [true, true, true] ;
X = b,
Xs = [true, true, true] ;
X = c,
Xs = [true] ;
X = d,
Xs = [true] ;
X = e,
Xs = [true].
外部findall/3
collects元素X
和Xs
代表解决方案的列表中关联列表的长度。
编辑I:由于CapelliC和Boris的建议,原始答案得到了改善。
编辑II:setof/3
可以代替findall/3
给定列表中是否有可用变量。问题setof/3
在于,对于空列表它将失败,因此必须引入一个特殊子句。
count_occurrences([],[]).
count_occurrences(List, Occ):-
setof([X,L], Xs^(bagof(a,member(X,List),Xs), length(Xs,L)), Occ).
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句