Mercurial > hg > Applications > Tokio
diff Examples/sorter/psort @ 0:cfb7c6b24319
Initial revision
author | kono |
---|---|
date | Thu, 30 Aug 2007 14:57:44 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Examples/sorter/psort Thu Aug 30 14:57:44 2007 +0900 @@ -0,0 +1,66 @@ + +test :- Strdata = [10,20,5,100,1,6,2,3], + datagen(Strdata,Data), + pipe(Data,Out), + length(18), + #write(Out). + +run :- Strdata = [10,20,5,100,1,6,2,3], + datagen(Strdata,Data), + pipe(Data,Out), + length(18). + + % 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) :- PP>=T, + append(Z,I,Zn), @Z=Zn, Yn=Y, @T=T+1. +load(I,O,X,Y,Yn,Z,Zn,T,P,PP) :- T>PP,T<P, + append(Y,I,Yn), @Z=[],@T=T+1. +load(I,O,X,Y,Yn,Z,Zn,T,P,PP) :- T>PP,T>=P, + append(Y,I,Yn), @Z=[],@T=1. + +merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :-X=[],Yn=[], + @O=[], @Y=Yn,switch(T,PP,X,Zn,X). +merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :- X=[A|L],Yn=[], + @O=[A], @Y=Yn,switch(T,PP,X,Zn,L). +merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :-X=[],Yn=[B|N], + @O=[B], @Y=N,switch(T,PP,X,Zn,X). +merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :-X=[A|L],Yn=[B|N], + A<B, + @O=[A], @X=L, @Y=Yn. +merge(I,O,X,Y,Yn,Z,Zn,T,P,PP) :-X=[A|L],Yn=[B|N], + A>=B, + @O=[B], @Y=N, @X=X. + +switch(T,PP,X,Zn,L) :- T=PP, @X=Zn. +switch(T,PP,X,Zn,L) :- T\=PP, @X=L. + + +append(Nil,L,L1) :- Nil=[],L=L1. +append(X,L,Y) :-[H|T]=X,[H1|M]=Y, + H=H1,append(T,L,M). +