implementation module semantic_functions import StdInt, StdList d :: [Int] -> [Int] d [] = [] d [a:rest] = rest e :: Int [Int] -> [Int] e a [] = [a] e a b = [a] ++ b add :: [Int] -> [Int] add [] = [] add [a] = [a] add [a:b:rest] = [b+a:rest] sub :: [Int] -> [Int] sub [] = [] sub [a] = [a] sub [a:b:rest] = [b-a:rest] mul :: [Int] -> [Int] mul [] = [] mul [a] = [a] mul [a:b:rest] = [b*a:rest] div :: [Int] -> [Int] div [] = [] div [a] = [a] div [a:b:rest] = [b/a:rest] modc :: [Int] -> [Int] modc[] = [] modc[a] = [a] modc[a:b:rest] = [modulo b a:rest] dup :: [Int] -> [Int] dup[] = [] dup[a:rest] = [a:a:rest] notc :: [Int] -> [Int] notc[] = [] notc[0:rest] = [1:rest] notc[_:rest] = [0:rest] gre :: [Int] -> [Int] gre[] = [] gre[a] = [a] gre[a:b:rest] |a >= b = [0:rest] |otherwise = [1:rest] roll :: [Int] -> [Int] roll [] = [] roll [a] = [a] roll [a:b:rest] |modulo a b == 0 = rest |b <= 0 = rest |b > length rest = rest |a == 1 = roll1 [b:rest] |a > 0 = roll ([a-1] ++ [b] ++ roll1 [b:rest]) |a < 0 = roll ([modulo a b] ++ [b:rest]) roll1 :: [Int] -> [Int] roll1 [1:rest] = rest roll1 [b:c:d:rest] = [d] ++ roll1[b-1:c:rest] //outnum_so :: stack_output stack -> stack_output outnum_so :: [Int] [Int] -> [Int] outnum_so so [] = so outnum_so so [a:rest] = add_to_s a so //innum_s :: stack_input stack -> stack innum_s :: [Int] [Int] -> [Int] innum_s [] _ = [] innum_s [a:rest] s = add_to_s a s //help functions modulo :: Int Int -> Int modulo a b |a<0 = modulo (a+b) b |a [a] add_to_s a [] = [a] add_to_s a b = b ++ [a] Start = vijffaculteit eenfaculteit = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2[1,1]))))))))))))))) tweefaculteit = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2 tweefaculteit1))))))))))))))) tweefaculteit1 = roll(e 1(e 2(d(roll(e 2(e 3(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2(d(roll(e 1(e 2(mul(roll(e 1(e 4(dup(roll(e 2(e 3(dup tweefaculteit2)))))))))))))))))))))))))))) tweefaculteit2 = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2(e 1 (e 2 []))))))))))))))))) vijffaculteit = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2 vijffaculteit1))))))))))))))) vijffaculteit1 = roll(e 1(e 2(d(roll(e 2(e 3(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2(d(roll(e 1(e 2(mul(roll(e 1(e 4(dup(roll(e 2(e 3(dup vijffaculteit2)))))))))))))))))))))))))))) vijffaculteit2 = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2 vijffaculteit3))))))))))))))) vijffaculteit3 = roll(e 1(e 2(d(roll(e 2(e 3(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2(d(roll(e 1(e 2(mul(roll(e 1(e 4(dup(roll(e 2(e 3(dup vijffaculteit4)))))))))))))))))))))))))))) vijffaculteit4 = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2 vijffaculteit5))))))))))))))) vijffaculteit5 = roll(e 1(e 2(d(roll(e 2(e 3(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2(d(roll(e 1(e 2(mul(roll(e 1(e 4(dup(roll(e 2(e 3(dup vijffaculteit6)))))))))))))))))))))))))))) vijffaculteit6 = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2 vijffaculteit7))))))))))))))) vijffaculteit7 = roll(e 1(e 2(d(roll(e 2(e 3(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2(d(roll(e 1(e 2(mul(roll(e 1(e 4(dup(roll(e 2(e 3(dup [1,5])))))))))))))))))))))))))))) //[1,5] is the outcome of vijffaculteit8, but it won't run if not substituted vijffaculteit8 = d(notc(gre(sub(e 1(e 1(notc(sub(e 1(roll(e 1(e 3(dup(roll(e 1(e 2(e 1 (e 5 [])))))))))))))))))