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