Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Require Arith.
Import nat_scope.
Open Scope nat_scope.
Require ZArith.
Require PolyList.
Inductive aexpr : Set :=
Var : nat -> aexpr
| Plus : aexpr -> aexpr -> aexpr
| Num : nat -> aexpr.
Fixpoint interp [v:nat->nat; e:aexpr] : nat :=
Cases e of (Var x) => (v x)
| (Plus e1 e2) => (interp v e1)+(interp v e2)
| (Num n) => n
end.
Fixpoint flat [e:aexpr] : nat * (list nat) :=
Cases e of (Var x) => (O,(cons x (nil nat)))
| (Plus e1 e2) => let (n1,l1) = (flat e1) in
let (n2,l2) = (flat e2) in
((n1+n2),(app l1 l2) )
| (Num n) => (n,(nil nat))
end.
Fixpoint exprlv [n:nat; l: (list nat)] : aexpr :=
Cases l of nil => (Num n)
| (cons x m) => (Plus (Var x) (exprlv n m))
end.
Definition norm [e:aexpr] : aexpr :=
let (n,lv)=(flat e) in (exprlv n lv).
Lemma flat_correct : (v:nat->nat)(e:aexpr)
(interp v e)=(interp v (norm e)).
Induction e; Unfold norm; Simpl; Auto.
Intros a1; Case (flat a1); Intros n1 lv1 H1.
Intros a2; Case (flat a2); Intros n2 lv2 H2.
Rewrite H1; Rewrite H2; Clear H1 H2 a1 a2 e.
Induction lv1; Simpl; Auto with zarith.
Induction lv2; Simpl; Auto with zarith.
Save.
Variables x,y,z:nat.
Definition v:= [n]Cases n of
0 => x | 1 => y | 2 => z
| 3 => (x*y) | _ => O end.
Lemma test :5+x+1+(y+2+(x*y+z))=0.
Change (interp v
(Plus (Plus (Plus (Num 5) (Var 0)) (Num 1))
(Plus (Plus (Var 1) (Num 2))
(Plus (Var 3) (Var 2)))))=O.
Rewrite flat_correct.
Simpl.
Show Proof.