src/HOL/Induct/ABexp.thy
changeset 11046 b5f5942781a0
parent 5802 614f2f30781a
child 11649 dfb59b9954a6
equal deleted inserted replaced
11045:971a50fda146 11046:b5f5942781a0
     1 (*  Title:      HOL/Induct/ABexp.thy
     1 (*  Title:      HOL/Induct/ABexp.thy
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Stefan Berghofer, TU Muenchen
     3     Author:     Stefan Berghofer, TU Muenchen
     4     Copyright   1998  TU Muenchen
     4     Copyright   1998  TU Muenchen
     5 
       
     6 Arithmetic and boolean expressions
       
     7 *)
     5 *)
     8 
     6 
     9 ABexp = Main +
     7 header {* Arithmetic and boolean expressions *}
    10 
     8 
    11 datatype
     9 theory ABexp = Main:
    12   'a aexp = IF ('a bexp) ('a aexp) ('a aexp)
    10 
    13           | Sum ('a aexp) ('a aexp)
    11 datatype 'a aexp =
    14           | Diff ('a aexp) ('a aexp)
    12     IF "'a bexp"  "'a aexp"  "'a aexp"
    15           | Var 'a
    13   | Sum "'a aexp"  "'a aexp"
    16           | Num nat
    14   | Diff "'a aexp"  "'a aexp"
    17 and
    15   | Var 'a
    18   'a bexp = Less ('a aexp) ('a aexp)
    16   | Num nat
    19           | And ('a bexp) ('a bexp)
    17 and 'a bexp =
    20           | Neg ('a bexp)
    18     Less "'a aexp"  "'a aexp"
       
    19   | And "'a bexp"  "'a bexp"
       
    20   | Neg "'a bexp"
    21 
    21 
    22 
    22 
    23 (** evaluation of arithmetic and boolean expressions **)
    23 text {* \medskip Evaluation of arithmetic and boolean expressions *}
    24 
    24 
    25 consts
    25 consts
    26   evala :: ('a => nat) => 'a aexp => nat
    26   evala :: "('a => nat) => 'a aexp => nat"
    27   evalb :: ('a => nat) => 'a bexp => bool
    27   evalb :: "('a => nat) => 'a bexp => bool"
    28 
    28 
    29 primrec
    29 primrec
    30   "evala env (IF b a1 a2) =
    30   "evala env (IF b a1 a2) = (if evalb env b then evala env a1 else evala env a2)"
    31      (if evalb env b then evala env a1 else evala env a2)"
       
    32   "evala env (Sum a1 a2) = evala env a1 + evala env a2"
    31   "evala env (Sum a1 a2) = evala env a1 + evala env a2"
    33   "evala env (Diff a1 a2) = evala env a1 - evala env a2"
    32   "evala env (Diff a1 a2) = evala env a1 - evala env a2"
    34   "evala env (Var v) = env v"
    33   "evala env (Var v) = env v"
    35   "evala env (Num n) = n"
    34   "evala env (Num n) = n"
    36 
    35 
    37   "evalb env (Less a1 a2) = (evala env a1 < evala env a2)"
    36   "evalb env (Less a1 a2) = (evala env a1 < evala env a2)"
    38   "evalb env (And b1 b2) = (evalb env b1 & evalb env b2)"
    37   "evalb env (And b1 b2) = (evalb env b1 \<and> evalb env b2)"
    39   "evalb env (Neg b) = (~ evalb env b)"
    38   "evalb env (Neg b) = (\<not> evalb env b)"
    40 
    39 
    41 
    40 
    42 (** substitution on arithmetic and boolean expressions **)
    41 text {* \medskip Substitution on arithmetic and boolean expressions *}
    43 
    42 
    44 consts
    43 consts
    45   substa :: ('a => 'b aexp) => 'a aexp => 'b aexp
    44   substa :: "('a => 'b aexp) => 'a aexp => 'b aexp"
    46   substb :: ('a => 'b aexp) => 'a bexp => 'b bexp
    45   substb :: "('a => 'b aexp) => 'a bexp => 'b bexp"
    47 
    46 
    48 primrec
    47 primrec
    49   "substa f (IF b a1 a2) =
    48   "substa f (IF b a1 a2) = IF (substb f b) (substa f a1) (substa f a2)"
    50      IF (substb f b) (substa f a1) (substa f a2)"
       
    51   "substa f (Sum a1 a2) = Sum (substa f a1) (substa f a2)"
    49   "substa f (Sum a1 a2) = Sum (substa f a1) (substa f a2)"
    52   "substa f (Diff a1 a2) = Diff (substa f a1) (substa f a2)"
    50   "substa f (Diff a1 a2) = Diff (substa f a1) (substa f a2)"
    53   "substa f (Var v) = f v"
    51   "substa f (Var v) = f v"
    54   "substa f (Num n) = Num n"
    52   "substa f (Num n) = Num n"
    55 
    53 
    56   "substb f (Less a1 a2) = Less (substa f a1) (substa f a2)"
    54   "substb f (Less a1 a2) = Less (substa f a1) (substa f a2)"
    57   "substb f (And b1 b2) = And (substb f b1) (substb f b2)"
    55   "substb f (And b1 b2) = And (substb f b1) (substb f b2)"
    58   "substb f (Neg b) = Neg (substb f b)"
    56   "substb f (Neg b) = Neg (substb f b)"
    59 
    57 
       
    58 lemma subst1_aexp_bexp:
       
    59   "evala env (substa (Var (v := a')) a) = evala (env (v := evala env a')) a \<and>
       
    60   evalb env (substb (Var (v := a')) b) = evalb (env (v := evala env a')) b"
       
    61     --  {* one variable *}
       
    62   apply (induct a and b)
       
    63          apply simp_all
       
    64   done
       
    65 
       
    66 lemma subst_all_aexp_bexp:
       
    67   "evala env (substa s a) = evala (\<lambda>x. evala env (s x)) a \<and>
       
    68   evalb env (substb s b) = evalb (\<lambda>x. evala env (s x)) b"
       
    69     -- {* all variables *}
       
    70   apply (induct a and b)
       
    71          apply auto
       
    72   done
       
    73 
    60 end
    74 end