3 slowSum :: [Integer] -> <Proc> Integer
\r
4 slowSum list = getRef answer
\r
8 constraint El Integer
\r
11 -El ?x, -El ?y => El (?x + ?y)
\r
12 El ?x => answer := ?x
\r
14 main = slowSum [1,6,9]
\r
20 slowGcd :: [Integer] -> <Proc> Integer
\r
21 slowGcd list = getRef answer
\r
25 constraint Gcd Integer
\r
27 ?x <- list => Gcd ?x
\r
29 -Gcd ?m, Gcd ?n, ?n <= ?m => Gcd (?m `mod` ?n)
\r
30 Gcd ?answer => answer := ?answer
\r
32 main = slowGcd [12,20]
\r
38 isReachable :: [(Integer,Integer)] -> Integer -> Integer -> <Proc> Boolean
\r
39 isReachable edges a b = getRef answer
\r
43 constraint Edge Integer Integer
\r
44 constraint Reachable Integer
\r
46 (?x,?y) <- edges => Edge ?x ?y
\r
48 Reachable ?x, Edge ?x ?y => Reachable ?y
\r
49 Reachable b => answer := True
\r
51 graph :: [(Integer, Integer)]
\r
52 graph = [(0,1), (1,2), (2,3), (4,5)]
\r
54 main = (isReachable graph 0 3, isReachable graph 0 5)
\r
58 import "StandardLibrary"
\r
60 primes1 limit = MList.freeze answer
\r
62 answer = MList.create ()
\r
65 constraint Prime Integer
\r
66 constraint PrimeCandidate Integer
\r
68 True => PrimeCandidate 3
\r
69 -PrimeCandidate ?x, ?x > limit => True
\r
70 -PrimeCandidate ?x, Prime ?y, ?x `mod` ?y = 0 => PrimeCandidate (?x + 2)
\r
71 -PrimeCandidate ?x => MList.add answer ?x, Prime ?x, PrimeCandidate (?x + 2)
\r
75 [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
\r
77 import "StandardLibrary"
\r
79 powersOfTwo n = sort (MList.freeze answer)
\r
81 answer = MList.create ()
\r
83 constraint N Integer
\r
86 -N ?x, -N ?x => N (2*?x)
\r
87 N ?x => MList.add answer ?x
\r
89 main = powersOfTwo 25
\r
93 import "StandardLibrary"
\r
95 main = MList.freeze answer
\r
97 answer = MList.create ()
\r
98 add = MList.add answer
\r
115 [A1, A2, B1, B2, C1, C2]
\r
117 import "StandardLibrary"
\r
119 graph = [("1","2"), ("2","3"), ("3","4"), ("3","5"), ("1","4"), ("5","5")]
\r
121 main = sort (MList.freeze answer)
\r
123 answer = MList.create ()
\r
126 constraint Edge String String
\r
127 constraint Degree String Integer
\r
130 (?x, ?y) <- graph => Edge ?x ?y
\r
132 Init, Edge ?x ?y => Degree ?x 1, Degree ?y 1
\r
133 Init, -Degree ?x ?a, -Degree ?x ?b => Degree ?x (?a + ?b)
\r
136 -Degree ?x 0 => print "Remove node \(?x)"
\r
137 -Degree ?x ?a, -Edge ?x ?x => Degree ?x (?a - 2), print "Remove loop (\(?x),\(?x))"
\r
138 -Degree ?x ?a, -Edge ?x ?y, -Degree ?y ?b, (?a==1 || ?b==1) => Degree ?x (?a - 1), Degree ?y (?b - 1), print "Remove dangling edge (\(?x),\(?y))"
\r
139 -Degree ?y 2, -Edge ?x ?y, -Edge ?y ?z => Edge ?x ?z, print "Simplify path (\(?x),\(?y),\(?z))"
\r
141 Edge ?x ?y => MList.add answer (?x, ?y)
\r
145 import "StandardLibrary"
\r
147 uniq :: [a] -> <Proc> [a]
\r
148 uniq l = MList.freeze answer
\r
150 answer = MList.create ()
\r
154 -El ?x, El ?x => True
\r
155 El ?x => MList.add answer ?x
\r
157 main = sort $ uniq [1,1,2,2,3]
\r