aboutsummaryrefslogtreecommitdiff
path: root/sample/qsort.in
blob: 523d7d87447b7bcbdc94ba11a2a6db693ddd3573 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// Quick sort

// Rules
qsort(ret) >< [] => ret~[];
qsort(ret) >< (int x):xs =>
	Append(ret, x:right)~left, part(smaller, larger, x)~xs,
	qsort(left)~smaller, qsort(right)~larger;

// Note: `Append' is implemented as the following built-in agent:
// Append(ret, b)~a  -->  ret ~ (a++b)

part(smaller, larger, int x) >< [] => smaller~[], larger~[];
part(smaller, larger, int x) >< (int y):ys
| y<x => smaller~(y:cnt), part(cnt, larger, x)~ys
| _   => larger~(y:cnt), part(smaller, cnt, x)~ys;

// Nets
qsort(ret)~[3,6,1,9,2];
ret;