本人刚接触prolog, 作业中有道题是计算数组中一样的元素(或数字).
如:
?-compress([3,3,3,1,1,2,2,2,2,3,3,4],L).
ans:
L=[[1,1],[2,4],[3,5],[4,1]]
Yse.
我的思路是先将数组进行排序, 再统计一样的数码.但怎么也不能得出满意的结果.
以下是我的一些程序片短,大多是书上找来的.
排序部分, 我用bubble sort
bubble_sort(List,Sorted):-b_sort(List,[],Sorted).
b_sort([],Acc,Acc).
b_sort([H|T],Acc,Sorted):-bubble(H,T,NT,Max),b_sort(NT,[Max|Acc],Sorted).
bubble(X,[],[],X).
bubble(X,[Y|T],[Y|NT],Max):-X>Y,bubble(X,T,NT,Max).
bubble(X,[Y|T],[X|NT],Max):-X=<Y,bubble(Y,T,NT,Max).
?-bubble_sort([3,3,3,1,1,2,2,2,2,3,3,4],L),write("L="),write(L),nl.
Output:
L=[1,1,2,2,2,2,3,3,3,3,3,4]
Yes. 这部分应该没问题.
这是合并部分, 将相同数字放入同一数组中
Pack code:
pack([],[]).
pack([X|Xs],[Z|Zs]) :- transfer(X,Xs,Ys,Z), pack(Ys,Zs).
% transfer(X,Xs,Ys,Z) Ys is the list that remains from the list Xs
% when all leading copies of X are removed and transfered to Z
transfer(X,[],[],[X]).
transfer(X,[Y|Ys],[Y|Ys],[X]) :- X \= Y.
transfer(X,[X|Xs],Ys,[X|Zs]) :- transfer(X,Xs,Ys,Zs).
?-pack([3,3,3,1,1,2,2,2,2,3,3,4],L),write("L="),write(L),nl.
Output:
L=[[3,3,3],[1,1],[2,2,2,2],[3,3],[4]]
Yes. 看来这部分也应该没问题.
第三步,浓缩部分,只找到下面的code,要用到第二步的内容:
Example:
?- encode([a,a,a,a,b,c,c,a,a,d,e,e,e,e],X).
X = [[4,a],[1,b],[2,c],[2,a],[1,d][4,e]]
% encode(L1,L2) :- the list L2 is obtained from the list L1 by run-length
% encoding. Consecutive duplicates of elements are encoded as terms [N,E],
% where N is the number of duplicates of the element E.
% (list,list) (+,?)
:- ensure_loaded(第二步的内容).
encode(L1,L2) :- pack(L1,L), transform(L,L2).
transform([],[]).
transform([[X|Xs]|Ys],[[N,X]|Zs]) :- length([X|Xs],N), transform(Ys,Zs).
因为星期一就要交作业了, 所以还请懂行高手帮帮忙, 如果需要prolog程序, 可以去 http://www.dobrev.com/ 去下载一个, 2M多一点,是个绿色自解压软件,不用安装.
先谢谢了