Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Section EValF.
- Fixpoint evalF (E : Env) (e : Exp) : option Val :=
- match e with
- | Error => Some VError
- | TryWith e1 e2 => match evalF E e1 with
- | Some VError => evalF E e2
- | other => other
- end
- | Num n => Some (VInt n)
- | BoolE b => Some (VBool b)
- | Var x => E |-l x
- | Plus e1 e2 => match evalF E e1, evalF E e2 with
- | Some (VInt v1), Some (VInt v2) => Some (VInt (v1 + v2))
- | Some VError, _ => Some VError
- | _, Some VError => Some VError
- | _, _ => None
- end
- | Div e1 e2 => match evalF E e1, evalF E e2 with
- | _, Some (VInt 0) => Some VError
- | Some (VInt v1), Some (VInt v2) => Some (VInt (v1 / v2))
- | Some VError, _ => Some VError
- | _, Some VError => Some VError
- | _, _ => None
- end
- | Less e1 e2 => match evalF E e1, evalF E e2 with
- | Some (VInt v1), Some (VInt v2) => Some (VBool (leb v1 v2))
- | Some VError, _ => Some VError
- | _, Some VError => Some VError
- | _, _ => None
- end
- | If b e1 e2 => match evalF E b with
- | Some (VBool true) => evalF E e1
- | Some (VBool false) => evalF E e2
- | Some VError => Some VError
- | _ => None
- end
- end.
- (* Längste Fallunterscheidung ever.. aber das wollte ich doch mal probieren: *)
- (* dafür erstmal ohne Aufgaben 3 und 4 ^^ *)
- Lemma evalRAsAFunction: forall E e v,
- (E |-R e ⇓ v) <-> evalF E e = Some v.
- Proof.
- split; cycle 1.
- - generalize v as w.
- induction e.
- all: intros w H.
- + inversion H.
- constructor.
- + inversion H.
- destruct (evalF E e5) eqn:I.
- ++ destruct v0 eqn: J.
- +++ apply EvTryWithError.
- ++++ apply IHe1. trivial.
- ++++ apply IHe2. trivial.
- +++ apply EvTryWith.
- ++++ apply IHe1. trivial.
- ++++ inversion H1. intro. inversion H0.
- +++ apply EvTryWith.
- ++++ apply IHe1. trivial.
- ++++ inversion H1. intro. inversion H0.
- ++ inversion H1.
- + inversion H.
- constructor.
- + inversion H.
- constructor.
- + inversion H.
- constructor.
- trivial.
- + inversion H.
- destruct (evalF E e5) eqn:I.
- ++ destruct (v0) eqn:J.
- +++ inversion H1.
- apply EvErrorOp.
- ++++ left. trivial.
- ++++ left.
- apply IHe1.
- trivial.
- +++ destruct (evalF E e7) eqn:K.
- ++++ destruct v1 eqn:L.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ left. trivial.
- ++++++ right.
- apply IHe2.
- trivial.
- +++++ inversion H1.
- eapply EvPlus.
- * apply IHe1.
- trivial.
- * apply IHe2.
- trivial.
- * trivial.
- +++++ inversion H1.
- ++++ inversion H1.
- +++ destruct (evalF E e7) eqn:K.
- ++++ destruct v1 eqn:L.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ left. trivial.
- ++++++ right.
- apply IHe2.
- trivial.
- +++++ inversion H1.
- +++++ inversion H1.
- ++++ inversion H1.
- ++ destruct (evalF E e7) eqn:K.
- +++ destruct v0 eqn:L.
- ++++ inversion H1.
- apply EvErrorOp.
- +++++ left. trivial.
- +++++ right.
- apply IHe2.
- trivial.
- ++++ inversion H1.
- ++++ inversion H1.
- +++ inversion H1.
- + inversion H.
- destruct (evalF E e5) eqn:I.
- ++ destruct (v0) eqn:J.
- +++ destruct (evalF E e7) eqn:K.
- ++++ destruct v1 eqn:L.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ right. left. trivial.
- ++++++ left.
- apply IHe1.
- trivial.
- +++++ destruct n.
- ++++++ inversion H1.
- apply EvErrorOp.
- +++++++ right. left. trivial.
- +++++++ left.
- apply IHe1.
- trivial.
- ++++++ inversion H1.
- apply EvErrorOp.
- +++++++ right. left. trivial.
- +++++++ left.
- apply IHe1.
- trivial.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ right. left. trivial.
- ++++++ left.
- apply IHe1.
- trivial.
- ++++ inversion H1.
- apply EvErrorOp.
- +++++ right. left. trivial.
- +++++ left.
- apply IHe1.
- trivial.
- +++ destruct (evalF E e7) eqn:K.
- ++++ destruct v1 eqn:L.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ right. left. trivial.
- ++++++ right.
- apply IHe2.
- trivial.
- +++++ destruct n0.
- ++++++ inversion H1.
- eapply EvDivError.
- * apply IHe2.
- trivial.
- ++++++ inversion H1.
- eapply EvDiv.
- * apply IHe1.
- trivial.
- * apply IHe2.
- trivial.
- * intro.
- inversion H0.
- * trivial.
- +++++ inversion H1.
- ++++ inversion H1.
- +++ destruct (evalF E e7) eqn:K.
- ++++ destruct v1 eqn:L.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ right. left. trivial.
- ++++++ right.
- apply IHe2.
- trivial.
- +++++ destruct n.
- * inversion H1.
- apply EvDivError.
- apply IHe2.
- trivial.
- * inversion H1.
- +++++ inversion H1.
- ++++ inversion H1.
- ++ destruct (evalF E e7) eqn:K.
- +++ destruct v0 eqn:L.
- ++++ inversion H1.
- apply EvErrorOp.
- +++++ right. left. trivial.
- +++++ right.
- apply IHe2.
- trivial.
- ++++ destruct n.
- * inversion H1.
- apply EvDivError.
- apply IHe2.
- trivial.
- * inversion H1.
- ++++ inversion H1.
- +++ inversion H1.
- + inversion H.
- destruct (evalF E e5) eqn:I.
- ++ destruct (v0) eqn:J.
- +++ inversion H1.
- apply EvErrorOp.
- ++++ right. right. trivial.
- ++++ left.
- apply IHe1.
- trivial.
- +++ destruct (evalF E e7) eqn:K.
- ++++ destruct v1 eqn:L.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ right. right. trivial.
- ++++++ right.
- apply IHe2.
- trivial.
- +++++ inversion H1.
- eapply EvLess.
- * apply IHe1.
- trivial.
- * apply IHe2.
- trivial.
- * trivial.
- +++++ inversion H1.
- ++++ inversion H1.
- +++ destruct (evalF E e7) eqn:K.
- ++++ destruct v1 eqn:L.
- +++++ inversion H1.
- apply EvErrorOp.
- ++++++ right. right. trivial.
- ++++++ right.
- apply IHe2.
- trivial.
- +++++ inversion H1.
- +++++ inversion H1.
- ++++ inversion H1.
- ++ destruct (evalF E e7) eqn:K.
- +++ destruct v0 eqn:L.
- ++++ inversion H1.
- apply EvErrorOp.
- +++++ right. right. trivial.
- +++++ right.
- apply IHe2.
- trivial.
- ++++ inversion H1.
- ++++ inversion H1.
- +++ inversion H1.
- + inversion H.
- destruct (evalF E e5) eqn:I.
- ++ destruct v0.
- * inversion H1.
- apply EvIfError.
- apply IHe1.
- trivial.
- * inversion H1.
- * destruct b.
- ** apply EvIfTrue.
- *** apply IHe1.
- trivial.
- *** apply IHe2.
- trivial.
- ** apply EvIfFalse.
- *** apply IHe1.
- trivial.
- *** apply IHe3.
- trivial.
- ++ inversion H1.
- - generalize v as w.
- induction e.
- all: intros w H; inversion H.
- -- simpl.
- trivial.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- -- apply IHe1 in H3.
- apply IHe2 in H5.
- simpl.
- rewrite H3.
- rewrite H5.
- trivial.
- -- apply IHe1 in H3.
- simpl.
- rewrite H3.
- destruct w; tauto.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- -- simpl.
- trivial.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- -- simpl.
- trivial.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- -- simpl.
- apply H2.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- + rewrite H6 in *.
- rewrite H7 in *.
- rewrite I.
- simpl.
- destruct H3.
- ++ apply IHe1 in H3.
- rewrite H3.
- trivial.
- ++ apply IHe2 in H3.
- rewrite H3.
- destruct (evalF E e5); try destruct v0; trivial.
- -- apply IHe1 in H2.
- apply IHe2 in H4.
- simpl.
- rewrite H2.
- rewrite H4.
- rewrite H6.
- trivial.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- + rewrite H6 in *.
- rewrite H7 in *.
- rewrite I.
- simpl.
- destruct H3.
- ++ apply IHe1 in H3.
- rewrite H3.
- destruct (evalF E e7); try destruct v0; try destruct n; trivial.
- ++ apply IHe2 in H3.
- rewrite H3.
- destruct (evalF E e5); try destruct v0; trivial.
- -- apply IHe1 in H2.
- apply IHe2 in H3.
- simpl.
- rewrite H2.
- rewrite H3.
- destruct v2. 1: tauto.
- rewrite H7.
- trivial.
- -- apply IHe2 in H4.
- simpl.
- rewrite H4.
- destruct (evalF E e5); try destruct v0; trivial.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- + rewrite H6 in *.
- rewrite H7 in *.
- rewrite I.
- simpl.
- destruct H3.
- ++ apply IHe1 in H3.
- rewrite H3.
- destruct (evalF E e7); trivial.
- ++ apply IHe2 in H3.
- rewrite H3.
- destruct (evalF E e5); try destruct v0; trivial.
- -- apply IHe1 in H2.
- apply IHe2 in H4.
- simpl.
- rewrite H2.
- rewrite H4.
- rewrite H6.
- trivial.
- -- inversion H1 as [I|H1']. 2: inversion H1' as [I|I].
- all: rewrite I in H0; inversion H0.
- -- apply IHe1 in H5.
- apply IHe2 in H6.
- simpl.
- rewrite H5.
- rewrite H6.
- trivial.
- -- apply IHe1 in H5.
- apply IHe3 in H6.
- simpl.
- rewrite H5.
- rewrite H6.
- trivial.
- -- apply IHe1 in H5.
- simpl.
- rewrite H5.
- trivial.
- Qed.
- End EValF.
- Lemma inj_R: forall E e v1 v2,
- ((E |-R e ⇓ v1) /\ (E |-R e ⇓ v2)) -> v1 = v2.
- Proof.
- intros.
- destruct H as [H1 H2].
- apply evalRAsAFunction in H1.
- apply evalRAsAFunction in H2.
- rewrite H2 in H1.
- inversion H1.
- reflexivity.
- Qed.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement