Mercurial > hg > Applications > Tokio
view Examples/sorter/pipe_sort @ 0:cfb7c6b24319
Initial revision
author | kono |
---|---|
date | Thu, 30 Aug 2007 14:57:44 +0900 |
parents | |
children |
line wrap: on
line source
test :- Strdata = [10,20,5,100,1,6,2,3], datagen(Strdata,Data), pipe(Data,Out), length(18), #write(Out). % Data Generator datagen([],[]). datagen([H|T],Out) :- Out = [H], @T = T, @datagen(T,Out). % Pipeline Merge Sorter pipe(I0,Out) :- I1 = [], I2 = [], Out = [], proc_start(I0,I1, 2,1), proc_start(I1,I2, 4,2), proc_start(I2,Out,8,4). % Processor Unit proc_start(I,O,P,PP) :- X = [], Y = [], Z = [], T = 1, #proc(I,O,X,Y,Z,T,P,PP). proc(I,O,X,Y,Z,T,P,PP) :- X=[],Y=[],I=[],!, @X=X, @Y=Y, @Z=Z, @O=[], @T=1. proc(I,O,X,Y,Z,T,P,PP) :- load(I,O,X,Y,Yn,Z,Zn,T,P,PP), merge(I,O,X,Y,Yn,Z,Zn,T,P,PP). load(I,O,X,Y,Yn,Z,Zn,T,P,PP) :- T=<PP, !, append(Z,I,Zn), @Z=Zn, Yn=Y, @T=T+1. load(I,O,X,Y,Yn,Z,Zn,T,P,PP) :- append(Y,I,Yn), @Z=[], (if T<P then @T=T+1 else @T=1). merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :-X=[],Yn=[],!, @O=[], @Y=Yn, (if T=PP then @X=Zn else @X=X). merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :- X=[A|L],Yn=[],!, @O=[A], @Y=Yn, (if T=PP then @X=Zn else @X=L). merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :-X=[],Yn=[B|N],!, @O=[B], @Y=N, (if T=PP then @X=Zn else @X=X). merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :-X=[A|L],Yn=[B|N],!, (if A<B then @O=[A], @X=L, @Y=Yn else @O=[B], @Y=N, @X=X). append(Nil,L,L1) :- Nil=[],L=L1. append(X,L,Y) :-[H|T]=X,[H1|M]=Y, H=H1,append(T,L,M).