theory lambda imports Pure begin setup Pure_Thy.old_appl_syntax_setup typedecl "term" lemma [trans]: assumes st: "s == t" shows "PROP P(t) ==> PROP P(s)" by (unfold st) lemma [trans]: assumes ps: "PROP P(s)" assumes st: "s == t" shows "PROP P(t)" using ps by (unfold st) locale RED = fixes abs :: "[term \ term] \ term" (binder "lam " 10) fixes "apply" :: "[term, term] \ term" (infixl "^" 20) fixes K :: "term" fixes I :: "term" fixes S :: "term" fixes B :: "term" fixes YC :: "term" fixes YT :: "term" fixes Red :: "[term, term] \ prop" ("(_ >--> _)") assumes K_def : "K \ lam x. (lam y. x)" assumes I_def : "I \ lam x. x" assumes S_def : "S \ lam x. (lam y. (lam z. x^z^(y^z)))" assumes B_def : "B \ S^(K^S)^K" assumes YC_def: "YC \ lam f. ((lam x. f^(x^x))^(lam x. f^(x^x)))" assumes YT_def: "YT \ (lam z. lam x. x^(z^z^x))^(lam z. lam x. x^(z^z^x))" assumes beta : "(lam x. f (x))^a >--> f(a)" assumes refl : "M >--> M" assumes trans[trans]: "\ M >--> N; N >--> L \ \ M >--> L" assumes appr : "M >--> N \ M^Z >--> N^Z" assumes appl : "M >--> N \ Z^M >--> Z^N" assumes epsi : "\ !! x. P(x) >--> Q(x) \ \ (lam x. P(x)) >--> (lam x. Q(x))" begin notation (output) "abs" (binder "\ " 10) end locale CONV = RED + fixes Conv :: "[term, term] \ prop" ("(_ >=< _)") assumes beta : "(lam x. f (x))^a >=< f(a)" assumes refl : "M >=< M" assumes symm[sym] : "M >=< N \ N >=< M" assumes trans[trans]: "\ M >=< N; N >=< L \ \ M >=< L" assumes appr : "M >=< N \ M^Z >=< N^Z" assumes appl : "M >=< N \ Z^M >=< Z^N" assumes epsi : "\ !! x. P(x) >=< Q(x) \ \ lam x. P(x) >=< lam x. Q(x)" begin lemmas beta_red = RED.beta[OF RED_axioms] and appr_red = RED.appr[OF RED_axioms] and appl_red = RED.appl[OF RED_axioms] and epsi_red = RED.epsi[OF RED_axioms] and trans_red = RED.trans[OF RED_axioms] and refl_red = RED.refl[OF RED_axioms] end end