diff options
Diffstat (limited to 'src/Soat/SecondOrder/Algebra/Lift.idr')
-rw-r--r-- | src/Soat/SecondOrder/Algebra/Lift.idr | 658 |
1 files changed, 383 insertions, 275 deletions
diff --git a/src/Soat/SecondOrder/Algebra/Lift.idr b/src/Soat/SecondOrder/Algebra/Lift.idr index b08eb0e..e981593 100644 --- a/src/Soat/SecondOrder/Algebra/Lift.idr +++ b/src/Soat/SecondOrder/Algebra/Lift.idr @@ -1,7 +1,6 @@ module Soat.SecondOrder.Algebra.Lift import Data.List.Elem -import Data.Morphism.Indexed import Data.Setoid.Indexed import Soat.Data.Product @@ -11,6 +10,9 @@ import Soat.FirstOrder.Term import Soat.SecondOrder.Algebra import Soat.SecondOrder.Signature.Lift +import Syntax.PreorderReasoning.Setoid + +%ambiguity_depth 4 %default total public export @@ -21,31 +23,30 @@ project a ctx = MakeRawAlgebra (\op => a.sem ctx (MkOp (Op op.op)) . wrap (MkPair [])) public export -projectIsAlgebra : {a : _} -> forall rel . SecondOrder.Algebra.IsAlgebra (lift sig) a rel - -> (ctx : List sig.T) - -> FirstOrder.Algebra.IsAlgebra sig (project a ctx) (\t => rel (t, ctx)) -projectIsAlgebra a ctx = MkIsAlgebra - (\t => a.equivalence (t, ctx)) - (\op => a.semCong ctx _ . wrapIntro) - -public export projectAlgebra : SecondOrder.Algebra.Algebra (lift sig) -> (ctx : List sig.T) -> FirstOrder.Algebra.Algebra sig -projectAlgebra a ctx = MkAlgebra _ _ (projectIsAlgebra a.algebra ctx) +projectAlgebra a ctx = MkAlgebra + { raw = project a.raw ctx + , algebra = MkIsAlgebra + { equivalence = (a.setoidAt ctx).equivalence + , semCong = \op => a.algebra.semCong ctx _ . wrapIntro + } + } + public export projectIsHomo : {a, b : SecondOrder.Algebra.Algebra (lift sig)} -> {f : _} -> IsHomomorphism a b f -> (ctx : _) -> IsHomomorphism {sig = sig} (projectAlgebra a ctx) (projectAlgebra b ctx) (\t => f t ctx) -projectIsHomo {b = b} f ctx = MkIsHomomorphism - (\t => f.cong t ctx) - (\op, tms => - (b.algebra.equivalence _).transitive - (f.semHomo ctx (MkOp (Op op.op)) (wrap (MkPair []) tms)) $ - b.algebra.semCong ctx (MkOp (Op op.op)) $ - map (\(_,_) => (b.algebra.equivalence _).equalImpliesEq) $ - equalImpliesPwEq $ - mapWrap (MkPair []) tms) +projectIsHomo {b = b} homo ctx = MkIsHomomorphism + { cong = \t => homo.cong t ctx + , semHomo = \op, tms => CalcWith (index b.setoid _) $ + |~ f _ _ (a.raw.sem ctx (MkOp (Op op.op)) (wrap (MkPair []) tms)) + ~~ b.raw.sem ctx (MkOp (Op op.op)) (map (extendFunc f ctx) (wrap (MkPair []) tms)) + ...(homo.semHomo ctx (MkOp (Op op.op)) (wrap (MkPair []) tms)) + ~~ b.raw.sem ctx (MkOp (Op op.op)) (wrap (MkPair []) (map (\t => f t ctx) tms)) + .=.(cong (b.raw.sem ctx (MkOp (Op op.op))) $ mapWrap (MkPair []) {f = extendFunc f ctx} tms) + } public export projectHomo : {a, b : SecondOrder.Algebra.Algebra (lift sig)} -> Homomorphism a b @@ -57,85 +58,79 @@ public export -> (f : ctx `Sublist` ctx') -> FirstOrder.Algebra.Homomorphism {sig = sig} (projectAlgebra a ctx) (projectAlgebra a ctx') (.renameHomo) a f = MkHomomorphism - (\t => a.raw.rename t f) - (MkIsHomomorphism - (\t => a.algebra.renameCong t f) - (\op, tms => (a.algebra.equivalence _).transitive - (a.algebra.semNat f (MkOp (Op op.op)) (wrap (MkPair []) tms)) - (a.algebra.semCong _ (MkOp (Op op.op)) $ - map (\(_,_) => (a.algebra.equivalence _).equalImpliesEq) $ - pwSym (\_ => MkSymmetric symmetric) $ - pwTrans (\_ => MkTransitive transitive) - (wrapIntro $ - mapIntro'' (\t, tm, _, Refl => - cong (\f => a.raw.rename t f tm) $ - sym $ - uncurryCurry f) $ - equalImpliesPwEq Refl) $ - equalImpliesPwEq $ - sym $ - mapWrap (MkPair []) tms))) + { func = \t => a.raw.rename t f + , homo = MkIsHomomorphism + { cong = \t => a.algebra.renameCong t f + , semHomo = \op, tms => CalcWith (index a.setoid _) $ + |~ a.raw.rename _ f (a.raw.sem _ (MkOp (Op op.op)) (wrap (MkPair []) tms)) + ~~ a.raw.sem _ (MkOp (Op op.op)) (map (\ty => a.raw.rename (snd ty) (reflexive {x = fst ty} ++ f)) (wrap (MkPair []) tms)) + ...(a.algebra.semNat f (MkOp (Op op.op)) (wrap (MkPair []) tms)) + ~~ a.raw.sem _ (MkOp (Op op.op)) (wrap (MkPair []) (map (\t => a.raw.rename t f) tms)) + ...(a.algebra.semCong _ (MkOp (Op op.op)) $ + CalcWith (pwSetoid (reindex (\ty => (snd ty, fst ty ++ _)) a.setoid) _) $ + |~ map (\ty => a.raw.rename (snd ty) (reflexive {x = fst ty} ++ f)) (wrap (MkPair []) tms) + ~~ wrap (MkPair []) (map (\t => a.raw.rename t (reflexive {x = []} ++ f)) tms) + .=.(mapWrap (MkPair []) tms) + ~~ wrap (MkPair []) (map (\t => a.raw.rename t f) tms) + .=.(cong (wrap (MkPair [])) $ + pwEqImpliesEqual $ + mapIntro'' (\t, tm, _, Refl => cong (\f => a.raw.rename t f tm) $ uncurryCurry f) $ + equalImpliesPwEq Refl)) + } + } public export (.substHomo1) : (a : SecondOrder.Algebra.Algebra (lift sig)) -> (ctx : List sig.T) -> {ctx' : List sig.T} -> (tms : (\t => a.raw.U t ctx) ^ ctx') -> FirstOrder.Algebra.Homomorphism {sig = sig} (projectAlgebra a ctx') (projectAlgebra a ctx) (.substHomo1) a ctx tms = MkHomomorphism - (\t, tm => a.raw.subst t ctx tm tms) - (MkIsHomomorphism - (\t, eq => a.algebra.substCong t ctx eq $ pwRefl (\_ => (a.algebra.equivalence _).refl)) - (\op, tms' => (a.algebra.equivalence _).transitive - (a.algebra.substCompat ctx (MkOp (Op op.op)) (wrap (MkPair []) tms') tms) - (a.algebra.semCong ctx (MkOp (Op op.op)) $ - pwSym (\(_,_) => (a.algebra.equivalence _).sym) $ - pwTrans (\(_,_) => (a.algebra.equivalence _).trans) - (pwSym (\(_,_) => (a.algebra.equivalence _).sym) $ - wrapIntro $ - mapIntro'' (\t, tm, _, Refl => - a.algebra.substCong t ctx (a.algebra.equivalence _).reflexive $ - pwTrans (\_ => (a.algebra.equivalence _).trans) - (mapIntro'' (\t, tm, _, Refl => (a.algebra.equivalence _).transitive - ((a.algebra.equivalence _).equalImpliesEq $ - cong (\f => a.raw.rename t f tm) $ - uncurryCurry reflexive) - (a.algebra.renameId _ _ tm)) $ - equalImpliesPwEq Refl) $ - map (\_ => (a.algebra.equivalence _).equalImpliesEq) $ - equalImpliesPwEq $ - mapId tms) $ - equalImpliesPwEq Refl) $ - map (\(_,_) => (a.algebra.equivalence _).equalImpliesEq) $ - equalImpliesPwEq $ - sym $ - mapWrap (MkPair []) tms'))) + { func = \t, tm => a.raw.subst t ctx tm tms + , homo = MkIsHomomorphism + { cong = \t, eq => + a.algebra.substCong t ctx eq $ + (pwSetoid (a.setoidAt _) _).equivalence.reflexive _ + , semHomo = \op, tms' => CalcWith (index a.setoid _) $ + |~ a.raw.subst _ ctx (a.raw.sem ctx' (MkOp (Op op.op)) (wrap (MkPair []) tms')) tms + ~~ a.raw.sem ctx (MkOp (Op op.op)) (map (a.raw.extendSubst ctx tms) (wrap (MkPair []) tms')) + ...(a.algebra.substCompat ctx (MkOp (Op op.op)) (wrap (MkPair []) tms') tms) + ~~ a.raw.sem ctx (MkOp (Op op.op)) (wrap (MkPair []) (map (\t, tm => a.raw.subst t ctx tm tms) tms')) + ...(a.algebra.semCong ctx (MkOp (Op op.op)) $ + CalcWith (pwSetoid (reindex (\ty => (snd ty, fst ty ++ ctx)) a.setoid) _) $ + |~ map (a.raw.extendSubst ctx tms) (wrap (MkPair []) tms') + ~~ wrap (MkPair []) (map (\t, tm => a.raw.subst t ctx tm (map (\t => a.raw.rename t ([] {ys = []} ++ reflexive)) tms)) tms') + .=.(mapWrap (MkPair []) tms') + ~~ wrap (MkPair []) (map (\t, tm => a.raw.subst t ctx tm tms) tms') + ...(wrapIntro $ + mapIntro' (\t, eq => + a.algebra.substCong t ctx eq $ + CalcWith (pwSetoid (a.setoidAt _) _) $ + |~ map (\t => a.raw.rename t ([] {ys = []} ++ reflexive)) tms + ~~ map (\t => a.raw.rename t reflexive) tms + .=.(pwEqImpliesEqual $ + mapIntro' (\t => cong2 (a.raw.rename t) $ uncurryCurry reflexive) $ + equalImpliesPwEq Refl) + ~~ map (\t => id) tms + ...(mapIntro' (\t, Refl => a.algebra.renameId t ctx _) $ + equalImpliesPwEq Refl) + ~~ tms + .=.(mapId tms)) $ + (pwSetoid (a.setoidAt _) _).equivalence.reflexive _)) + } + } renameBodyFunc : (f : ctx `Sublist` ctx') - -> IFunction - (isetoid (flip Elem ctx)) - (FreeAlgebra {sig = sig} (isetoid (flip Elem ctx'))).setoid -renameBodyFunc f = MkIFunction (\_ => Done . curry f) (\_ => Done' . cong (curry f)) + -> cast (flip Elem ctx) ~> (FreeAlgebra {sig = sig} (irrelevantCast (flip Elem ctx'))).setoid +renameBodyFunc f = mate (\_ => Done . curry f) indexFunc : {ctx : List sig.T} -> (tms : Term sig (flip Elem ctx) ^ ts) - -> IFunction - (isetoid (flip Elem ts)) - (FreeAlgebra {sig = sig} (isetoid (flip Elem ctx))).setoid -indexFunc tms = MkIFunction - (\_ => index tms) - (\_ => ((FreeIsAlgebra (isetoid (flip Elem _))).equivalence _).equalImpliesEq . cong (index tms)) - --- renameFunc : (f : ctx `Sublist` ctx') --- -> IFunction --- (FreeAlgebra {sig = sig} (isetoid (flip Elem ctx))).setoid --- (FreeAlgebra {sig = sig} (isetoid (flip Elem ctx'))).setoid --- renameFunc f = MkIFunction --- (\_ => bindTerm {a = Free _} (renameBodyFunc f).func) --- (\t => bindTermCong {a = FreeAlgebra (isetoid (flip Elem _))} (renameBodyFunc f)) + -> cast (flip Elem ts) ~> (FreeAlgebra {sig = sig} (irrelevantCast (flip Elem ctx))).setoid +indexFunc tms = mate (\_ => index tms) public export Initial : (0 sig : _) -> SecondOrder.Algebra.RawAlgebra (lift sig) Initial sig = MakeRawAlgebra (\t, ctx => Term sig (flip Elem ctx) t) - (\t, f => bindTerm {a = Free _} (renameBodyFunc f).func) + (\t, f => bindTerm {a = Free _} (renameBodyFunc f).H) (\_, (MkOp (Op op)) => Call (MkOp op) . unwrap (MkPair [])) Done (\_, _, t, ts => bindTerm {a = Free _} (\_ => index ts) t) @@ -145,218 +140,331 @@ InitialIsAlgebra : (0 sig : _) -> SecondOrder.Algebra.IsAlgebra (lift sig) (Initial sig) - (\(t, ctx) => (~=~) {sig = sig} {v = flip Elem ctx} (\_ => Equal) t) InitialIsAlgebra sig = MkIsAlgebra - (\(t, ctx) => tmRelEq (\_ => equiv) t) - (\t, f => bindTermCong {a = FreeAlgebra (isetoid (flip Elem _))} (renameBodyFunc f)) - (\_ , (MkOp (Op op)) => Call' (MkOp op) . unwrapIntro) - (\_, _, eq, eqs => bindTermCong' - {a = FreeAlgebra (isetoid (flip Elem _))} + { equivalence = (bundle $ \(t, ctx) => index (FreeAlgebra (irrelevantCast (flip Elem ctx))).setoid t).equivalence + , renameCong = \t, f => bindTermCong ?renameCongEnv t + , semCong = \_ , (MkOp (Op op)) => Call' (MkOp op) . unwrapIntro + , substCong = \_, _, eq, eqs => bindTermCong' + {rel = \_ => Equal} + {a = FreeAlgebra (irrelevantCast (flip Elem _))} (\t, Refl => index eqs _) - eq) - (\t, ctx, tm => - tmRelSym (\_ => MkSymmetric symmetric) $ - bindUnique (renameBodyFunc reflexive) idHomo (\i => Done' $ sym $ curryUncurry id i) $ - tm) - (\t, f, g, tm => + eq + , renameId = \t, ctx, tm => + (FreeAlgebra (irrelevantCast (flip Elem _))).setoid.equivalence.symmetric _ _ _ $ + bindUnique ?renameIdEnv idHomo (\i => Done' $ sym $ curryUncurry id i) $ + tm + , renameComp = \t, f, g, tm => tmRelSym (\_ => MkSymmetric symmetric) $ bindUnique - {a = FreeAlgebra (isetoid (flip Elem _))} - (renameBodyFunc (transitive g f)) - (compHomo (bindHomo (renameBodyFunc f)) (bindHomo (renameBodyFunc g))) + ?renameCompEnv + -- (ifunc (\_ => curry (transitive g f))) + (compHomo (bindHomo ?renameCompFunc) (bindHomo ?renameCompFunc')) (\i => Done' $ sym $ curryUncurry (curry f . curry g) i) $ - tm) - (\f, (MkOp (Op op)), tms => + tm + , semNat = \f, (MkOp (Op op)), tms => Call' (MkOp op) $ - Pointwise.map (\_ => tmRelReflexive (\_ => MkReflexive reflexive)) $ - pwTrans (\_ => MkTransitive transitive) (equalImpliesPwEq $ bindTermsIsMap {a = Free _} _ _) $ - pwTrans (\_ => MkTransitive transitive) - (mapIntro' (\t, eq => - tmRelEqualIsEqual $ - bindTermCong' - {rel = \_ => Equal} - {a = FreeAlgebra (isetoid (flip Elem _))} - (\_, Refl => Done' $ sym $ curryUncurry (curry f) _) $ - tmRelReflexive (\_ => MkReflexive reflexive) $ - eq) $ - equalImpliesPwEq Refl) $ - equalImpliesPwEq $ - mapUnwrap _ _) - -- Pointwise.map (\_ => tmRelReflexive (\_ => MkReflexive reflexive)) $ - -- transitive (equalImpliesPwEq $ bindTermsIsMap {a = Free _} _ (unwrap (MkPair []) tms)) $ - -- transitive - -- (mapIntro - -- (\t, eq => - -- bindTermCong' - -- {v = isetoid (flip Elem _)} - -- {a = FreeAlgebra (isetoid (flip Elem _))} - -- (\_, Refl => Done' $ sym $ curryUncurry (curry f) _) $ - -- tmRelReflexive (\_ => MkReflexive reflexive) $ - -- eq) $ - -- equalImpliesPwEq Refl) $ - -- equalImpliesPwEq $ - -- mapUnwrap - -- (MkPair []) - -- (\ty => (renameFunc (reflexive ++ f)).func (snd ty)) - -- tms) - (\_, _ => Done' Refl) - (\t, f, tm, tms => + CalcWith (pwSetoid (FreeAlgebra (irrelevantCast (flip Elem _))).setoid _) $ + |~ bindTerms {a = Free _} (\_ => Done . curry f) (unwrap (MkPair []) tms) + ~~ map (\_ => bindTerm {a = Free _} (\_ => Done . curry f)) (unwrap (MkPair []) tms) + .=.(bindTermsIsMap {a = Free _} _ _) + ~~ map (\_ => bindTerm {a = Free _} (\_ => Done . curry (reflexive {x = []} ++ f))) (unwrap (MkPair []) tms) + ..<(mapIntro' (\t => + bindTermCong' + {rel = \_ => Equal} + {a = FreeAlgebra (irrelevantCast (flip Elem _))} + (\_, Refl => Done' $ curryUncurry (curry f) _)) $ + (pwSetoid (FreeAlgebra (irrelevantCast (flip Elem _))).setoid _).equivalence.reflexive _) + ~~ unwrap (MkPair []) (map (\ty => bindTerm {a = Free _} (\_ => Done . curry (reflexive {x = fst ty} ++ f))) tms) + .=.(mapUnwrap (MkPair []) tms) + , varNat = \_, _ => Done' Refl + , substNat = \t, f, tm, tms => bindUnique - {a = FreeAlgebra (isetoid (flip Elem _))} + {a = FreeAlgebra (irrelevantCast (flip Elem _))} (indexFunc _) - (compHomo (bindHomo (renameBodyFunc f)) (bindHomo (indexFunc tms))) - (\i => - tmRelReflexive (\_ => MkReflexive reflexive) $ - sym $ - indexMap tms i) - tm) - (\t, ctx, f, tm, tms => + (compHomo + (bindHomo ?substNatFunc) + (bindHomo (indexFunc tms))) + ?substNatCong + -- (\i => + -- tmRelReflexive (\_ => MkReflexive reflexive) $ + -- sym $ + -- indexMap tms i) + tm + , substExnat = \t, ctx, f, tm, tms => bindUnique - {a = FreeAlgebra (isetoid (flip Elem _))} + {a = FreeAlgebra (irrelevantCast (flip Elem _))} (indexFunc _) - (compHomo (bindHomo (indexFunc tms)) (bindHomo (renameBodyFunc f))) - (\i => - tmRelReflexive (\_ => MkReflexive reflexive) $ - sym $ - indexShuffle f i) - tm) - (\t, ctx, tm, tms, tms' => + (compHomo + (bindHomo (indexFunc tms)) + (bindHomo ?substExnatFunc)) + ?substExnatCong + -- (\i => + -- tmRelReflexive (\_ => MkReflexive reflexive) $ + -- sym $ + -- indexShuffle f i) + tm + , substComm = \t, ctx, tm, tms, tms' => bindUnique - {a = FreeAlgebra (isetoid (flip Elem _))} + {a = FreeAlgebra (irrelevantCast (flip Elem _))} (indexFunc _) - (compHomo (bindHomo (indexFunc tms')) (bindHomo (indexFunc tms))) - (\i => - tmRelReflexive (\_ => MkReflexive reflexive) $ - sym $ - indexMap tms i) - tm) - (\_, _, _ => tmRelRefl (\_ => MkReflexive reflexive) _) - (\t, ctx, tm => - tmRelSym (\_ => MkSymmetric symmetric) $ + (compHomo + (bindHomo (indexFunc tms')) + (bindHomo (indexFunc tms))) + ?substCommCong + -- (\i => + -- tmRelReflexive (\_ => MkReflexive reflexive) $ + -- sym $ + -- indexMap tms i) + tm + , substVarL = ?substVarL -- \_, _, _ => tmRelRefl (\_ => MkReflexive reflexive) _ + , substVarR = \t, ctx, tm => + (FreeAlgebra (irrelevantCast (flip Elem _))).setoid.equivalence.symmetric _ _ _ $ bindUnique - {a = FreeAlgebra (isetoid (flip Elem _))} + {a = FreeAlgebra (irrelevantCast (flip Elem _))} (indexFunc _) idHomo - (\i => - tmRelReflexive (\_ => MkReflexive reflexive) $ - sym $ - indexTabulate Done i) - tm) - (\ctx, (MkOp (Op op)), tms, tms' => + ?substVarRCong + -- (\i => + -- tmRelReflexive (\_ => MkReflexive reflexive) $ + -- sym $ + -- indexTabulate Done i) + tm + , substCompat = \ctx, (MkOp (Op op)), tms, tms' => Call' (MkOp op) $ - tmsRelTrans (\_ => MkTransitive transitive) - (tmsRelSym (\_ => MkSymmetric symmetric) $ - bindsUnique - {a = FreeAlgebra (isetoid (flip Elem _))} - (indexFunc tms') - (bindHomo (indexFunc _)) - (\i => - (tmRelTrans (\_ => MkTransitive transitive) - (tmRelReflexive (\_ => MkReflexive reflexive) $ - indexMap - {f = (\_ => bindTerm {a = Free _} (\_ => Done . curry (uncurry (curry reflexive))))} - tms' - i) $ - tmRelSym (\_ => MkSymmetric symmetric) $ - (bindUnique - {a = FreeAlgebra (isetoid (flip Elem _))} - (renameBodyFunc _) - idHomo - (\i => - Done' $ - sym $ - transitive (curryUncurry (curry reflexive) i) (curryUncurry id i)) - (index tms' i)))) - (unwrap (MkPair []) tms)) $ - tmsRelReflexive (\_ => MkReflexive reflexive) $ - mapUnwrap _ _) + CalcWith (pwSetoid (FreeAlgebra (irrelevantCast (flip Elem _))).setoid _) $ + |~ bindTerms {a = Free _} (\_ => index tms') (unwrap (MkPair []) tms) + ~~ map (\_ => bindTerm {a = Free _} (\_ => index tms')) (unwrap (MkPair []) tms) + .=.(bindTermsIsMap {a = Free _} _ _) + ~~ map (\t => (Initial sig).extendSubst ctx tms' ([], t)) (unwrap (MkPair []) tms) + ..<(mapIntro' (\t => bindTermCong' + {rel = \_ => Equal} + {a = FreeAlgebra (irrelevantCast (flip Elem _))} + (\t, Refl => CalcWith (index (FreeAlgebra (irrelevantCast (flip Elem _))).setoid _) $ + |~ index (map (\_ => bindTerm {a = Free _} (\_ => Done . curry ([] {ys = []} ++ reflexive))) tms') _ + ~~ bindTerm {a = Free _} (\_ => Done . curry ([] {ys = []} ++ reflexive)) (index tms' _) + .=.(indexMap tms' _) + ~~ index tms' _ + ..<(bindUnique + ?substCompatEnv + idHomo + (\i => Done' $ sym $ trans (curryUncurry _ i) (curryUncurry id i)) + (index tms' _)))) $ + (pwSetoid (FreeAlgebra (irrelevantCast (flip Elem _))).setoid _).equivalence.reflexive $ + unwrap (MkPair []) tms) + ~~ unwrap (MkPair []) (map ((Initial sig).extendSubst ctx tms') tms) + .=.(mapUnwrap (MkPair []) tms) + } +-- InitialIsAlgebra sig = MkIsAlgebra +-- (\(t, ctx) => tmRelEq (\_ => equiv) t) +-- (\t, f => bindTermCong {a = FreeAlgebra (irrelevantCast (flip Elem _))} (renameBodyFunc f)) +-- (\_ , (MkOp (Op op)) => Call' (MkOp op) . unwrapIntro) +-- (\_, _, eq, eqs => bindTermCong' +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (\t, Refl => index eqs _) +-- eq) +-- (\t, ctx, tm => +-- tmRelSym (\_ => MkSymmetric symmetric) $ +-- bindUnique (renameBodyFunc reflexive) idHomo (\i => Done' $ sym $ curryUncurry id i) $ +-- tm) +-- (\t, f, g, tm => +-- tmRelSym (\_ => MkSymmetric symmetric) $ +-- bindUnique +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (renameBodyFunc (transitive g f)) +-- (compHomo (bindHomo (renameBodyFunc f)) (bindHomo (renameBodyFunc g))) +-- (\i => Done' $ sym $ curryUncurry (curry f . curry g) i) $ +-- tm) +-- (\f, (MkOp (Op op)), tms => +-- Call' (MkOp op) $ +-- Pointwise.map (\_ => tmRelReflexive (\_ => MkReflexive reflexive)) $ +-- pwTrans (\_ => MkTransitive transitive) (equalImpliesPwEq $ bindTermsIsMap {a = Free _} _ _) $ +-- pwTrans (\_ => MkTransitive transitive) +-- (mapIntro' (\t, eq => +-- tmRelEqualIsEqual $ +-- bindTermCong' +-- {rel = \_ => Equal} +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (\_, Refl => Done' $ sym $ curryUncurry (curry f) _) $ +-- tmRelReflexive (\_ => MkReflexive reflexive) $ +-- eq) $ +-- equalImpliesPwEq Refl) $ +-- equalImpliesPwEq $ +-- mapUnwrap _ _) +-- -- Pointwise.map (\_ => tmRelReflexive (\_ => MkReflexive reflexive)) $ +-- -- transitive (equalImpliesPwEq $ bindTermsIsMap {a = Free _} _ (unwrap (MkPair []) tms)) $ +-- -- transitive +-- -- (mapIntro +-- -- (\t, eq => +-- -- bindTermCong' +-- -- {v = irrelevantCast (flip Elem _)} +-- -- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- -- (\_, Refl => Done' $ sym $ curryUncurry (curry f) _) $ +-- -- tmRelReflexive (\_ => MkReflexive reflexive) $ +-- -- eq) $ +-- -- equalImpliesPwEq Refl) $ +-- -- equalImpliesPwEq $ +-- -- mapUnwrap +-- -- (MkPair []) +-- -- (\ty => (renameFunc (reflexive ++ f)).func (snd ty)) +-- -- tms) +-- (\_, _ => Done' Refl) +-- (\t, f, tm, tms => +-- bindUnique +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (indexFunc _) +-- (compHomo (bindHomo (renameBodyFunc f)) (bindHomo (indexFunc tms))) +-- (\i => +-- tmRelReflexive (\_ => MkReflexive reflexive) $ +-- sym $ +-- indexMap tms i) +-- tm) +-- (\t, ctx, f, tm, tms => +-- bindUnique +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (indexFunc _) +-- (compHomo (bindHomo (indexFunc tms)) (bindHomo (renameBodyFunc f))) +-- (\i => +-- tmRelReflexive (\_ => MkReflexive reflexive) $ +-- sym $ +-- indexShuffle f i) +-- tm) +-- (\t, ctx, tm, tms, tms' => +-- bindUnique +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (indexFunc _) +-- (compHomo (bindHomo (indexFunc tms')) (bindHomo (indexFunc tms))) +-- (\i => +-- tmRelReflexive (\_ => MkReflexive reflexive) $ +-- sym $ +-- indexMap tms i) +-- tm) +-- (\_, _, _ => tmRelRefl (\_ => MkReflexive reflexive) _) +-- (\t, ctx, tm => +-- tmRelSym (\_ => MkSymmetric symmetric) $ +-- bindUnique +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (indexFunc _) +-- idHomo +-- (\i => +-- tmRelReflexive (\_ => MkReflexive reflexive) $ +-- sym $ +-- indexTabulate Done i) +-- tm) +-- (\ctx, (MkOp (Op op)), tms, tms' => +-- Call' (MkOp op) $ +-- tmsRelTrans (\_ => MkTransitive transitive) +-- (tmsRelSym (\_ => MkSymmetric symmetric) $ +-- bindsUnique +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (indexFunc tms') +-- (bindHomo (indexFunc _)) +-- (\i => +-- (tmRelTrans (\_ => MkTransitive transitive) +-- (tmRelReflexive (\_ => MkReflexive reflexive) $ +-- indexMap +-- {f = (\_ => bindTerm {a = Free _} (\_ => Done . curry (uncurry (curry reflexive))))} +-- tms' +-- i) $ +-- tmRelSym (\_ => MkSymmetric symmetric) $ +-- (bindUnique +-- {a = FreeAlgebra (irrelevantCast (flip Elem _))} +-- (renameBodyFunc _) +-- idHomo +-- (\i => +-- Done' $ +-- sym $ +-- transitive (curryUncurry (curry reflexive) i) (curryUncurry id i)) +-- (index tms' i)))) +-- (unwrap (MkPair []) tms)) $ +-- tmsRelReflexive (\_ => MkReflexive reflexive) $ +-- mapUnwrap _ _) -public export -InitialAlgebra : (0 sig : _) -> SecondOrder.Algebra.Algebra (lift sig) -InitialAlgebra sig = MkAlgebra (Initial sig) _ (InitialIsAlgebra sig) +-- public export +-- InitialAlgebra : (0 sig : _) -> SecondOrder.Algebra.Algebra (lift sig) +-- InitialAlgebra sig = MkAlgebra (Initial sig) _ (InitialIsAlgebra sig) -public export -freeToInitialIsHomo : (0 sig : _) -> (ctx : List sig.T) - -> IsHomomorphism {sig = sig} - (FreeAlgebra (isetoid (flip Elem ctx))) - (projectAlgebra (InitialAlgebra sig) ctx) - (\_ => Basics.id) -freeToInitialIsHomo sig ctx = MkIsHomomorphism - (\_ => id) - (\(MkOp op), tms => - Call' (MkOp op) $ - tmsRelSym (\_ => MkSymmetric symmetric) $ - tmsRelReflexive (\_ => MkReflexive reflexive) $ - transitive (unwrapWrap _ _) (mapId tms)) +-- public export +-- freeToInitialIsHomo : (0 sig : _) -> (ctx : List sig.T) +-- -> IsHomomorphism {sig = sig} +-- (FreeAlgebra (irrelevantCast (flip Elem ctx))) +-- (projectAlgebra (InitialAlgebra sig) ctx) +-- (\_ => Basics.id) +-- freeToInitialIsHomo sig ctx = MkIsHomomorphism +-- (\_ => id) +-- (\(MkOp op), tms => +-- Call' (MkOp op) $ +-- tmsRelSym (\_ => MkSymmetric symmetric) $ +-- tmsRelReflexive (\_ => MkReflexive reflexive) $ +-- transitive (unwrapWrap _ _) (mapId tms)) -public export -freeToInitialHomo : (0 sig : _) -> (ctx : List sig.T) - -> Homomorphism {sig = sig} - (FreeAlgebra (isetoid (flip Elem ctx))) - (projectAlgebra (InitialAlgebra sig) ctx) -freeToInitialHomo sig ctx = MkHomomorphism (\_ => id) (freeToInitialIsHomo sig ctx) +-- public export +-- freeToInitialHomo : (0 sig : _) -> (ctx : List sig.T) +-- -> Homomorphism {sig = sig} +-- (FreeAlgebra (irrelevantCast (flip Elem ctx))) +-- (projectAlgebra (InitialAlgebra sig) ctx) +-- freeToInitialHomo sig ctx = MkHomomorphism (\_ => id) (freeToInitialIsHomo sig ctx) -public export -fromInitial : (a : SecondOrder.Algebra.RawAlgebra (lift sig)) -> (t : sig.T) -> (ctx : List sig.T) - -> (Initial sig).U t ctx -> a.U t ctx -fromInitial a t ctx = bindTerm {a = project a ctx} (\_ => a.var) +-- public export +-- fromInitial : (a : SecondOrder.Algebra.RawAlgebra (lift sig)) -> (t : sig.T) -> (ctx : List sig.T) +-- -> (Initial sig).U t ctx -> a.U t ctx +-- fromInitial a t ctx = bindTerm {a = project a ctx} (\_ => a.var) -public export -fromInitialIsHomo : (a : SecondOrder.Algebra.Algebra (lift sig)) - -> IsHomomorphism (InitialAlgebra sig) a (fromInitial a.raw) -fromInitialIsHomo a = MkIsHomomorphism - (\t , ctx => bindTermCong {a = projectAlgebra a ctx} (a.varFunc ctx)) - (\t, f => bindUnique' - {v = isetoid (flip Elem _)} - {a = projectAlgebra a _} - (compHomo (bindHomo (a.varFunc _)) (bindHomo (renameBodyFunc f))) - (compHomo (a.renameHomo f) (bindHomo (a.varFunc _))) - (\i => (a.algebra.equivalence _).symmetric $ a.algebra.varNat f i)) - (\ctx, (MkOp (Op op)), tms => - a.algebra.semCong ctx (MkOp (Op op)) $ - map (\_ => (a.algebra.equivalence _).equalImpliesEq) $ - equalImpliesPwEq $ - transitive - (cong (wrap _) $ bindTermsIsMap {a = project a.raw _} (\_ => a.raw.var) $ unwrap _ tms) $ - transitive - (sym $ mapWrap (MkPair []) {f = \_ => fromInitial a.raw _ _} $ unwrap _ tms) $ - cong (map _) $ - wrapUnwrap tms) - (\_ => (a.algebra.equivalence _).reflexive) - (\t, ctx, tm, tms => bindUnique' - {v = isetoid (flip Elem _)} - {a = projectAlgebra a _} - (compHomo (bindHomo (a.varFunc _)) (bindHomo (indexFunc tms))) - (compHomo (a.substHomo1 ctx _) (bindHomo (a.varFunc _))) - (\i => - (a.algebra.equivalence _).transitive - (bindUnique - {v = isetoid (flip Elem _)} - {a = projectAlgebra a _} - (a.varFunc _) - (bindHomo (a.varFunc _)) - (\i => (a.algebra.equivalence _).reflexive) - (index tms i)) $ - (a.algebra.equivalence _).symmetric $ - (a.algebra.equivalence _).transitive - (a.algebra.substVarL ctx i _) $ - (a.algebra.equivalence _).equalImpliesEq $ - indexMap {f = \t => bindTerm {a = project a.raw ctx} (\_ => a.raw.var)} tms i) - tm) +-- public export +-- fromInitialIsHomo : (a : SecondOrder.Algebra.Algebra (lift sig)) +-- -> IsHomomorphism (InitialAlgebra sig) a (fromInitial a.raw) +-- fromInitialIsHomo a = MkIsHomomorphism +-- (\t , ctx => bindTermCong {a = projectAlgebra a ctx} (a.varFunc ctx)) +-- (\t, f => bindUnique' +-- {v = irrelevantCast (flip Elem _)} +-- {a = projectAlgebra a _} +-- (compHomo (bindHomo (a.varFunc _)) (bindHomo (renameBodyFunc f))) +-- (compHomo (a.renameHomo f) (bindHomo (a.varFunc _))) +-- (\i => (a.algebra.equivalence _).symmetric $ a.algebra.varNat f i)) +-- (\ctx, (MkOp (Op op)), tms => +-- a.algebra.semCong ctx (MkOp (Op op)) $ +-- map (\_ => (a.algebra.equivalence _).equalImpliesEq) $ +-- equalImpliesPwEq $ +-- transitive +-- (cong (wrap _) $ bindTermsIsMap {a = project a.raw _} (\_ => a.raw.var) $ unwrap _ tms) $ +-- transitive +-- (sym $ mapWrap (MkPair []) {f = \_ => fromInitial a.raw _ _} $ unwrap _ tms) $ +-- cong (map _) $ +-- wrapUnwrap tms) +-- (\_ => (a.algebra.equivalence _).reflexive) +-- (\t, ctx, tm, tms => bindUnique' +-- {v = irrelevantCast (flip Elem _)} +-- {a = projectAlgebra a _} +-- (compHomo (bindHomo (a.varFunc _)) (bindHomo (indexFunc tms))) +-- (compHomo (a.substHomo1 ctx _) (bindHomo (a.varFunc _))) +-- (\i => +-- (a.algebra.equivalence _).transitive +-- (bindUnique +-- {v = irrelevantCast (flip Elem _)} +-- {a = projectAlgebra a _} +-- (a.varFunc _) +-- (bindHomo (a.varFunc _)) +-- (\i => (a.algebra.equivalence _).reflexive) +-- (index tms i)) $ +-- (a.algebra.equivalence _).symmetric $ +-- (a.algebra.equivalence _).transitive +-- (a.algebra.substVarL ctx i _) $ +-- (a.algebra.equivalence _).equalImpliesEq $ +-- indexMap {f = \t => bindTerm {a = project a.raw ctx} (\_ => a.raw.var)} tms i) +-- tm) -public export -fromInitialHomo : (a : SecondOrder.Algebra.Algebra (lift sig)) - -> Homomorphism (InitialAlgebra sig) a -fromInitialHomo a = MkHomomorphism (fromInitial a.raw) (fromInitialIsHomo a) +-- public export +-- fromInitialHomo : (a : SecondOrder.Algebra.Algebra (lift sig)) +-- -> Homomorphism (InitialAlgebra sig) a +-- fromInitialHomo a = MkHomomorphism (fromInitial a.raw) (fromInitialIsHomo a) -public export -fromInitialUnique : {a : SecondOrder.Algebra.Algebra (lift sig)} - -> (f : Homomorphism (InitialAlgebra sig) a) - -> (t : sig.T) -> (ctx : List sig.T) -> (tm : Term sig (flip Elem ctx) t) - -> a.relation (t, ctx) (f.func t ctx tm) (fromInitial a.raw t ctx tm) -fromInitialUnique {sig = sig} {a = a} f t ctx = bindUnique - {v = isetoid (flip Elem _)} - {a = projectAlgebra a ctx} - (a.varFunc ctx) - (compHomo (projectHomo f ctx) (freeToInitialHomo sig ctx)) - f.homo.varHomo +-- public export +-- fromInitialUnique : {a : SecondOrder.Algebra.Algebra (lift sig)} +-- -> (f : Homomorphism (InitialAlgebra sig) a) +-- -> (t : sig.T) -> (ctx : List sig.T) -> (tm : Term sig (flip Elem ctx) t) +-- -> a.relation (t, ctx) (f.func t ctx tm) (fromInitial a.raw t ctx tm) +-- fromInitialUnique {sig = sig} {a = a} f t ctx = bindUnique +-- {v = irrelevantCast (flip Elem _)} +-- {a = projectAlgebra a ctx} +-- (a.varFunc ctx) +-- (compHomo (projectHomo f ctx) (freeToInitialHomo sig ctx)) +-- f.homo.varHomo |