Minuska.notations


From Minuska Require Import
    prelude
    spec
.

Declare Scope RuleScope.
Declare Scope ConcreteScope.

Delimit Scope RuleScope with rs.
Delimit Scope ConcreteScope with concrete.

Record ExprAndBoV {Σ : StaticModel} : Type := mkExprAndBoV {
    eab_expr : Expression2 ;
    eab_bov : BuiltinOrVar ;
}.

Arguments mkExprAndBoV {Σ} eab_expr eab_bov.
(* 
Class TagLHS := mkTagLHS {}.
Class TagRHS := mkTagRHS {}.
Class TagGround := mkTagGround {}.

Class BasicResolver {Σ : StaticModel} := {
    operand_type : Type ;
}.

Class Resolver {Σ : StaticModel} {_BR : BasicResolver} := {
    inject_variable : variable -> operand_type ;
}.

[export] Instance BasicResolver_lhs {Σ : StaticModel} {_T1 : TagLHS} : BasicResolver := { operand_type := BuiltinOrVar; }. export
Instance BasicResolver_rhs {Σ : StaticModel}
    {_T2 : TagRHS}
    : BasicResolver
:= {
    operand_type := Expression2 ;
}.

[export] Instance BasicResolver_ground {Σ : StaticModel} {_T2 : TagGround} : BasicResolver := { operand_type := builtin_value ; }. export
Instance Resolver_lhs {Σ : StaticModel} {_T1 : TagLHS} : Resolver := {    
    inject_variable := (*t_over ∘*) bov_variable;
}.

[export] Instance Resolver_rhs {Σ : StaticModel} {_T2 : TagRHS} : Resolver := { inject_variable := (*t_over ∘ *)
e_variable;
}. *)

(*

Class ToAOO {Σ : StaticModel} {_basic_resolver : BasicResolver}
    (to_aoo_F : Type)
:= {
    to_aoo_opt : to_aoo_F -> (TermOver operand_type) ;
}.

[export] Instance ToAOO_id {Σ : StaticModel} {_basic_resolver : BasicResolver} {T : Type} {_eq: TCEq T (TermOver operand_type)} : ToAOO T . Proof. inversion _eq. subst. constructor. intros x. exact x. Defined. (* {| to_aoo_opt := fun x => x; |}. *)

(* I have no idea why I need the indirection through T. *)
#[export]
Instance ToAOO_inj {Σ : StaticModel} {_basic_resolver : BasicResolver}
    {T : Type}
    {_eq: TCEq T operand_type}
    : ToAOO (T)
.
Proof. inversion _eq. subst. constructor. apply term_operand. Defined.
(*
:= {|
    to_aoo_opt := term_operand;
|}.
*)


Arguments to_aoo_opt {Σ _basic_resolver} {to_aoo_F}%_type_scope {ToAOO} _.

*)
(* 
Notation "'*)

(* 
Notation "'llrule' l '~>{' a '}' r 'requires' s"
    := (@mkRewritingRule2
        _
        _
        ((fun (_:TagLHS) => l) mkTagLHS)rs
        ((fun (_:TagRHS) => s) mkTagRHS)*)