我想写一个查询,它给出了输出更多的列表元素。我不想使用断言谓词。
我写下这个:
count([],_,0).
count([H|T],H,X):-
count(T,H,X2),
X is X2 + 1.
count([_|T],H,X):-
count(T,H,X).
ff(_,[A],A).
ff(L,[X|T],X):-
ff(L,T,X2),
count(L,X,C1),
count(L,X2,C2),
C1 > C2.
ff(L,[H|T],X):-
ff(L,T,X),
count(L,H,C1),
count(L,X,C2),
C1 =< C2.
find_element(L,X):-
ff(L,L,X).
但它在输出中始终是列表的第一个元素。例如:
- ?find_element([A,B,C,B,d],X)
X = a
答案 0 :(得分:1)
使用SWI prolog,快速实现可能是:
compute([],_,[]).
compute([H|T],List,[HS|TS]):-
occurrences_of_term(H, List, Occ),
HS = Occ,
compute(T,List,TS).
max_occ(List,Occurrences,Value):-
length(List,N),
length(Support,N),
compute(List,List,Support),
max_list(Support,Occurrences),
nth1(Index,Support,Occurrences),
nth1(Index,List,Value),!.
谓词occurrences_of_term/3
,max_list/2
和nth1/3
也出现在ECLiPSe序言中occurrences/3
,maxlist/2
和nth1/3
。
一些疑问:
?-max_occ([1,2,1,2,1,1,2,2,3,2,2],Occ,Val).
Occ = 6, Val = 2.
?-max_occ([1,2,1,2,1,1,2,1,1,2,2],Occ,Val).
Occ = 6, Val = 1.