diff --git a/3or4/Interpreter/Self.hs b/3or4/Interpreter/Self.hs index 2626b17..d00a826 100644 --- a/3or4/Interpreter/Self.hs +++ b/3or4/Interpreter/Self.hs @@ -12,10 +12,6 @@ mapExp = parse \ ; Cons(x,xs) -> Cons(f x, map xs)\ \ }" -substBrExp :: Exp -substBrExp = parse - "rec substBr = \\x. " - ifExp :: Exp ifExp = parse "\\b. \\t. \\f. case b of \ @@ -24,7 +20,27 @@ ifExp = parse \ }" equalExp :: Exp -equalExp = parse "" +equalExp = parse + "rec equal = \\m. \\n. case m of \ + \ { Zero() -> case n of { Zero() -> True(); Suc(n) -> False() } \ + \ ; Suc(m) -> case n of { Zero() -> False(); Suc(n) -> equal m n }\ + \ }" + +elemExp :: Exp +elemExp = + subst (Variable "equal") equalExp . + subst (Variable "if") ifExp $ parse + "\\x. rec elem = \\l. case l of \ + \ { Nil() -> False() \ + \ ; Cons(v,vs) -> if (equal x v) True() (elem vs)\ + \ }" + +substBrExp :: Exp +substBrExp = + subst (Variable "elem") elemExp $ parse + "\\subst. \\var. \\b. case b of \ + \ { Branch(c,vs,e') -> if (elem var vs) Branch(c,vs,e') Branch(c,vs, subst e') \ + \ }" substExp :: Exp substExp = @@ -38,5 +54,5 @@ substExp = \ ; Var(x) -> if (equal x var) e Var(x) \ \ ; Const(c,es) -> Const(c, map subst es) \ \ ; Rec(x, e') -> if (equal x var) Rec(x,e') Rec(x,subst e')\ - \ ; Case(e',bs) -> _ \ + \ ; Case(e',bs) -> Case(subst e', map (substBr subst var) bs) \ \ }"