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).
+