1120
|
1 |
(* Title: HOL/Lambda.thy
|
|
2 |
ID: $Id$
|
|
3 |
Author: Tobias Nipkow
|
|
4 |
Copyright 1995 TU Muenchen
|
|
5 |
|
|
6 |
Lambda-terms in de Bruijn notation,
|
|
7 |
substitution and beta-reduction.
|
|
8 |
*)
|
|
9 |
|
|
10 |
Lambda = Arith +
|
|
11 |
|
|
12 |
datatype db = Var nat | "@" db db (infixl 200) | Fun db
|
|
13 |
|
|
14 |
consts
|
|
15 |
subst :: "[db,db,nat]=>db"
|
|
16 |
lift :: "[db,nat] => db"
|
|
17 |
|
|
18 |
primrec subst db
|
|
19 |
subst_Var "subst s (Var i) n = (if n < i then Var(pred i)
|
|
20 |
else if i = n then s else Var i)"
|
|
21 |
subst_App "subst s (t @ u) n = (subst s t n) @ (subst s u n)"
|
|
22 |
subst_Fun "subst s (Fun t) n = Fun (subst (lift s 0) t (Suc n))"
|
|
23 |
|
|
24 |
primrec lift db
|
|
25 |
lift_Var "lift (Var i) n = (if i < n then Var i else Var(Suc i))"
|
|
26 |
lift_App "lift (s @ t) n = (lift s n) @ (lift t n)"
|
|
27 |
lift_Fun "lift (Fun s) n = Fun(lift s (Suc n))"
|
|
28 |
|
|
29 |
consts beta :: "(db * db) set"
|
|
30 |
|
|
31 |
syntax "->", "->>" :: "[db,db] => bool" (infixl 50)
|
|
32 |
|
|
33 |
translations
|
|
34 |
"s -> t" == "(s,t) : beta"
|
|
35 |
"s ->> t" == "(s,t) : beta^*"
|
|
36 |
|
|
37 |
inductive "beta"
|
|
38 |
intrs
|
|
39 |
beta "(Fun s) @ t -> subst t s 0"
|
|
40 |
appL "s -> t ==> s@u -> t@u"
|
|
41 |
appR "s -> t ==> u@s -> u@t"
|
|
42 |
abs "s -> t ==> Fun s -> Fun t"
|
|
43 |
end
|