import "Prelude" slowSum :: [Integer] -> Integer slowSum list = getRef answer where answer = ref 0 constraint El Integer ?x <- list => El ?x -El ?x, -El ?y => El (?x + ?y) El ?x => answer := ?x main = slowSum [1,6,9] -- 16 -- import "Prelude" slowGcd :: [Integer] -> Integer slowGcd list = getRef answer where answer = ref 0 constraint Gcd Integer ?x <- list => Gcd ?x -Gcd 0 => True -Gcd ?m, Gcd ?n, ?n <= ?m => Gcd (?m `mod` ?n) Gcd ?answer => answer := ?answer main = slowGcd [12,20] -- 4 -- import "Prelude" isReachable :: [(Integer,Integer)] -> Integer -> Integer -> Boolean isReachable edges a b = getRef answer where answer = ref False constraint Edge Integer Integer constraint Reachable Integer (?x,?y) <- edges => Edge ?x ?y True => Reachable a Reachable ?x, Edge ?x ?y => Reachable ?y Reachable b => answer := True graph :: [(Integer, Integer)] graph = [(0,1), (1,2), (2,3), (4,5)] main = (isReachable graph 0 3, isReachable graph 0 5) -- (true,false) -- import "StandardLibrary" primes1 limit = MList.freeze answer where answer = MList.create () MList.add answer 2 constraint Prime Integer constraint PrimeCandidate Integer True => PrimeCandidate 3 -PrimeCandidate ?x, ?x > limit => True -PrimeCandidate ?x, Prime ?y, ?x `mod` ?y = 0 => PrimeCandidate (?x + 2) -PrimeCandidate ?x => MList.add answer ?x, Prime ?x, PrimeCandidate (?x + 2) main = primes1 30 -- [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] -- import "StandardLibrary" powersOfTwo n = sort (MList.freeze answer) where answer = MList.create () constraint N Integer ?i <- [1..n] => N 1 -N ?x, -N ?x => N (2*?x) N ?x => MList.add answer ?x main = powersOfTwo 25 -- [1, 8, 16] -- import "StandardLibrary" main = MList.freeze answer where answer = MList.create () add = MList.add answer constraint A constraint B constraint C A => add "A1" B => add "B1" C => add "C1" A => add "A2" B => add "B2" C => add "C2" True => A -A => B -B => C -- [A1, A2, B1, B2, C1, C2] -- import "StandardLibrary" graph = [("1","2"), ("2","3"), ("3","4"), ("3","5"), ("1","4"), ("5","5")] main = sort (MList.freeze answer) where answer = MList.create () constraint Init constraint Edge String String constraint Degree String Integer True => Init (?x, ?y) <- graph => Edge ?x ?y Init, Edge ?x ?y => Degree ?x 1, Degree ?y 1 Init, -Degree ?x ?a, -Degree ?x ?b => Degree ?x (?a + ?b) -Init => True -Degree ?x 0 => print "Remove node \(?x)" -Degree ?x ?a, -Edge ?x ?x => Degree ?x (?a - 2), print "Remove loop (\(?x),\(?x))" -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))" -Degree ?y 2, -Edge ?x ?y, -Edge ?y ?z => Edge ?x ?z, print "Simplify path (\(?x),\(?y),\(?z))" Edge ?x ?y => MList.add answer (?x, ?y) -- Remove loop (5,5) Remove dangling edge (3,5) Remove node 5 Simplify path (1,2,3) Simplify path (1,3,4) [(1,4), (1,4)] -- import "StandardLibrary" uniq :: [a] -> [a] uniq l = MList.freeze answer where answer = MList.create () constraint El a ?x <- l => El ?x -El ?x, El ?x => True El ?x => MList.add answer ?x main = sort $ uniq [1,1,2,2,3] -- [1, 2, 3]