summaryrefslogtreecommitdiff
path: root/src/Data/Term/Property.idr
diff options
context:
space:
mode:
Diffstat (limited to 'src/Data/Term/Property.idr')
-rw-r--r--src/Data/Term/Property.idr174
1 files changed, 136 insertions, 38 deletions
diff --git a/src/Data/Term/Property.idr b/src/Data/Term/Property.idr
index 2de450f..62f4caa 100644
--- a/src/Data/Term/Property.idr
+++ b/src/Data/Term/Property.idr
@@ -16,7 +16,7 @@ public export
record Property (sig : Signature) (k : Nat) where
constructor MkProp
0 Prop : forall n. (Fin k -> Term sig n) -> Type
- cong : forall n. {f, g : Fin k -> Term sig n} -> f .=. g -> Prop f -> Prop g
+ cong : forall n. (f, g : Fin k -> Term sig n) -> f .=. g -> Prop f -> Prop g
%name Property p, q
@@ -26,7 +26,7 @@ public export
Unifies : Term sig k -> Term sig k -> Property sig k
Unifies t u = MkProp
{ Prop = \f => f <$> t = f <$> u
- , cong = \cong, prf => Calc $
+ , cong = \_, _, cong, prf => Calc $
|~ _ <$> t
~~ _ <$> t ..<(subExtensional cong t)
~~ _ <$> u ...(prf)
@@ -35,7 +35,7 @@ Unifies t u = MkProp
public export
All : Vect n (Property sig k) -> Property sig k
-All ps = MkProp (\f => All (\p => p.Prop f) ps) (\cong => mapRel (\p => p.cong cong))
+All ps = MkProp (\f => All (\p => p.Prop f) ps) (\f, g, cong => mapRel (\p => p.cong f g cong))
public export
UnifiesAll : Vect n (Term sig k) -> Vect n (Term sig k) -> Property sig k
@@ -111,7 +111,7 @@ public export
Extension : Property sig k -> (Fin k -> Term sig n) -> Property sig n
Extension p f = MkProp
{ Prop = \g => p.Prop (g . f)
- , cong = \prf => p.cong (\i => subExtensional prf (f i))
+ , cong = \g, h, prf => p.cong (g . f) (h . f) (\i => subExtensional prf (f i))
}
-- Properties
@@ -128,8 +128,8 @@ extendCong2 :
p <=> q ->
Extension p f <=> Extension q g
extendCong2 prf1 prf2 = MkEquivalence
- (\h, x => prf2.leftToRight (h . g) $ p.cong (\i => cong (h <$>) $ prf1 i) x)
- (\h, x => prf2.rightToLeft (h . f) $ q.cong (\i => sym $ cong (h <$>) $ prf1 i) x)
+ (\h, x => prf2.leftToRight (h . g) $ p.cong _ _ (\i => cong (h <$>) $ prf1 i) x)
+ (\h, x => prf2.rightToLeft (h . f) $ q.cong _ _ (\i => sym $ cong (h <$>) $ prf1 i) x)
export
extendCong :
@@ -152,8 +152,8 @@ extendAssoc :
Extension (Extension p f) g <=> Extension p (g . f)
extendAssoc p f g =
MkEquivalence
- (\h => p.cong (\i => subAssoc h g (f i)))
- (\h => p.cong (\i => sym $ subAssoc h g (f i)))
+ (\h => p.cong _ _ (\i => subAssoc h g (f i)))
+ (\h => p.cong _ _ (\i => sym $ subAssoc h g (f i)))
export
extendUnify :
@@ -253,25 +253,78 @@ lteExtend :
(prf : f <= g) ->
p.Prop f ->
(Extension p g).Prop prf.sub
-lteExtend prf x = p.cong prf.prf x
+lteExtend prf x = p.cong _ _ prf.prf x
-- Most General ----------------------------------------------------------------
--- public export
--- record MostGeneral (p : Property sig k) where
+public export
+record MostGeneral (p : Property sig k) (f : Fin k -> Term sig n) where
+ constructor MkMostGeneral
+ valid : p.Prop f
+ universal : forall j. (g : Fin k -> Term sig j) -> p.Prop g -> Fin n -> Term sig j
+ factors :
+ forall j.
+ (g : Fin k -> Term sig j) ->
+ (v : p.Prop g) ->
+ g .=. universal g v . f
+ unique :
+ forall j.
+ (g : Fin k -> Term sig j) ->
+ (v : p.Prop g) ->
+ (h : Fin n -> Term sig j) ->
+ g .=. h . f ->
+ h .=. universal g v
+
+%name MostGeneral mg
+
+export
+varMostGeneral : p.Prop Var -> MostGeneral p Var
+varMostGeneral v =
+ MkMostGeneral
+ { valid = v
+ , universal = \g, _ => g
+ , factors = \g, _, x => Refl
+ , unique = \g, _, h, prf', x => sym $ prf' x
+ }
public export
Max : Property sig k -> Property sig k
Max p = MkProp
- { Prop = \f => (p.Prop f, forall n. (g : Fin k -> Term sig n) -> p.Prop g -> g <= f)
- , cong = \cong, (x, max) => (p.cong cong x, \g, y => lteCong (\_ => Refl) cong (max g y))
+ { Prop = MostGeneral p
+ , cong = \f, g, prf, mg =>
+ MkMostGeneral
+ { valid = p.cong f g prf mg.valid
+ , universal = mg.universal
+ , factors = \h, v, x => Calc $
+ |~ h x
+ ~~ mg.universal h v <$> f x ...(mg.factors h v x)
+ ~~ mg.universal h v <$> g x ...(compCongR (mg.universal h v) prf x)
+ , unique = \h, v, i, prf' =>
+ mg.unique h v i $
+ \x => Calc $
+ |~ h x
+ ~~ i <$> g x ...(prf' x)
+ ~~ i <$> f x ...(compCongR i (\x => sym $ prf x) x)
+ }
}
export
maxCong : p <=> q -> Max p <=> Max q
maxCong prf = MkEquivalence
- { leftToRight = \f, (x, max) => (prf.leftToRight f x, \g, y => max g (prf.rightToLeft g y))
- , rightToLeft = \f, (x, max) => (prf.rightToLeft f x, \g, y => max g (prf.leftToRight g y))
+ { leftToRight = \f, mg =>
+ MkMostGeneral
+ { valid = prf.leftToRight f mg.valid
+ , universal = \g, v => mg.universal g (prf.rightToLeft g v)
+ , factors = \g, v => mg.factors g (prf.rightToLeft g v)
+ , unique = \g, v => mg.unique g (prf.rightToLeft g v)
+ }
+ , rightToLeft = \f, mg =>
+ MkMostGeneral
+ { valid = prf.rightToLeft f mg.valid
+ , universal = \g, v => mg.universal g (prf.leftToRight g v)
+ , factors = \g, v => mg.factors g (prf.leftToRight g v)
+ , unique = \g, v => mg.unique g (prf.leftToRight g v)
+ }
}
-- Downward Closed -------------------------------------------------------------
@@ -306,26 +359,66 @@ optimistLemma :
{f : Fin k -> Term sig m} ->
{g : Fin m -> Term sig n} ->
DClosed p ->
- (Max (Extension p a)).Prop f ->
- (Max (Extension (All ps) (f . a))).Prop g ->
- (Max (Extension (All (p :: ps)) a)).Prop (g . f)
-optimistLemma prf (x, max1) (y, max2) =
- ( ( prf.closed ((g . f) . a) (f . a) (compLte (MkLte g (\i => Refl)) a) x
- :: (All ps).cong (\i => sym $ subAssoc g f (a i)) y
- )
- , \h, (x' :: y') =>
- let prf1 = max1 h x' in
- let y'' = (All ps).cong (\i => trans (subExtensional prf1.prf (a i)) (subAssoc prf1.sub f (a i))) y' in
- let prf2 = max2 prf1.sub y'' in
- MkLte
- { sub = prf2.sub
- , prf = \i => Calc $
- |~ h i
- ~~ prf1.sub <$> f i ...(prf1.prf i)
- ~~ (prf2.sub . g) <$> f i ...(subExtensional (prf2.prf) (f i))
- ~~ prf2.sub <$> (g <$> f i) ...(subAssoc prf2.sub g (f i))
- }
- )
+ (MostGeneral (Extension p a)) f ->
+ (MostGeneral (Extension (All ps) (f . a))) g ->
+ (MostGeneral (Extension (All (p :: ps)) a)) (g . f)
+optimistLemma closed mg mg' =
+ MkMostGeneral
+ { valid =
+ closed.closed ((g . f) . a) (f . a) (compLte (MkLte g (\i => Refl)) a) mg.valid ::
+ (All ps).cong _ _ (\i => sym $ subAssoc g f (a i)) mg'.valid
+ , universal = universal
+ , factors = factors
+ , unique = unique
+ }
+ where
+ coerce :
+ forall i.
+ (h : Fin k -> Term sig i) ->
+ (v : (Extension p a).Prop h) ->
+ (Extension (All ps) a).Prop h ->
+ (Extension (All ps) (f . a)).Prop (mg.universal h v)
+ coerce h v =
+ (All ps).cong _ _
+ (\x => Calc $
+ |~ h <$> a x
+ ~~ mg.universal h v . f <$> a x ...(subExtensional (mg.factors h v) (a x))
+ ~~ mg.universal h v <$> f <$> a x ...(subAssoc (mg.universal h v) f (a x)))
+ universal :
+ forall i.
+ (h : Fin k -> Term sig i) ->
+ (vs : (Extension (All (p :: ps)) a).Prop h) ->
+ Fin n -> Term sig i
+ universal h (v :: vs) =
+ mg'.universal (mg.universal h v) (coerce h v vs)
+
+ factors :
+ forall i.
+ (h : Fin k -> Term sig i) ->
+ (vs : (Extension (All (p :: ps)) a).Prop h) ->
+ h .=. universal h vs . (g . f)
+ factors h (v :: vs) x = Calc $
+ |~ h x
+ ~~ mg.universal h v <$> f x ...(mg.factors h v x)
+ ~~ mg'.universal (mg.universal h v) (coerce h v vs) . g <$> f x ...(subExtensional (mg'.factors (mg.universal h v) (coerce h v vs)) (f x))
+ ~~ mg'.universal (mg.universal h v) (coerce h v vs) <$> g <$> f x ...(subAssoc (mg'.universal (mg.universal h v) (coerce h v vs)) g (f x))
+
+ unique :
+ forall i.
+ (h : Fin k -> Term sig i) ->
+ (vs : (Extension (All (p :: ps)) a).Prop h) ->
+ (r : Fin n -> Term sig i) ->
+ h .=. r . (g . f) ->
+ r .=. universal h vs
+ unique h (v :: vs) r prf =
+ mg'.unique (mg.universal h v) (coerce h v vs) r $
+ \x => sym $
+ mg.unique h v (r . g)
+ (\x => Calc $
+ |~ h x
+ ~~ r <$> g <$> f x ...(prf x)
+ ~~ r . g <$> f x ..<(subAssoc r g (f x)))
+ x
export
failHead : Nothing (Extension p a) -> Nothing (Extension (All (p :: ps)) a)
@@ -339,6 +432,11 @@ failTail :
(Max (Extension p a)).Prop f ->
Nothing (Extension (All ps) (f . a)) ->
Nothing (Extension (All (p :: ps)) a)
-failTail (x, max) absurd g (y :: ys) =
- let prf = max g y in
- absurd prf.sub $ (All ps).cong (compLte prf a).prf ys
+failTail mg absurd g (v :: vs) =
+ absurd (mg.universal g v) $
+ (All ps).cong _ _
+ (\x => Calc $
+ |~ g <$> a x
+ ~~ mg.universal g v . f <$> a x ...(subExtensional (mg.factors g v) (a x))
+ ~~ mg.universal g v <$> f <$> a x ...(subAssoc (mg.universal g v) f (a x)))
+ vs