| author | haftmann | 
| Wed, 09 Jan 2008 08:32:09 +0100 | |
| changeset 25870 | a6a21adf3b55 | 
| parent 21425 | c11ab38b78a7 | 
| child 34974 | 18b41bba42b5 | 
| permissions | -rw-r--r-- | 
| 13208 | 1 | (* Title: HOL/Prolog/Func.thy | 
| 2 | ID: $Id$ | |
| 3 | Author: David von Oheimb (based on a lecture on Lambda Prolog by Nadathur) | |
| 4 | *) | |
| 9015 | 5 | |
| 17311 | 6 | header {* Untyped functional language, with call by value semantics *}
 | 
| 9015 | 7 | |
| 17311 | 8 | theory Func | 
| 9 | imports HOHH | |
| 10 | begin | |
| 9015 | 11 | |
| 17311 | 12 | typedecl tm | 
| 9015 | 13 | |
| 17311 | 14 | consts | 
| 15 | abs :: "(tm => tm) => tm" | |
| 16 | app :: "tm => tm => tm" | |
| 17 | ||
| 18 | cond :: "tm => tm => tm => tm" | |
| 19 | "fix" :: "(tm => tm) => tm" | |
| 9015 | 20 | |
| 17311 | 21 | true :: tm | 
| 22 | false :: tm | |
| 21425 | 23 | "and" :: "tm => tm => tm" (infixr "and" 999) | 
| 24 | eq :: "tm => tm => tm" (infixr "eq" 999) | |
| 9015 | 25 | |
| 20713 
823967ef47f1
renamed 0 and 1 to HOL.zero and HOL.one respectivly; introduced corresponding syntactic classes
 haftmann parents: 
17311diff
changeset | 26 |   Z       :: tm                     ("Z")
 | 
| 17311 | 27 | S :: "tm => tm" | 
| 9015 | 28 | (* | 
| 17311 | 29 | "++", "--", | 
| 30 | "**" :: tm => tm => tm (infixr 999) | |
| 9015 | 31 | *) | 
| 17311 | 32 | eval :: "[tm, tm] => bool" | 
| 9015 | 33 | |
| 17311 | 34 | instance tm :: plus .. | 
| 35 | instance tm :: minus .. | |
| 36 | instance tm :: times .. | |
| 9015 | 37 | |
| 17311 | 38 | axioms eval: " | 
| 9015 | 39 | |
| 40 | eval (abs RR) (abs RR).. | |
| 41 | eval (app F X) V :- eval F (abs R) & eval X U & eval (R U) V.. | |
| 42 | ||
| 43 | eval (cond P L1 R1) D1 :- eval P true & eval L1 D1.. | |
| 44 | eval (cond P L2 R2) D2 :- eval P false & eval R2 D2.. | |
| 45 | eval (fix G) W :- eval (G (fix G)) W.. | |
| 46 | ||
| 47 | eval true true .. | |
| 48 | eval false false.. | |
| 49 | eval (P and Q) true :- eval P true & eval Q true .. | |
| 50 | eval (P and Q) false :- eval P false | eval Q false.. | |
| 17311 | 51 | eval (A1 eq B1) true :- eval A1 C1 & eval B1 C1.. | 
| 9015 | 52 | eval (A2 eq B2) false :- True.. | 
| 53 | ||
| 54 | eval Z Z.. | |
| 55 | eval (S N) (S M) :- eval N M.. | |
| 56 | eval ( Z + M) K :- eval M K.. | |
| 57 | eval ((S N) + M) (S K) :- eval (N + M) K.. | |
| 58 | eval (N - Z) K :- eval N K.. | |
| 59 | eval ((S N) - (S M)) K :- eval (N- M) K.. | |
| 60 | eval ( Z * M) Z.. | |
| 61 | eval ((S N) * M) K :- eval (N * M) L & eval (L + M) K" | |
| 62 | ||
| 21425 | 63 | |
| 64 | lemmas prog_Func = eval | |
| 65 | ||
| 66 | lemma "eval ((S (S Z)) + (S Z)) ?X" | |
| 67 | apply (prolog prog_Func) | |
| 68 | done | |
| 69 | ||
| 70 | lemma "eval (app (fix (%fact. abs(%n. cond (n eq Z) (S Z) | |
| 71 | (n * (app fact (n - (S Z))))))) (S (S (S Z)))) ?X" | |
| 72 | apply (prolog prog_Func) | |
| 73 | done | |
| 17311 | 74 | |
| 9015 | 75 | end |