annotate Examples/sorter/sort3 @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
1 /* Program to do parallel quicksort. Ben Moszkowski
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
2 Initial version written around 29 Apr 84.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
3 Subsequent changes made.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
4 Updated 7 Feb 85.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
5
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
6 translate to Tokio by S.Kono
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
7 Sun Aug 31 21:29:10 JST 1986
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
8 using functor and implicit sync
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
9 */
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
10
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
11 /* Support Routines */
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
12
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
13 '$function' (len(L) = Length :- functor(L,_,Length)).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
14
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
15 '$function' (slice(List,From,To) = Slice
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
16 :- Size<--To-From+1,From=From1,To=To1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
17 (Size < 1, #(Slice = array) ;
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
18 #functor(Slice,array,Size),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
19 slice(1,List,From1,To1,1,Slice))).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
20
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
21 slice(N,List,From,To,_,_) :- N>To,!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
22 slice(N,List,From,To,I,Slice) :- N>=From,!,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
23 NN = N+1,II = I+1,arg(N,List,E),arg(I,Slice,E),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
24 slice(NN,List,From,To,II,Slice).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
25 slice(N,List,From,To,I,Slice) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
26 NN = N+1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
27 slice(NN,List,From,To,I,Slice).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
28
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
29 '$function' (thof(I,L) = E :- arg(I,L,E)).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
30
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
31 fixed_list(Array,Length) :- L <-- Length,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
32 #functor(Array,array,L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
33
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
34 '$function' ( (if Cond then Yes else No) = Reply :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
35 if Cond then Yes=Reply else No=Reply).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
36
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
37
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
38 /* Support Routines end */
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
39
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
40 par_quicksort(L) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
41 if len(L) =< 1
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
42 then empty
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
43 else
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
44 stable(Pivot),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
45 ( quick_partition(L,Pivot) &
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
46 sort_parts(L,Pivot) ).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
47
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
48 quick_partition(L,Pivot) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
49 I = 2, Z=1, J = len(L), J1=J+1,skip,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
50 P = thof(1,L),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
51 partition(I,J1,P,Z,J,L,Pivot).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
52
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
53 partition(K,K,P,I,J,L,Pivot) :- !,@Pivot=I,@I=I,@thof(I,L)=P.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
54 partition(K,E,P,I,J,L,Pivot) :- thof(K,L) < P,!, II=I+1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
55 @I=I, @thof(I,L) = thof(K,L), KK=K+1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
56 partition(KK,E,P,II,J,L,Pivot).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
57 partition(K,E,P,I,J,L,Pivot) :- JJ=J-1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
58 @J=J, @thof(J,L) = thof(K,L), KK=K+1,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
59 partition(KK,E,P,I,JJ,L,Pivot).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
60
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
61 sort_parts(L,Pivot) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
62 stable(thof(Pivot,L)),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
63 quicksort_process(slice(L,1, Pivot-1)),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
64 quicksort_process(slice(L,Pivot+1, len(L) )).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
65 quicksort_process(L) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
66 par_quicksort(L) & stable(L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
67
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
68 monitor(L) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
69 fixed_list(Tag_list,len(L)),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
70 #tag(1,len(L),L,Tag_list),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
71 #((write('''List='''),write(L),put(" "),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
72 write('''Tag_list='''),write(Tag_list))).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
73
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
74 tag(I,J,_,_) :- I>J,!.
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
75 tag(I,K,L,T) :- (if I-1=thof(I,L) then 1 else 0) = thof(I,T),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
76 J=I+1,tag(J,K,L,T).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
77
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
78 /* test of quicksort */
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
79 sort_test(Init_vector) :-
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
80 %exists L :
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
81 stable(Init_vector),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
82 fixed_list(L,len(Init_vector)),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
83 L=Init_vector,
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
84 par_quicksort(L),
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
85 % #write(L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
86 monitor(L).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
87
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
88 sort_test1 :- array(2,0,1)=List,sort_test(List).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
89
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
90 sort_test2 :- array(2,4,9,1,0,10,6,8,7,5,3)=List,sort_test(List).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
91
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
92 sort_test3 :- array(13,7,5,3,1,9,8,6,2,0,12,11,4,10)=List,sort_test(List).
cfb7c6b24319 Initial revision
kono
parents:
diff changeset
93