输出列表元素更多出现在Prolog中

时间:2017-11-24 17:36:09

标签: prolog

我想写一个查询,它给出了输出更多的列表元素。我不想使用断言谓词。

我写下这个:

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

1 个答案:

答案 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/3max_list/2nth1/3也出现在ECLiPSe序言中occurrences/3maxlist/2nth1/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.