Library PAutomata.PGM.Var
Require Import Bool.
Require Import List.
Require Import String.
Require Import Map.
Set Implicit Arguments.
Unset Strict Implicit.
Section TYPEDVALUE_DEF.
Record typedvalue : Type := {type : Type; content : type}.
Inductive utopia : Set :=
fan : utopia.
Definition undefinedtypedvalue := Build_typedvalue fan.
Definition eq_typedvalue := eq (A:=typedvalue).
Section PREDICATE_TYPEDVALUE_DEF.
Variable type1 : Type.
Variable type2 : Type.
Variable predicate1 : type1 -> Prop.
Definition predicate_typedvalue (tv : typedvalue) : Prop :=
type tv = type1 /\
(forall vr : type1, tv = Build_typedvalue vr -> predicate1 vr).
Variable predicate2 : type1 -> type2 -> Prop.
Definition predicate_type1_typedvalue2 (v1 : type1)
(tv2 : typedvalue) : Prop :=
type tv2 = type2 /\
(forall v2 : type2, tv2 = Build_typedvalue v2 -> predicate2 v1 v2).
Definition predicate_typedvalue1_type2 (tv1 : typedvalue)
(v2 : type2) : Prop :=
type tv1 = type1 /\
(forall v1 : type1, tv1 = Build_typedvalue v1 -> predicate2 v1 v2).
Definition predicate_typedvalue1_typedvalue2 (tv1 tv2 : typedvalue) : Prop :=
type tv1 = type1 /\
type tv2 = type2 /\
(forall (v1 : type1) (v2 : type2),
tv1 = Build_typedvalue v1 /\ tv2 = Build_typedvalue v2 -> predicate2 v1 v2).
End PREDICATE_TYPEDVALUE_DEF.
End TYPEDVALUE_DEF.
Section PVALUATION_DEF.
Definition pvaluation := map string typedvalue.
Definition emptypvaluation := null string typedvalue.
Definition pvalue := evaluate eq_string undefinedtypedvalue.
Definition pupdate :=
refresh (Domain:=string) eq_string (Codomain:=typedvalue).
Definition prestrict := filter eq_string.
Definition eq_pvaluation :=
eq_map eq_string eq_typedvalue undefinedtypedvalue.
Definition defined (pv : pvaluation) (v : string) :=
pvalue pv v <> undefinedtypedvalue.
Definition is_type (pv : pvaluation) (v : string) (t : Type) :=
type (pvalue pv v) = t.
End PVALUATION_DEF.
