X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=tests%2Forg.simantics.scl.compiler.tests%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Ftests%2Fscl%2FCHR1.scl;h=c1e3402afd56c512b040f7eb7967fda016b36b93;hb=00119bc6c509134e985c11ad4f6aff37801adc3f;hp=90ea90a06046a735cb929384c936b6225d619bed;hpb=593a8f75d9dbc363234002dc500c346afbeba040;p=simantics%2Fplatform.git diff --git a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR1.scl b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR1.scl index 90ea90a06..c1e3402af 100644 --- a/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR1.scl +++ b/tests/org.simantics.scl.compiler.tests/src/org/simantics/scl/compiler/tests/scl/CHR1.scl @@ -1,159 +1,164 @@ -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) --- -[(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] --- +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] \ No newline at end of file