(* Title: HOL/Prolog/Func.thy ID: $Id: Func.thy,v 1.7 2006/11/20 20:23:12 wenzelm Exp $ Author: David von Oheimb (based on a lecture on Lambda Prolog by Nadathur) *) header {* Untyped functional language, with call by value semantics *} theory Func imports HOHH begin typedecl tm consts abs :: "(tm => tm) => tm" app :: "tm => tm => tm" cond :: "tm => tm => tm => tm" "fix" :: "(tm => tm) => tm" true :: tm false :: tm "and" :: "tm => tm => tm" (infixr "and" 999) eq :: "tm => tm => tm" (infixr "eq" 999) Z :: tm ("Z") S :: "tm => tm" (* "++", "--", "**" :: tm => tm => tm (infixr 999) *) eval :: "[tm, tm] => bool" instance tm :: plus .. instance tm :: minus .. instance tm :: times .. axioms eval: " eval (abs RR) (abs RR).. eval (app F X) V :- eval F (abs R) & eval X U & eval (R U) V.. eval (cond P L1 R1) D1 :- eval P true & eval L1 D1.. eval (cond P L2 R2) D2 :- eval P false & eval R2 D2.. eval (fix G) W :- eval (G (fix G)) W.. eval true true .. eval false false.. eval (P and Q) true :- eval P true & eval Q true .. eval (P and Q) false :- eval P false | eval Q false.. eval (A1 eq B1) true :- eval A1 C1 & eval B1 C1.. eval (A2 eq B2) false :- True.. eval Z Z.. eval (S N) (S M) :- eval N M.. eval ( Z + M) K :- eval M K.. eval ((S N) + M) (S K) :- eval (N + M) K.. eval (N - Z) K :- eval N K.. eval ((S N) - (S M)) K :- eval (N- M) K.. eval ( Z * M) Z.. eval ((S N) * M) K :- eval (N * M) L & eval (L + M) K" lemmas prog_Func = eval lemma "eval ((S (S Z)) + (S Z)) ?X" apply (prolog prog_Func) done lemma "eval (app (fix (%fact. abs(%n. cond (n eq Z) (S Z) (n * (app fact (n - (S Z))))))) (S (S (S Z)))) ?X" apply (prolog prog_Func) done end
lemma prog_Func:
eval (Func.abs RR) (Func.abs RR) ∧
(eval F (Func.abs R) ∧ eval X U ∧ eval (R U) V --> eval (app F X) V) ∧
(eval P true ∧ eval L1.0 D1.0 --> eval (cond P L1.0 R1.0) D1.0) ∧
(eval P false ∧ eval R2.0 D2.0 --> eval (cond P L2.0 R2.0) D2.0) ∧
(eval (G (fix G)) W --> eval (fix G) W) ∧
eval true true ∧
eval false false ∧
(eval P true ∧ eval Q true --> eval (P and Q) true) ∧
(eval P false ∨ eval Q false --> eval (P and Q) false) ∧
(eval A1.0 C1.0 ∧ eval B1.0 C1.0 --> eval (A1.0 eq B1.0) true) ∧
(True --> eval (A2.0 eq B2.0) false) ∧
eval Z Z ∧
(eval N M --> eval (S N) (S M)) ∧
(eval M K --> eval (Z + M) K) ∧
(eval (N + M) K --> eval (S N + M) (S K)) ∧
(eval N K --> eval (N - Z) K) ∧
(eval (N - M) K --> eval (S N - S M) K) ∧
eval (Z * M) Z ∧ (eval (N * M) L ∧ eval (L + M) K --> eval (S N * M) K)
lemma
eval (S (S Z) + S Z) (S (S (S Z)))
lemma
eval (app (fix (λfact. Func.abs
(λn. cond (n eq Z) (S Z) (n * app fact (n - S Z)))))
(S (S (S Z))))
(S (S (S (S (S (S Z))))))