-1

我试图在 Prolog 中做一个这样的练习:我介绍了这个列表[10,20, 10, 20, 30],程序显示:

10 - 2 time; 20 - 2 times; 30 - 1 times.

这是我的代码:

conta(_,[], 0).
conta(X, [X|T], N) :-   conta(X,T, N2), N is N2 + 1 . 
conta(X, [Y|T], N) :-  X \= Y,   conta(X,T,N).  

aux([],[]).
aux([X|L],L1):-conta(X,L1,C),write(X),write(C), write('vezes'),aux(L,L1).

但结果是这样的:

10 - 2times  20 -2time 10-2times 20-2times 30-1 time
false.

他向元素显示元素在列表中的次数。任何帮助,请!

4

1 回答 1

1

在您的问题陈述中,您将纯关系与副作用穿插在一起。虽然您可以通过这种方式解决问题,但您只会看到 Prolog 的一些有趣属性。相反,尝试将您的问题表述为纯关系。所以想象一下,你已经实现了它,并为它制定了一些查询:

?- list_vezes([10,20, 10, 20, 30], [10-2,20-2,30-1]).
true.

以下解决方案计算并删除相应的元素。它有一些 n 2运行时。

list_vezes([], []).
list_vezes([E|Es1], [E-N|Vezes]) :-
   n_occ(E, Es1,Es2, 1,N),
   list_vezes(Es2, Vezes).

n_occ(_, [],[], N,N).
n_occ(E, [E|Es0],Es, N0,N) :-
   N1 is N0+1,
   n_occ(E, Es0,Es, N1,N).
n_occ(E, [F|Es0],[F|Es], N0,N) :-
   dif(F,E),
   n_occ(E, Es0,Es, N0,N).

在许多 Prolog 系统中是内置的。如果没有,请参阅链接怎么办。

现在,如果您仍想打印出您所说的文本,您可以使用这个新列表执行此操作:

printitem(E-N) :-
   writeq(E-N), write(' times\n').


compter_et_imprimer(L) :-
   list_vezes(L, Vezes),
   maplist(printitem, Vezes).
于 2014-06-13T14:51:54.323 回答