playground/coq/unfinished/operational-sem.v

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.