open import Agda.Builtin.Equality
open import Data.Product
open import Data.Sum
open import Data.Vec using (Vec; fromList; length) renaming (lookup to get)
open import Data.Fin using (Fin)
open import Level
open import Relation.Unary using (_β_)
module is-lib.InfSys.Base {π} where
record MetaRule {πc πp : Level} (U : Set π) : Set (π β suc πc β suc πp) where
field
Ctx : Set πc
Pos : Ctx β Set πp
prems : (c : Ctx) β Pos c β U
conclu : Ctx β U
addSideCond : β{π'} β (U β Set π') β MetaRule {πc β π'} U
(addSideCond P) .Ctx = Ξ£[ c β Ctx ] P (conclu c)
(addSideCond P) .Pos (c , _) = Pos c
(addSideCond P) .prems (c , _) p = prems c p
(addSideCond P) .conclu (c , _) = conclu c
RF[_] : β{π'} β (U β Set π') β (U β Set _)
RF[_] P u = Ξ£[ c β Ctx ] (u β‘ conclu c Γ (β p β P (prems c p)))
RClosed : β{π'} β (U β Set π') β Set _
RClosed P = β c β (β p β P (prems c p)) β P (conclu c)
record FinMetaRule {πc n} (U : Set π) : Set (π β suc πc) where
field
Ctx : Set πc
comp : Ctx β Vec U n Γ U
from : MetaRule {πc} {zero} U
from .MetaRule.Ctx = Ctx
from .MetaRule.Pos = Ξ» _ β Fin n
from .MetaRule.prems c n = get (projβ (comp c)) n
from .MetaRule.conclu c = projβ (comp c)
open MetaRule
record IS {πc πp πn : Level} (U : Set π) : Set (π β suc πc β suc πp β suc πn) where
field
Names : Set πn
rules : Names β MetaRule {πc} {πp} U
ISF[_] : β{π'} β (U β Set π') β (U β Set _)
ISF[_] P u = Ξ£[ rn β Names ] RF[ rules rn ] P u
ISClosed : β{π'} β (U β Set π') β Set _
ISClosed P = β rn β RClosed (rules rn) P
open IS
_βͺ_ : β{πc πp πn πn'}{U : Set π} β IS {πc} {πp} {πn} U β IS {_} {_} {πn'} U β IS {_} {_} {πn β πn'} U
(is1 βͺ is2) .Names = (is1 .Names) β (is2 .Names)
(is1 βͺ is2) .rules = [ is1 .rules , is2 .rules ]
_β_ : β{πc πp πn π'}{U : Set π} β IS {πc} {πp} {πn} U β (U β Set π') β IS {πc β π'} {_} {_} U
(is β P) .Names = is .Names
(is β P) .rules rn = addSideCond (is .rules rn) P
closedβprefix : β{πc πp}{U : Set π} β (m : MetaRule {πc} {πp} U) β β{π'}{P : U β Set π'} β RClosed m {π'} P β RF[ m ] P β P
closedβprefix _ cl (_ , refl , pr) = cl _ pr
prefixβclosed : β{πc πp}{U : Set π} β (m : MetaRule {πc} {πp} U) β β{π'}{P : U β Set π'} β (RF[ m ] P β P) β RClosed m {π'} P
prefixβclosed _ prf c pr = prf (c , refl , pr)