80 lines
2.0 KiB
Coq
80 lines
2.0 KiB
Coq
Require Import String.
|
|
Open Scope string.
|
|
|
|
Check String.eqb.
|
|
Check string_dec.
|
|
Compute string_dec "a" "b".
|
|
Compute if (string_dec "a" "b") then true else false.
|
|
Compute if (string_dec "a" "a") then true else false.
|
|
Compute if (String.eqb "a" "b") then true else false.
|
|
Compute if (String.eqb "a" "a") then true else false.
|
|
Print String.eqb.
|
|
|
|
Search (string -> string -> bool).
|
|
Compute eqb "sh" "s".
|
|
Print String.eqb.
|
|
Print Nat.eqb.
|
|
|
|
Require Import List.
|
|
Import ListNotations.
|
|
|
|
Definition env : Set := list (string * nat).
|
|
|
|
Fixpoint envLookUp (e : env) (key : string) : option nat :=
|
|
match e with
|
|
| [] => None
|
|
| ((var, val)::xs) =>
|
|
if (String.eqb key var) then
|
|
Some val
|
|
else
|
|
envLookUp xs key
|
|
end.
|
|
|
|
Inductive natexp : Set :=
|
|
| Nat : nat -> natexp
|
|
| Var : string -> natexp
|
|
| Plus : natexp -> natexp -> natexp.
|
|
|
|
Inductive boolexp : Set :=
|
|
| Lt : natexp -> natexp -> boolexp.
|
|
|
|
|
|
Check "a" <> "y".
|
|
Check 3 < 2.
|
|
Check 3 <= 2.
|
|
|
|
Inductive nateval : env -> natexp -> nat -> Prop :=
|
|
(* Eval of [Nat n] is [n] *)
|
|
| NatInit : forall (e : env) (n : nat),
|
|
nateval e (Nat n) n
|
|
| NatVar : forall (e : env) (n : nat) (v : string),
|
|
nateval ((v,n)::e) (Var v) n
|
|
(*
|
|
| NatVarNeq : forall (e : env) (n1 n2 : nat) (v1 v2 : string),
|
|
v1 <> v2
|
|
-> nateval e (Var v1) n1
|
|
-> nateval ((v2,n2)::e) (Var v1) n1
|
|
*)
|
|
| NatPlus : forall (e : env) (nexp1 nexp2 : natexp)
|
|
(n1 n2 : nat) (v : string),
|
|
nateval e nexp1 n1
|
|
-> nateval e nexp2 n2
|
|
-> nateval e (Plus nexp1 nexp2) (n1 + n2).
|
|
|
|
Inductive booleval : env -> boolexp -> bool -> Prop :=
|
|
| BoolLt : forall (e : env) (n1 n2 : nat) (nexp1 nexp2 : natexp),
|
|
nateval e nexp1 n1
|
|
-> nateval e nexp2 n2
|
|
-> n1 < n2
|
|
-> booleval e (Lt nexp1 nexp2) true.
|
|
|
|
Lemma lookUpEval : forall (e : env) (key : string) (n : nat),
|
|
envLookUp e key = Some n -> nateval e (Var key) n.
|
|
Proof.
|
|
intros.
|
|
Qed.
|
|
|
|
Definition env1 := [("h"%string, 2); ("a"%string, 4)].
|
|
Compute envLookUp env1 "h"%string.
|
|
Compute envLookUp env1 "b"%string.
|