diff options
Diffstat (limited to 'src/Inky')
-rw-r--r-- | src/Inky/Term.idr | 384 | ||||
-rw-r--r-- | src/Inky/Term/Parser.idr | 147 | ||||
-rw-r--r-- | src/Inky/Term/Pretty.idr | 260 |
3 files changed, 539 insertions, 252 deletions
diff --git a/src/Inky/Term.idr b/src/Inky/Term.idr index 88665ba..454c096 100644 --- a/src/Inky/Term.idr +++ b/src/Inky/Term.idr @@ -5,6 +5,7 @@ import public Inky.Type import Control.Function import Data.List.Quantifiers +import Data.Singleton import Data.These import Inky.Data.SnocList.Quantifiers import Inky.Decidable @@ -17,25 +18,43 @@ import Inky.Decidable.Maybe -------------------------------------------------------------------------------- public export -data Term : (tyCtx, tmCtx : SnocList String) -> Type where - Annot : Term tyCtx tmCtx -> Ty tyCtx -> Term tyCtx tmCtx - Var : Var tmCtx -> Term tyCtx tmCtx - Let : Term tyCtx tmCtx -> (x ** Term tyCtx (tmCtx :< x)) -> Term tyCtx tmCtx - LetTy : Ty tyCtx -> (x ** Term (tyCtx :< x) tmCtx) -> Term tyCtx tmCtx - Abs : (bound ** Term tyCtx (tmCtx <>< bound)) -> Term tyCtx tmCtx - App : Term tyCtx tmCtx -> List (Term tyCtx tmCtx) -> Term tyCtx tmCtx - Tup : Row (Term tyCtx tmCtx) -> Term tyCtx tmCtx - Prj : Term tyCtx tmCtx -> (l : String) -> Term tyCtx tmCtx - Inj : (l : String) -> Term tyCtx tmCtx -> Term tyCtx tmCtx - Case : Term tyCtx tmCtx -> Row (x ** Term tyCtx (tmCtx :< x)) -> Term tyCtx tmCtx - Roll : Term tyCtx tmCtx -> Term tyCtx tmCtx - Unroll : Term tyCtx tmCtx -> Term tyCtx tmCtx - Fold : Term tyCtx tmCtx -> (x ** Term tyCtx (tmCtx :< x)) -> Term tyCtx tmCtx - Map : (x ** Ty (tyCtx :< x)) -> Ty tyCtx -> Ty tyCtx -> Term tyCtx tmCtx - GetChildren : (x ** Ty (tyCtx :< x)) -> Ty tyCtx -> Term tyCtx tmCtx +data Term : (m : Type) -> (tyCtx, tmCtx : SnocList String) -> Type where + Annot : (meta : m) -> Term m tyCtx tmCtx -> Ty tyCtx -> Term m tyCtx tmCtx + Var : (meta : m) -> Var tmCtx -> Term m tyCtx tmCtx + Let : (meta : m) -> Term m tyCtx tmCtx -> (x ** Term m tyCtx (tmCtx :< x)) -> Term m tyCtx tmCtx + LetTy : (meta : m) -> Ty tyCtx -> (x ** Term m (tyCtx :< x) tmCtx) -> Term m tyCtx tmCtx + Abs : (meta : m) -> (bound ** Term m tyCtx (tmCtx <>< bound)) -> Term m tyCtx tmCtx + App : (meta : m) -> Term m tyCtx tmCtx -> List (Term m tyCtx tmCtx) -> Term m tyCtx tmCtx + Tup : (meta : m) -> Row (Term m tyCtx tmCtx) -> Term m tyCtx tmCtx + Prj : (meta : m) -> Term m tyCtx tmCtx -> (l : String) -> Term m tyCtx tmCtx + Inj : (meta : m) -> (l : String) -> Term m tyCtx tmCtx -> Term m tyCtx tmCtx + Case : (meta : m) -> Term m tyCtx tmCtx -> Row (x ** Term m tyCtx (tmCtx :< x)) -> Term m tyCtx tmCtx + Roll : (meta : m) -> Term m tyCtx tmCtx -> Term m tyCtx tmCtx + Unroll : (meta : m) -> Term m tyCtx tmCtx -> Term m tyCtx tmCtx + Fold : (meta : m) -> Term m tyCtx tmCtx -> (x ** Term m tyCtx (tmCtx :< x)) -> Term m tyCtx tmCtx + Map : (meta : m) -> (x ** Ty (tyCtx :< x)) -> Ty tyCtx -> Ty tyCtx -> Term m tyCtx tmCtx + GetChildren : (meta : m) -> (x ** Ty (tyCtx :< x)) -> Ty tyCtx -> Term m tyCtx tmCtx %name Term e, f, t, u +export +(.meta) : Term m tyCtx tmCtx -> m +(Annot meta _ _).meta = meta +(Var meta _).meta = meta +(Let meta _ _).meta = meta +(LetTy meta _ _).meta = meta +(Abs meta _).meta = meta +(App meta _ _).meta = meta +(Tup meta _).meta = meta +(Prj meta _ _).meta = meta +(Inj meta _ _).meta = meta +(Case meta _ _).meta = meta +(Roll meta _).meta = meta +(Unroll meta _).meta = meta +(Fold meta _ _).meta = meta +(Map meta _ _ _).meta = meta +(GetChildren meta _ _).meta = meta + -------------------------------------------------------------------------------- -- Well Formed ----------------------------------------------------------------- -------------------------------------------------------------------------------- @@ -67,6 +86,13 @@ data NotFunction : (bound : List String) -> (a : Ty tyCtx) -> Type %name NotFunction contra export +isFunctionRecompute : + {a : Ty tyCtx} -> IsFunction bound a dom cod -> (Singleton dom, Singleton cod) +isFunctionRecompute Done = (Val _, Val _) +isFunctionRecompute (Step {a} prf) = + mapFst (\case Val _ => Val _) $ isFunctionRecompute prf + +export isFunctionUnique : IsFunction bound a dom cod -> IsFunction bound a dom' cod' -> (dom = dom', cod = cod') isFunctionUnique Done Done = (Refl, Refl) @@ -102,40 +128,40 @@ isFunction (x :: bound) a = namespace Modes public export - data SynthsOnly : Term tyCtx tmCtx -> Type where - Annot : SynthsOnly (Annot t a) - Var : SynthsOnly (Var i) - App : SynthsOnly (App f ts) - Prj : SynthsOnly (Prj e l) - Unroll : SynthsOnly (Unroll e) - Map : SynthsOnly (Map (x ** a) b c) - GetChildren : SynthsOnly (GetChildren (x ** a) b) + data SynthsOnly : Term m tyCtx tmCtx -> Type where + Annot : SynthsOnly (Annot _ t a) + Var : SynthsOnly (Var _ i) + App : SynthsOnly (App _ f ts) + Prj : SynthsOnly (Prj _ e l) + Unroll : SynthsOnly (Unroll _ e) + Map : SynthsOnly (Map _ (x ** a) b c) + GetChildren : SynthsOnly (GetChildren _ (x ** a) b) public export - data ChecksOnly : Term tyCtx tmCtx -> Type where - Abs : ChecksOnly (Abs (bounds ** t)) - Inj : ChecksOnly (Inj l t) - Case : ChecksOnly (Case e ts) - Roll : ChecksOnly (Roll t) - Fold : ChecksOnly (Fold e (x ** t)) + data ChecksOnly : Term m tyCtx tmCtx -> Type where + Abs : ChecksOnly (Abs _ (bounds ** t)) + Inj : ChecksOnly (Inj _ l t) + Case : ChecksOnly (Case _ e ts) + Roll : ChecksOnly (Roll _ t) + Fold : ChecksOnly (Fold _ e (x ** t)) public export data Synths : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Term tyCtx tmCtx -> Ty [<] -> Type + Term m tyCtx tmCtx -> Ty [<] -> Type public export data Checks : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Ty [<] -> Term tyCtx tmCtx -> Type + Ty [<] -> Term m tyCtx tmCtx -> Type namespace Spine public export data CheckSpine : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Ty [<] -> List (Term tyCtx tmCtx) -> Ty [<] -> Type + Ty [<] -> List (Term m tyCtx tmCtx) -> Ty [<] -> Type where Nil : CheckSpine tyEnv tmEnv a [] a (::) : @@ -150,7 +176,7 @@ namespace Synths data AllSynths : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - (ts : Context (Term tyCtx tmCtx)) -> All (const $ Ty [<]) ts.names -> Type + (ts : Context (Term m tyCtx tmCtx)) -> All (const $ Ty [<]) ts.names -> Type where Lin : AllSynths tyEnv tmEnv [<] [<] (:<) : @@ -165,7 +191,7 @@ namespace Checks data AllChecks : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Context (Ty [<]) -> Context (Term tyCtx tmCtx) -> Type + Context (Ty [<]) -> Context (Term m tyCtx tmCtx) -> Type where Base : AllChecks tyEnv tmEnv [<] [<] Step : @@ -181,7 +207,7 @@ namespace Branches data AllBranches : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Context (Ty [<]) -> Ty [<] -> Context (x ** Term tyCtx (tmCtx :< x)) -> Type + Context (Ty [<]) -> Ty [<] -> Context (x ** Term m tyCtx (tmCtx :< x)) -> Type where Base : AllBranches tyEnv tmEnv [<] a [<] Step : @@ -196,43 +222,43 @@ data Synths where AnnotS : Not (IllFormed a) -> Checks tyEnv tmEnv (sub tyEnv a) t -> - Synths tyEnv tmEnv (Annot t a) (sub tyEnv a) + Synths tyEnv tmEnv (Annot meta t a) (sub tyEnv a) VarS : - Synths tyEnv tmEnv (Var i) (indexAll i.pos tmEnv).extract + Synths tyEnv tmEnv (Var meta i) (indexAll i.pos tmEnv).extract LetS : Synths tyEnv tmEnv e a -> Synths tyEnv (tmEnv :< (a `Over` Id)) f b -> - Synths tyEnv tmEnv (Let e (x ** f)) b + Synths tyEnv tmEnv (Let meta e (x ** f)) b LetTyS : Not (IllFormed a) -> Synths (tyEnv :< (sub tyEnv a `Over` Id)) tmEnv e b -> - Synths tyEnv tmEnv (LetTy a (x ** e)) b + Synths tyEnv tmEnv (LetTy meta a (x ** e)) b AppS : Synths tyEnv tmEnv f a -> CheckSpine tyEnv tmEnv a ts b -> - Synths tyEnv tmEnv (App f ts) b + Synths tyEnv tmEnv (App meta f ts) b TupS : AllSynths tyEnv tmEnv es.context as -> - Synths tyEnv tmEnv (Tup es) (TProd (fromAll es as)) + Synths tyEnv tmEnv (Tup meta es) (TProd (fromAll es as)) PrjS : Synths tyEnv tmEnv e (TProd as) -> Elem (l :- a) as.context -> - Synths tyEnv tmEnv (Prj e l) a + Synths tyEnv tmEnv (Prj meta e l) a UnrollS : Synths tyEnv tmEnv e (TFix x a) -> - Synths tyEnv tmEnv (Unroll e) (sub [<TFix x a `Over` Id] a) + Synths tyEnv tmEnv (Unroll meta e) (sub [<TFix x a `Over` Id] a) MapS : Not (IllFormed (TFix x a)) -> Not (IllFormed b) -> Not (IllFormed c) -> - Synths tyEnv tmEnv (Map (x ** a) b c) + Synths tyEnv tmEnv (Map meta (x ** a) b c) (TArrow (TArrow (sub tyEnv b) (sub tyEnv c)) (TArrow (sub (tyEnv :< (sub tyEnv b `Over` Id)) a) (sub (tyEnv :< (sub tyEnv c `Over` Id)) a))) GetChildrenS : Not (IllFormed (TFix x a)) -> Not (IllFormed b) -> - Synths tyEnv tmEnv (GetChildren (x ** a) b) + Synths tyEnv tmEnv (GetChildren meta (x ** a) b) (TArrow (sub (tyEnv :< (sub tyEnv b `Over` Id)) a) (TProd [<"Children" :- sub tyEnv b @@ -247,33 +273,33 @@ data Checks where LetC : Synths tyEnv tmEnv e a -> Checks tyEnv (tmEnv :< (a `Over` Id)) b t -> - Checks tyEnv tmEnv b (Let e (x ** t)) + Checks tyEnv tmEnv b (Let meta e (x ** t)) LetTyC : Not (IllFormed a) -> Checks (tyEnv :< (sub tyEnv a `Over` Id)) tmEnv b t -> - Checks tyEnv tmEnv b (LetTy a (x ** t)) + Checks tyEnv tmEnv b (LetTy meta a (x ** t)) AbsC : IsFunction bound a dom cod -> Checks tyEnv (tmEnv <>< mapProperty (`Over` Id) dom) cod t -> - Checks tyEnv tmEnv a (Abs (bound ** t)) + Checks tyEnv tmEnv a (Abs meta (bound ** t)) TupC : AllChecks tyEnv tmEnv as.context ts.context -> - Checks tyEnv tmEnv (TProd as) (Tup ts) + Checks tyEnv tmEnv (TProd as) (Tup meta ts) InjC : Elem (l :- a) as.context -> Checks tyEnv tmEnv a t -> - Checks tyEnv tmEnv (TSum as) (Inj l t) + Checks tyEnv tmEnv (TSum as) (Inj meta l t) CaseC : Synths tyEnv tmEnv e (TSum as) -> AllBranches tyEnv tmEnv as.context a ts.context -> - Checks tyEnv tmEnv a (Case e ts) + Checks tyEnv tmEnv a (Case meta e ts) RollC : Checks tyEnv tmEnv (sub [<TFix x a `Over` Id] a) t -> - Checks tyEnv tmEnv (TFix x a) (Roll t) + Checks tyEnv tmEnv (TFix x a) (Roll meta t) FoldC : Synths tyEnv tmEnv e (TFix x a) -> Checks tyEnv (tmEnv :< (sub [<b `Over` Id] a `Over` Id)) b t -> - Checks tyEnv tmEnv b (Fold e (y ** t)) + Checks tyEnv tmEnv b (Fold meta e (y ** t)) %name Synths prf %name Checks prf @@ -282,19 +308,19 @@ public export data NotSynths : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Term tyCtx tmCtx -> Type + Term m tyCtx tmCtx -> Type public export data NotChecks : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Ty [<] -> Term tyCtx tmCtx -> Type + Ty [<] -> Term m tyCtx tmCtx -> Type namespace Spine public export data NotCheckSpine : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Ty [<] -> List (Term tyCtx tmCtx) -> Type + Ty [<] -> List (Term m tyCtx tmCtx) -> Type where Step1 : ((b, c : Ty [<]) -> Not (a = TArrow b c)) -> @@ -310,7 +336,7 @@ namespace Synths data AnyNotSynths : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - (ts : Context (Term tyCtx tmCtx)) -> Type + (ts : Context (Term m tyCtx tmCtx)) -> Type where Step : These (NotSynths tyEnv tmEnv t) (AnyNotSynths tyEnv tmEnv ts) -> @@ -323,7 +349,7 @@ namespace Checks data AnyNotChecks : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Context (Ty [<]) -> Context (Term tyCtx tmCtx) -> Type + Context (Ty [<]) -> Context (Term m tyCtx tmCtx) -> Type where Base1 : AnyNotChecks tyEnv tmEnv (as :< la) [<] Step1 : @@ -341,7 +367,7 @@ namespace Branches data AnyNotBranches : All (const $ Thinned Ty [<]) tyCtx -> All (const $ Thinned Ty [<]) tmCtx -> - Context (Ty [<]) -> Ty [<] -> Context (x ** Term tyCtx (tmCtx :< x)) -> Type + Context (Ty [<]) -> Ty [<] -> Context (x ** Term m tyCtx (tmCtx :< x)) -> Type where Base1 : AnyNotBranches tyEnv tmEnv (as :< a) b [<] Step1 : @@ -362,51 +388,51 @@ data NotSynths where NotSynths tyEnv tmEnv t AnnotNS : These (IllFormed a) (NotChecks tyEnv tmEnv (sub tyEnv a) t) -> - NotSynths tyEnv tmEnv (Annot t a) + NotSynths tyEnv tmEnv (Annot meta t a) LetNS1 : NotSynths tyEnv tmEnv e -> - NotSynths tyEnv tmEnv (Let e (x ** f)) + NotSynths tyEnv tmEnv (Let meta e (x ** f)) LetNS2 : Synths tyEnv tmEnv e a -> NotSynths tyEnv (tmEnv :< (a `Over` Id)) f -> - NotSynths tyEnv tmEnv (Let e (x ** f)) + NotSynths tyEnv tmEnv (Let meta e (x ** f)) LetTyNS : These (IllFormed a) (NotSynths (tyEnv :< (sub tyEnv a `Over` Id)) tmEnv e) -> - NotSynths tyEnv tmEnv (LetTy a (x ** e)) + NotSynths tyEnv tmEnv (LetTy meta a (x ** e)) AppNS1 : NotSynths tyEnv tmEnv f -> - NotSynths tyEnv tmEnv (App f ts) + NotSynths tyEnv tmEnv (App meta f ts) AppNS2 : Synths tyEnv tmEnv f a -> NotCheckSpine tyEnv tmEnv a ts -> - NotSynths tyEnv tmEnv (App f ts) + NotSynths tyEnv tmEnv (App meta f ts) TupNS : AnyNotSynths tyEnv tmEnv es.context -> - NotSynths tyEnv tmEnv (Tup es) + NotSynths tyEnv tmEnv (Tup meta es) PrjNS1 : NotSynths tyEnv tmEnv e -> - NotSynths tyEnv tmEnv (Prj e l) + NotSynths tyEnv tmEnv (Prj meta e l) PrjNS2 : Synths tyEnv tmEnv e a -> ((as : Row (Ty [<])) -> Not (a = TProd as)) -> - NotSynths tyEnv tmEnv (Prj e l) + NotSynths tyEnv tmEnv (Prj meta e l) PrjNS3 : Synths tyEnv tmEnv e (TProd as) -> ((a : Ty [<]) -> Not (Elem (l :- a) as.context)) -> - NotSynths tyEnv tmEnv (Prj e l) + NotSynths tyEnv tmEnv (Prj meta e l) UnrollNS1 : NotSynths tyEnv tmEnv e -> - NotSynths tyEnv tmEnv (Unroll e) + NotSynths tyEnv tmEnv (Unroll meta e) UnrollNS2 : Synths tyEnv tmEnv e a -> ((x : String) -> (b : Ty [<x]) -> Not (a = TFix x b)) -> - NotSynths tyEnv tmEnv (Unroll e) + NotSynths tyEnv tmEnv (Unroll meta e) MapNS : These (IllFormed (TFix x a)) (These (IllFormed b) (IllFormed c)) -> - NotSynths tyEnv tmEnv (Map (x ** a) b c) + NotSynths tyEnv tmEnv (Map meta (x ** a) b c) GetChildrenNS : These (IllFormed (TFix x a)) (IllFormed b) -> - NotSynths tyEnv tmEnv (GetChildren (x ** a) b) + NotSynths tyEnv tmEnv (GetChildren meta (x ** a) b) data NotChecks where EmbedNC1 : @@ -420,76 +446,112 @@ data NotChecks where NotChecks tyEnv tmEnv b e LetNC1 : NotSynths tyEnv tmEnv e -> - NotChecks tyEnv tmEnv b (Let e (x ** t)) + NotChecks tyEnv tmEnv b (Let meta e (x ** t)) LetNC2 : Synths tyEnv tmEnv e a -> NotChecks tyEnv (tmEnv :< (a `Over` Id)) b t -> - NotChecks tyEnv tmEnv b (Let e (x ** t)) + NotChecks tyEnv tmEnv b (Let meta e (x ** t)) LetTyNC : These (IllFormed a) (NotChecks (tyEnv :< (sub tyEnv a `Over` Id)) tmEnv b t) -> - NotChecks tyEnv tmEnv b (LetTy a (x ** t)) + NotChecks tyEnv tmEnv b (LetTy meta a (x ** t)) AbsNC1 : NotFunction bound a -> - NotChecks tyEnv tmEnv a (Abs (bound ** t)) + NotChecks tyEnv tmEnv a (Abs meta (bound ** t)) AbsNC2 : IsFunction bound a dom cod -> NotChecks tyEnv (tmEnv <>< mapProperty (`Over` Id) dom) cod t -> - NotChecks tyEnv tmEnv a (Abs (bound ** t)) + NotChecks tyEnv tmEnv a (Abs meta (bound ** t)) TupNC1 : ((as : Row (Ty [<])) -> Not (a = TProd as)) -> - NotChecks tyEnv tmEnv a (Tup ts) + NotChecks tyEnv tmEnv a (Tup meta ts) TupNC2 : AnyNotChecks tyEnv tmEnv as.context ts.context -> - NotChecks tyEnv tmEnv (TProd as) (Tup ts) + NotChecks tyEnv tmEnv (TProd as) (Tup meta ts) InjNC1 : ((as : Row (Ty [<])) -> Not (a = TSum as)) -> - NotChecks tyEnv tmEnv a (Inj l t) + NotChecks tyEnv tmEnv a (Inj meta l t) InjNC2 : ((a : Ty [<]) -> Not (Elem (l :- a) as.context)) -> - NotChecks tyEnv tmEnv (TSum as) (Inj l t) + NotChecks tyEnv tmEnv (TSum as) (Inj meta l t) InjNC3 : Elem (l :- a) as.context -> NotChecks tyEnv tmEnv a t -> - NotChecks tyEnv tmEnv (TSum as) (Inj l t) + NotChecks tyEnv tmEnv (TSum as) (Inj meta l t) CaseNC1 : NotSynths tyEnv tmEnv e -> - NotChecks tyEnv tmEnv a (Case e ts) + NotChecks tyEnv tmEnv a (Case meta e ts) CaseNC2 : Synths tyEnv tmEnv e b -> ((as : Row (Ty [<])) -> Not (b = TSum as)) -> - NotChecks tyEnv tmEnv a (Case e ts) + NotChecks tyEnv tmEnv a (Case meta e ts) CaseNC3 : Synths tyEnv tmEnv e (TSum as) -> AnyNotBranches tyEnv tmEnv as.context a ts.context -> - NotChecks tyEnv tmEnv a (Case e ts) + NotChecks tyEnv tmEnv a (Case meta e ts) RollNC1 : ((x : String) -> (b : Ty [<x]) -> Not (a = TFix x b)) -> - NotChecks tyEnv tmEnv a (Roll t) + NotChecks tyEnv tmEnv a (Roll meta t) RollNC2 : NotChecks tyEnv tmEnv (sub [<TFix x a `Over` Id] a) t -> - NotChecks tyEnv tmEnv (TFix x a) (Roll t) + NotChecks tyEnv tmEnv (TFix x a) (Roll meta t) FoldNC1 : NotSynths tyEnv tmEnv e -> - NotChecks tyEnv tmEnv b (Fold e (y ** t)) + NotChecks tyEnv tmEnv b (Fold meta e (y ** t)) FoldNC2 : Synths tyEnv tmEnv e a -> ((x : String) -> (c : Ty [<x]) -> Not (a = TFix x c)) -> - NotChecks tyEnv tmEnv b (Fold e (y ** t)) + NotChecks tyEnv tmEnv b (Fold meta e (y ** t)) FoldNC3 : Synths tyEnv tmEnv e (TFix x a) -> NotChecks tyEnv (tmEnv :< (sub [<b `Over` Id] a `Over` Id)) b t -> - NotChecks tyEnv tmEnv b (Fold e (y ** t)) + NotChecks tyEnv tmEnv b (Fold meta e (y ** t)) %name NotSynths contra %name NotChecks contra -Uninhabited (NotSynths tyEnv tmEnv (Var i)) where +Uninhabited (NotSynths tyEnv tmEnv (Var meta i)) where uninhabited (ChecksNS Abs) impossible uninhabited (ChecksNS Inj) impossible uninhabited (ChecksNS Case) impossible uninhabited (ChecksNS Roll) impossible uninhabited (ChecksNS Fold) impossible +-- Can recompute type from synthesis proof + +export +synthsRecompute : + {tyEnv : _} -> {tmEnv : _} -> {e : _} -> + Synths tyEnv tmEnv e a -> Singleton a +checkSpineRecompute : + {tyEnv : _} -> {tmEnv : _} -> {a : _} -> + CheckSpine tyEnv tmEnv a ts b -> Singleton b +allSynthsRecompute : + {tyEnv : _} -> {tmEnv : _} -> {es : Context _} -> + {0 as : All (const $ Ty [<]) es.names} -> + AllSynths tyEnv tmEnv es as -> Singleton as + +synthsRecompute (AnnotS wf prf) = Val _ +synthsRecompute VarS = Val _ +synthsRecompute (LetS prf1 prf2) with (synthsRecompute prf1) + _ | Val _ = synthsRecompute prf2 +synthsRecompute (LetTyS wf prf) = synthsRecompute prf +synthsRecompute (AppS prf prfs) with (synthsRecompute prf) + _ | Val _ = checkSpineRecompute prfs +synthsRecompute (TupS prfs) with (allSynthsRecompute prfs) + _ | Val _ = Val _ +synthsRecompute (PrjS prf i) with (synthsRecompute prf) + _ | Val _ = [| (nameOf i).value |] +synthsRecompute (UnrollS prf) with (synthsRecompute prf) + _ | Val _ = Val _ +synthsRecompute (MapS f g h) = Val _ +synthsRecompute (GetChildrenS f g) = Val _ + +checkSpineRecompute [] = Val _ +checkSpineRecompute (prf :: prfs) = checkSpineRecompute prfs + +allSynthsRecompute [<] = Val _ +allSynthsRecompute (prfs :< prf) = [| allSynthsRecompute prfs :< synthsRecompute prf |] + -- Synthesis gives unique types synthsUnique : Synths tyEnv tmEnv e a -> Synths tyEnv tmEnv e b -> a = b @@ -658,58 +720,58 @@ fallbackCheck prf p a = synths : (tyEnv : All (const $ Thinned Ty [<]) tyCtx) -> (tmEnv : All (const $ Thinned Ty [<]) tmCtx) -> - (e : Term tyCtx tmCtx) -> + (e : Term m tyCtx tmCtx) -> Proof (Ty [<]) (Synths tyEnv tmEnv e) (NotSynths tyEnv tmEnv e) export checks : (tyEnv : All (const $ Thinned Ty [<]) tyCtx) -> (tmEnv : All (const $ Thinned Ty [<]) tmCtx) -> - (a : Ty [<]) -> (t : Term tyCtx tmCtx) -> + (a : Ty [<]) -> (t : Term m tyCtx tmCtx) -> LazyEither (Checks tyEnv tmEnv a t) (NotChecks tyEnv tmEnv a t) checkSpine : (tyEnv : All (const $ Thinned Ty [<]) tyCtx) -> (tmEnv : All (const $ Thinned Ty [<]) tmCtx) -> - (a : Ty [<]) -> (ts : List (Term tyCtx tmCtx)) -> + (a : Ty [<]) -> (ts : List (Term m tyCtx tmCtx)) -> Proof (Ty [<]) (CheckSpine tyEnv tmEnv a ts) (NotCheckSpine tyEnv tmEnv a ts) allSynths : (tyEnv : All (const $ Thinned Ty [<]) tyCtx) -> (tmEnv : All (const $ Thinned Ty [<]) tmCtx) -> - (es : Context (Term tyCtx tmCtx)) -> + (es : Context (Term m tyCtx tmCtx)) -> Proof (All (const $ Ty [<]) es.names) (AllSynths tyEnv tmEnv es) (AnyNotSynths tyEnv tmEnv es) allChecks : (tyEnv : All (const $ Thinned Ty [<]) tyCtx) -> (tmEnv : All (const $ Thinned Ty [<]) tmCtx) -> - (as : Context (Ty [<])) -> (ts : Context (Term tyCtx tmCtx)) -> + (as : Context (Ty [<])) -> (ts : Context (Term m tyCtx tmCtx)) -> LazyEither (AllChecks tyEnv tmEnv as ts) (AnyNotChecks tyEnv tmEnv as ts) allBranches : (tyEnv : All (const $ Thinned Ty [<]) tyCtx) -> (tmEnv : All (const $ Thinned Ty [<]) tmCtx) -> - (as : Context (Ty [<])) -> (a : Ty [<]) -> (ts : Context (x ** Term tyCtx (tmCtx :< x))) -> + (as : Context (Ty [<])) -> (a : Ty [<]) -> (ts : Context (x ** Term m tyCtx (tmCtx :< x))) -> LazyEither (AllBranches tyEnv tmEnv as a ts) (AnyNotBranches tyEnv tmEnv as a ts) -synths tyEnv tmEnv (Annot t a) = +synths tyEnv tmEnv (Annot _ t a) = pure (sub tyEnv a) $ map (uncurry AnnotS) AnnotNS $ all (not $ illFormed a) (checks tyEnv tmEnv (sub tyEnv a) t) -synths tyEnv tmEnv (Var i) = Just (indexAll i.pos tmEnv).extract `Because` VarS -synths tyEnv tmEnv (Let e (x ** f)) = +synths tyEnv tmEnv (Var _ i) = Just (indexAll i.pos tmEnv).extract `Because` VarS +synths tyEnv tmEnv (Let _ e (x ** f)) = map snd (\(_, _), (prf1, prf2) => LetS prf1 prf2) (either LetNS1 (\xPrfs => uncurry LetNS2 (snd xPrfs))) $ (a := synths tyEnv tmEnv e) >=> synths tyEnv (tmEnv :< (a `Over` Id)) f -synths tyEnv tmEnv (LetTy a (x ** e)) = +synths tyEnv tmEnv (LetTy _ a (x ** e)) = map id (\_, (wf, prf) => LetTyS wf prf) LetTyNS $ all (not $ illFormed a) (synths (tyEnv :< (sub tyEnv a `Over` Id)) tmEnv e) -synths tyEnv tmEnv (Abs (bound ** t)) = Nothing `Because` ChecksNS Abs -synths tyEnv tmEnv (App e ts) = +synths tyEnv tmEnv (Abs _ (bound ** t)) = Nothing `Because` ChecksNS Abs +synths tyEnv tmEnv (App _ e ts) = map snd (\(_, _), (prf1, prf2) => AppS prf1 prf2) (either AppNS1 (\xPrfs => uncurry AppNS2 (snd xPrfs))) $ (a := synths tyEnv tmEnv e) >=> checkSpine tyEnv tmEnv a ts -synths tyEnv tmEnv (Tup (MkRow es fresh)) = +synths tyEnv tmEnv (Tup _ (MkRow es fresh)) = map (TProd . fromAll (MkRow es fresh)) (\_ => TupS) TupNS $ allSynths tyEnv tmEnv es -synths tyEnv tmEnv (Prj e l) = +synths tyEnv tmEnv (Prj meta e l) = map (snd . snd) true false $ (a := synths tyEnv tmEnv e) >=> (as := isProd a) >=> @@ -718,7 +780,7 @@ synths tyEnv tmEnv (Prj e l) = true : (x : (Ty [<], Row (Ty [<]), Ty [<])) -> (Synths tyEnv tmEnv e (fst x), uncurry (\x, yz => (x = TProd (fst yz), uncurry (\y,z => Elem (l :- z) y.context) yz)) x) -> - Synths tyEnv tmEnv (Prj e l) (snd $ snd x) + Synths tyEnv tmEnv (Prj meta e l) (snd $ snd x) true (.(TProd as), as, a) (prf, Refl, i) = PrjS prf i false : @@ -728,14 +790,14 @@ synths tyEnv tmEnv (Prj e l) = Either ((as : Row (Ty [<])) -> Not (a = TProd as)) (as : Row (Ty [<]) ** (a = TProd as, (b : Ty [<]) -> Not (Elem (l :- b) as.context))))) -> - NotSynths tyEnv tmEnv (Prj e l) + NotSynths tyEnv tmEnv (Prj meta e l) false (Left contra) = PrjNS1 contra false (Right (a ** (prf1, Left contra))) = PrjNS2 prf1 contra false (Right (.(TProd as) ** (prf1, Right (as ** (Refl, contra))))) = PrjNS3 prf1 contra -synths tyEnv tmEnv (Inj l t) = Nothing `Because` ChecksNS Inj -synths tyEnv tmEnv (Case e (MkRow ts _)) = Nothing `Because` ChecksNS Case -synths tyEnv tmEnv (Roll t) = Nothing `Because` ChecksNS Roll -synths tyEnv tmEnv (Unroll e) = +synths tyEnv tmEnv (Inj _ l t) = Nothing `Because` ChecksNS Inj +synths tyEnv tmEnv (Case _ e (MkRow ts _)) = Nothing `Because` ChecksNS Case +synths tyEnv tmEnv (Roll _ t) = Nothing `Because` ChecksNS Roll +synths tyEnv tmEnv (Unroll _ e) = map f true false $ synths tyEnv tmEnv e `andThen` isFix where @@ -745,37 +807,37 @@ synths tyEnv tmEnv (Unroll e) = true : (axb : _) -> (Synths tyEnv tmEnv e (fst axb), uncurry (\a,xb => a = TFix xb.fst xb.snd) axb) -> - Synths tyEnv tmEnv (Unroll e) (f axb) + Synths tyEnv tmEnv (Unroll meta e) (f axb) true (.(TFix x a), (x ** a)) (prf, Refl) = UnrollS prf false : Either (NotSynths tyEnv tmEnv e) (a ** (Synths tyEnv tmEnv e a, (x : _) -> (b : _) -> Not (a = TFix x b))) -> - NotSynths tyEnv tmEnv (Unroll e) + NotSynths tyEnv tmEnv (Unroll meta e) false (Left contra) = UnrollNS1 contra false (Right (a ** (prf, contra))) = UnrollNS2 prf contra -synths tyEnv tmEnv (Fold e (x ** t)) = Nothing `Because` ChecksNS Fold -synths tyEnv tmEnv (Map (x ** a) b c) = +synths tyEnv tmEnv (Fold _ e (x ** t)) = Nothing `Because` ChecksNS Fold +synths tyEnv tmEnv (Map _ (x ** a) b c) = pure _ $ map (\(wf1, wf2, wf3) => MapS wf1 wf2 wf3) MapNS $ all (not $ illFormed (TFix x a)) (all (not $ illFormed b) (not $ illFormed c)) -synths tyEnv tmEnv (GetChildren (x ** a) b) = +synths tyEnv tmEnv (GetChildren _ (x ** a) b) = pure _ $ map (uncurry GetChildrenS) GetChildrenNS $ all (not $ illFormed (TFix x a)) (not $ illFormed b) -checks tyEnv tmEnv a (Annot t b) = fallbackCheck Annot (synths tyEnv tmEnv $ Annot t b) a -checks tyEnv tmEnv a (Var i) = fallbackCheck Var (synths tyEnv tmEnv $ Var i) a -checks tyEnv tmEnv a (Let e (x ** t)) = +checks tyEnv tmEnv a (Annot meta t b) = fallbackCheck Annot (synths tyEnv tmEnv $ Annot meta t b) a +checks tyEnv tmEnv a (Var meta i) = fallbackCheck Var (synths tyEnv tmEnv $ Var meta i) a +checks tyEnv tmEnv a (Let _ e (x ** t)) = map (\(_ ** (prf1, prf2)) => LetC prf1 prf2) (either LetNC1 (\xPrfs => uncurry LetNC2 $ snd xPrfs)) $ (b := synths tyEnv tmEnv e) >=> checks tyEnv (tmEnv :< (b `Over` Id)) a t -checks tyEnv tmEnv a (LetTy b (x ** t)) = +checks tyEnv tmEnv a (LetTy _ b (x ** t)) = map (uncurry LetTyC) LetTyNC $ all (not $ illFormed b) (checks (tyEnv :< (sub tyEnv b `Over` Id)) tmEnv a t) -checks tyEnv tmEnv a (Abs (bound ** t)) = +checks tyEnv tmEnv a (Abs meta (bound ** t)) = map (\((_, _) ** (prf1, prf2)) => AbsC prf1 prf2) (either AbsNC1 false) $ @@ -784,17 +846,17 @@ checks tyEnv tmEnv a (Abs (bound ** t)) = where false : (x ** (uncurry (IsFunction bound a) x, NotChecks tyEnv (tmEnv <>< mapProperty (`Over` Id) (fst x)) (snd x) t)) -> - NotChecks tyEnv tmEnv a (Abs (bound ** t)) + NotChecks tyEnv tmEnv a (Abs meta (bound ** t)) false ((_,_) ** prf) = uncurry AbsNC2 prf -checks tyEnv tmEnv a (App f ts) = fallbackCheck App (synths tyEnv tmEnv $ App f ts) a -checks tyEnv tmEnv a (Tup (MkRow ts fresh')) = +checks tyEnv tmEnv a (App meta f ts) = fallbackCheck App (synths tyEnv tmEnv $ App meta f ts) a +checks tyEnv tmEnv a (Tup _ (MkRow ts fresh')) = map true false $ (as := isProd a) >=> allChecks tyEnv tmEnv as.context ts where true : forall a. (as : Row (Ty [<]) ** (a = TProd as, AllChecks tyEnv tmEnv as.context ts)) -> - Checks tyEnv tmEnv a (Tup (MkRow ts fresh')) + Checks tyEnv tmEnv a (Tup meta (MkRow ts fresh')) true (as ** (Refl, prf)) = TupC prf false : @@ -802,11 +864,11 @@ checks tyEnv tmEnv a (Tup (MkRow ts fresh')) = Either ((as : Row (Ty [<])) -> Not (a = TProd as)) (as : Row (Ty [<]) ** (a = TProd as, AnyNotChecks tyEnv tmEnv as.context ts)) -> - NotChecks tyEnv tmEnv a (Tup (MkRow ts fresh')) + NotChecks tyEnv tmEnv a (Tup meta (MkRow ts fresh')) false (Left contra) = TupNC1 contra false (Right (as ** (Refl, contra))) = TupNC2 contra -checks tyEnv tmEnv a (Prj e l) = fallbackCheck Prj (synths tyEnv tmEnv $ Prj e l) a -checks tyEnv tmEnv a (Inj l t) = +checks tyEnv tmEnv a (Prj meta e l) = fallbackCheck Prj (synths tyEnv tmEnv $ Prj meta e l) a +checks tyEnv tmEnv a (Inj _ l t) = map true false $ (as := isSum a) >=> (b := decLookup l as.context) >=> @@ -815,7 +877,7 @@ checks tyEnv tmEnv a (Inj l t) = true : forall a. (as ** (a = TSum as, (b ** (Elem (l :- b) as.context, Checks tyEnv tmEnv b t)))) -> - Checks tyEnv tmEnv a (Inj l t) + Checks tyEnv tmEnv a (Inj meta l t) true (as ** (Refl, (b ** (i, prf)))) = InjC i prf false : @@ -826,11 +888,11 @@ checks tyEnv tmEnv a (Inj l t) = Either ((b : _) -> Not (Elem (l :- b) as.context)) (b ** (Elem (l :- b) as.context, NotChecks tyEnv tmEnv b t)))) -> - NotChecks tyEnv tmEnv a (Inj l t) + NotChecks tyEnv tmEnv a (Inj meta l t) false (Left contra) = InjNC1 contra false (Right (as ** (Refl, Left contra))) = InjNC2 contra false (Right (as ** (Refl, Right (b ** (i, contra))))) = InjNC3 i contra -checks tyEnv tmEnv a (Case e (MkRow ts fresh)) = +checks tyEnv tmEnv a (Case _ e (MkRow ts fresh)) = map true false $ (b := synths tyEnv tmEnv e) >=> (as := isSum b) >=> @@ -839,7 +901,7 @@ checks tyEnv tmEnv a (Case e (MkRow ts fresh)) = true : forall fresh. (b ** (Synths tyEnv tmEnv e b, (as ** (b = TSum as, AllBranches tyEnv tmEnv as.context a ts)))) -> - Checks tyEnv tmEnv a (Case e (MkRow ts fresh)) + Checks tyEnv tmEnv a (Case meta e (MkRow ts fresh)) true (.(TSum as) ** (prf, (as ** (Refl, prfs)))) = CaseC prf prfs false : @@ -850,11 +912,11 @@ checks tyEnv tmEnv a (Case e (MkRow ts fresh)) = Either ((as : _) -> Not (b = TSum as)) (as ** (b = TSum as, AnyNotBranches tyEnv tmEnv as.context a ts)))) -> - NotChecks tyEnv tmEnv a (Case e (MkRow ts fresh)) + NotChecks tyEnv tmEnv a (Case meta e (MkRow ts fresh)) false (Left contra) = CaseNC1 contra false (Right (b ** (prf, Left contra))) = CaseNC2 prf contra false (Right (.(TSum as) ** (prf, Right (as ** (Refl, contras))))) = CaseNC3 prf contras -checks tyEnv tmEnv a (Roll t) = +checks tyEnv tmEnv a (Roll _ t) = map true false $ (xb := isFix a) >=> checks tyEnv tmEnv (ty xb) t where @@ -864,7 +926,7 @@ checks tyEnv tmEnv a (Roll t) = true : forall a. (xb : (x ** Ty [<x]) ** (a = TFix (fst xb) (snd xb), Checks tyEnv tmEnv (ty xb) t)) -> - Checks tyEnv tmEnv a (Roll t) + Checks tyEnv tmEnv a (Roll meta t) true ((x ** b) ** (Refl, prf)) = RollC prf false : @@ -872,11 +934,11 @@ checks tyEnv tmEnv a (Roll t) = Either ((x : _) -> (b : Ty [<x]) -> Not (a = TFix x b)) (xb : (x ** Ty [<x]) ** (a = TFix (fst xb) (snd xb), NotChecks tyEnv tmEnv (ty xb) t)) -> - NotChecks tyEnv tmEnv a (Roll t) + NotChecks tyEnv tmEnv a (Roll meta t) false (Left contra) = RollNC1 contra false (Right ((x ** b) ** (Refl, contra))) = RollNC2 contra -checks tyEnv tmEnv a (Unroll e) = fallbackCheck Unroll (synths tyEnv tmEnv $ Unroll e) a -checks tyEnv tmEnv a (Fold e (x ** t)) = +checks tyEnv tmEnv a (Unroll meta e) = fallbackCheck Unroll (synths tyEnv tmEnv $ Unroll meta e) a +checks tyEnv tmEnv a (Fold _ e (x ** t)) = map true false $ (b := synths tyEnv tmEnv e) >=> (yc := isFix b) >=> @@ -888,7 +950,7 @@ checks tyEnv tmEnv a (Fold e (x ** t)) = true : (b ** (Synths tyEnv tmEnv e b, (yc ** (b = TFix (fst yc) (snd yc), Checks tyEnv (tmEnv' yc) a t)))) -> - Checks tyEnv tmEnv a (Fold e (x ** t)) + Checks tyEnv tmEnv a (Fold meta e (x ** t)) true (.(TFix y b) ** (prf1, ((y ** b) ** (Refl, prf2)))) = FoldC prf1 prf2 false : @@ -898,14 +960,14 @@ checks tyEnv tmEnv a (Fold e (x ** t)) = Either ((y : _) -> (c : Ty [<y]) -> Not (b = TFix y c)) (yc ** (b = TFix (fst yc) (snd yc), NotChecks tyEnv (tmEnv' yc) a t)))) -> - NotChecks tyEnv tmEnv a (Fold e (x ** t)) + NotChecks tyEnv tmEnv a (Fold meta e (x ** t)) false (Left contra) = FoldNC1 contra false (Right (b ** (prf1, Left contra))) = FoldNC2 prf1 contra false (Right (.(TFix y b) ** (prf1, Right ((y ** b) ** (Refl, contra))))) = FoldNC3 prf1 contra -checks tyEnv tmEnv a (Map (x ** b) c d) = - fallbackCheck Map (synths tyEnv tmEnv $ Map (x ** b) c d) a -checks tyEnv tmEnv a (GetChildren (x ** b) c) = - fallbackCheck GetChildren (synths tyEnv tmEnv $ GetChildren (x ** b) c) a +checks tyEnv tmEnv a (Map meta (x ** b) c d) = + fallbackCheck Map (synths tyEnv tmEnv $ Map meta (x ** b) c d) a +checks tyEnv tmEnv a (GetChildren meta (x ** b) c) = + fallbackCheck GetChildren (synths tyEnv tmEnv $ GetChildren meta (x ** b) c) a checkSpine tyEnv tmEnv a [] = Just a `Because` [] checkSpine tyEnv tmEnv a (t :: ts) = @@ -961,34 +1023,36 @@ allBranches tyEnv tmEnv as b (ts :< (l :- (x ** t))) = -- Sugar ----------------------------------------------------------------------- public export -CheckLit : Nat -> Term tyCtx tmCtx -CheckLit 0 = Roll (Inj "Z" $ Tup [<]) -CheckLit (S n) = Roll (Inj "S" $ CheckLit n) +CheckLit : m -> Nat -> Term m tyCtx tmCtx +CheckLit meta 0 = Roll meta (Inj meta "Z" $ Tup meta [<]) +CheckLit meta (S n) = Roll meta (Inj meta "S" $ CheckLit meta n) public export -Lit : Nat -> Term tyCtx tmCtx -Lit n = Annot (CheckLit n) TNat +Lit : m -> Nat -> Term m tyCtx tmCtx +Lit meta n = Annot meta (CheckLit meta n) TNat public export -Suc : Term tyCtx tmCtx -Suc = Annot (Abs (["_x"] ** Roll (Inj "S" $ Var (%% "_x")))) (TArrow TNat TNat) +Suc : m -> Term m tyCtx tmCtx +Suc meta = + Annot meta (Abs meta (["_x"] ** Roll meta (Inj meta "S" $ Var meta (%% "_x")))) + (TArrow TNat TNat) export -isCheckLit : Term tyCtx tmCtx -> Maybe Nat -isCheckLit (Roll (Inj "Z" (Tup (MkRow [<] _)))) = Just 0 -isCheckLit (Roll (Inj "S" t)) = S <$> isCheckLit t +isCheckLit : Term m tyCtx tmCtx -> Maybe Nat +isCheckLit (Roll _ (Inj _ "Z" (Tup _ (MkRow [<] _)))) = Just 0 +isCheckLit (Roll _ (Inj _ "S" t)) = S <$> isCheckLit t isCheckLit _ = Nothing export -isLit : Term tyCtx tmCtx -> Maybe Nat -isLit (Annot t a) = +isLit : Term m tyCtx tmCtx -> Maybe Nat +isLit (Annot _ t a) = if (alpha {ctx2 = [<]} a TNat).does then isCheckLit t else Nothing isLit _ = Nothing export -isSuc : Term tyCtx tmCtx -> Bool -isSuc (Annot (Abs ([x] ** Roll (Inj "S" $ Var ((%%) x {pos = Here})))) a) = +isSuc : Term m tyCtx tmCtx -> Bool +isSuc (Annot _ (Abs _ ([x] ** Roll _ (Inj _ "S" $ Var _ ((%%) x {pos = Here})))) a) = does (alpha {ctx2 = [<]} a (TArrow TNat TNat)) isSuc _ = False diff --git a/src/Inky/Term/Parser.idr b/src/Inky/Term/Parser.idr index 90b4e08..ee122bb 100644 --- a/src/Inky/Term/Parser.idr +++ b/src/Inky/Term/Parser.idr @@ -267,12 +267,12 @@ mkVar f x = Nothing => Left "\{x.bounds}: unbound name \"\{x.val}\"") mkVar2 : - ({tyCtx, tmCtx : _} -> Var tmCtx -> p tyCtx tmCtx) -> + ({tyCtx, tmCtx : _} -> WithBounds (Var tmCtx) -> p tyCtx tmCtx) -> WithBounds String -> ParseFun 2 p mkVar2 f x = MkParseFun (\tyCtx, tmCtx => case Var.lookup x.val tmCtx of - Just i => pure (f i) + Just i => pure (f $ i <$ x) Nothing => Left "\{x.bounds}: unbound name \"\{x.val}\"") public export @@ -281,7 +281,7 @@ TypeFun = ParseFun 1 Ty public export TermFun : Type -TermFun = ParseFun 2 Term +TermFun = ParseFun 2 (Term Bounds) public export TypeParser : SnocList String -> SnocList String -> Type @@ -383,57 +383,58 @@ OpenTypeWf = Oh AtomTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun AtomTerm = OneOf - [ mkVar2 Var <$> WithBounds (match TermIdent) - , mkLit <$> match Lit - , mkSuc <$ match Suc - , mkTup <$> (enclose (match AngleOpen) (match AngleClose) $ + [ mkVar2 (\x => Var x.bounds x.val) <$> WithBounds (match TermIdent) + , mkLit <$> WithBounds (match Lit) + , mkSuc <$> WithBounds (match Suc) + , mkTup <$> WithBounds (enclose (match AngleOpen) (match AngleClose) $ RowOf [<"openTerm" :- TermFun] (Var (%%% "openTerm"))) , enclose (match ParenOpen) (match ParenClose) (Var (%%% "openTerm")) ] where - mkLit : Nat -> TermFun - mkLit k = MkParseFun (\tyCtx, tmCtx => pure (Lit k)) + mkLit : WithBounds Nat -> TermFun + mkLit k = MkParseFun (\tyCtx, tmCtx => pure (Lit k.bounds k.val)) - mkSuc : TermFun - mkSuc = MkParseFun (\_, _ => pure Suc) + mkSuc : WithBounds () -> TermFun + mkSuc x = MkParseFun (\_, _ => pure (Suc x.bounds)) - mkTup : List (WithBounds $ Assoc TermFun) -> TermFun - mkTup xs = MkParseFun (\tyCtx, tmCtx => Tup <$> tryRow2 xs tyCtx tmCtx) + mkTup : WithBounds (List (WithBounds $ Assoc TermFun)) -> TermFun + mkTup xs = MkParseFun (\tyCtx, tmCtx => Tup xs.bounds <$> tryRow2 xs.val tyCtx tmCtx) PrefixTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun PrefixTerm = Fix "prefixTerm" $ OneOf - [ match Tilde **> (mkRoll <$> Var (%%% "prefixTerm")) - , match Bang **> mkUnroll <$> Var (%%% "prefixTerm") + [ mkRoll <$> WithBounds (match Tilde **> Var (%%% "prefixTerm")) + , mkUnroll <$> WithBounds (match Bang **> Var (%%% "prefixTerm")) , rename (Drop Id) Id AtomTerm ] where - mkRoll : TermFun -> TermFun - mkRoll x = MkParseFun (\tyCtx, tmCtx => [| Roll (x.try tyCtx tmCtx) |]) + mkRoll : WithBounds TermFun -> TermFun + mkRoll x = MkParseFun (\tyCtx, tmCtx => pure $ Roll x.bounds !(x.val.try tyCtx tmCtx)) - mkUnroll : TermFun -> TermFun - mkUnroll x = MkParseFun (\tyCtx, tmCtx => [| Unroll (x.try tyCtx tmCtx) |]) + mkUnroll : WithBounds TermFun -> TermFun + mkUnroll x = MkParseFun (\tyCtx, tmCtx => pure $ Unroll x.bounds !(x.val.try tyCtx tmCtx)) SuffixTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun -SuffixTerm = mkSuffix <$> Seq [ PrefixTerm , star (match Dot **> match TypeIdent) ] +SuffixTerm = mkSuffix <$> Seq [ PrefixTerm , star (match Dot **> WithBounds (match TypeIdent)) ] where - mkSuffix : HList [TermFun, List String] -> TermFun + mkSuffix : HList [TermFun, List (WithBounds String)] -> TermFun mkSuffix [t, []] = t mkSuffix [t, prjs] = - MkParseFun (\tyCtx, tmCtx => pure $ foldl Prj !(t.try tyCtx tmCtx) prjs) + MkParseFun (\tyCtx, tmCtx => + pure $ foldl (\acc, l => Prj l.bounds acc l.val) !(t.try tyCtx tmCtx) prjs) AppTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun AppTerm = OneOf [ mkInj <$> Seq - [ match TypeIdent + [ WithBounds (match TypeIdent) , weaken (S Z) SuffixTerm ] , mkApp <$> Seq [ OneOf {nils = [False, False, False]} - [ SuffixTerm + [ WithBounds SuffixTerm , mkMap <$> Seq - [ match Map + [ WithBounds (match Map) , enclose (match ParenOpen) (match ParenClose) $ Seq [ match Backslash , match TypeIdent @@ -444,7 +445,7 @@ AppTerm = , sub [<"openType" :- rename Id (Drop Id) OpenType] [<] AtomType ] , mkGetChildren <$> Seq - [ match GetChildren + [ WithBounds (match GetChildren) , enclose (match ParenOpen) (match ParenClose) $ Seq [ match Backslash , match TypeIdent @@ -458,26 +459,29 @@ AppTerm = ] ] where - mkInj : HList [String, TermFun] -> TermFun - mkInj [tag, t] = MkParseFun (\tyCtx, tmCtx => Inj tag <$> t.try tyCtx tmCtx) + mkInj : HList [WithBounds String, TermFun] -> TermFun + mkInj [tag, t] = MkParseFun (\tyCtx, tmCtx => Inj tag.bounds tag.val <$> t.try tyCtx tmCtx) - mkMap : HList [_, HList [_, String, _, TypeFun], TypeFun, TypeFun] -> TermFun - mkMap [_, [_, x, _, a], b, c] = + mkMap : HList [WithBounds (), HList [_, String, _, TypeFun], TypeFun, TypeFun] -> WithBounds TermFun + mkMap [m, [_, x, _, a], b, c] = MkParseFun (\tyCtx, tmCtx => - pure $ Map (x ** !(a.try (tyCtx :< x))) !(b.try tyCtx) !(c.try tyCtx)) + pure $ Map m.bounds (x ** !(a.try (tyCtx :< x))) !(b.try tyCtx) !(c.try tyCtx)) + <$ m - mkGetChildren : HList [_, HList [_, String, _, TypeFun], TypeFun] -> TermFun - mkGetChildren [_, [_, x, _, a], b] = + mkGetChildren : HList [WithBounds (), HList [_, String, _, TypeFun], TypeFun] -> WithBounds TermFun + mkGetChildren [m, [_, x, _, a], b] = MkParseFun (\tyCtx, tmCtx => - pure $ GetChildren (x ** !(a.try (tyCtx :< x))) !(b.try tyCtx)) + pure $ GetChildren m.bounds (x ** !(a.try (tyCtx :< x))) !(b.try tyCtx)) + <$ m - mkApp : HList [TermFun, List TermFun] -> TermFun - mkApp [t, []] = t + mkApp : HList [WithBounds TermFun, List TermFun] -> TermFun + mkApp [t, []] = t.val mkApp [fun, (arg :: args)] = MkParseFun (\tyCtx, tmCtx => pure $ App - !(fun.try tyCtx tmCtx) + fun.bounds + !(fun.val.try tyCtx tmCtx) ( !(arg.try tyCtx tmCtx) :: (!(foldlM (\acc, arg => pure $ acc :< !(arg.try tyCtx tmCtx)) [<] args) <>> []))) @@ -485,12 +489,13 @@ AnnotTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun AnnotTerm = mkAnnot <$> Seq [ AppTerm - , option (match Colon **> rename Id (Drop Id) OpenType) + , option (match Colon **> WithBounds (rename Id (Drop Id) OpenType)) ] where - mkAnnot : HList [TermFun, Maybe TypeFun] -> TermFun + mkAnnot : HList [TermFun, Maybe (WithBounds TypeFun)] -> TermFun mkAnnot [t, Nothing] = t - mkAnnot [t, Just a] = MkParseFun (\tyCtx, tmCtx => [| Annot (t.try tyCtx tmCtx) (a.try tyCtx) |]) + mkAnnot [t, Just a] = MkParseFun (\tyCtx, tmCtx => + pure $ Annot a.bounds !(t.try tyCtx tmCtx) !(a.val.try tyCtx)) -- Open Terms @@ -499,12 +504,12 @@ LetTerm = match Let **> OneOf [ mkLet <$> Seq - [ match TermIdent + [ WithBounds (match TermIdent) , OneOf [ mkBound <$> Seq [ star (enclose (match ParenOpen) (match ParenClose) $ Seq [ match TermIdent, match Colon, rename Id (Drop Id) OpenType ]) - , match Colon + , WithBounds (match Colon) , rename Id (Drop Id) OpenType , match Equal , Var (%%% "openTerm")] @@ -514,7 +519,7 @@ LetTerm = , Var (%%% "openTerm") ] , mkLetType <$> Seq - [ match TypeIdent + [ WithBounds (match TypeIdent) , match Equal , rename Id (Drop Id) OpenType , match In @@ -522,43 +527,46 @@ LetTerm = ] ] where - mkLet : HList [String, TermFun, (), TermFun] -> TermFun - mkLet [x, e, _, t] = MkParseFun (\tyCtx, tmCtx => pure $ Let !(e.try tyCtx tmCtx) (x ** !(t.try tyCtx (tmCtx :< x)))) + mkLet : HList [WithBounds String, TermFun, (), TermFun] -> TermFun + mkLet [x, e, _, t] = + MkParseFun (\tyCtx, tmCtx => + pure $ Let x.bounds !(e.try tyCtx tmCtx) (x.val ** !(t.try tyCtx (tmCtx :< x.val)))) - mkLetType : HList [String, (), TypeFun, (), TermFun] -> TermFun + mkLetType : HList [WithBounds String, (), TypeFun, (), TermFun] -> TermFun mkLetType [x, _, a, _, t] = - MkParseFun (\tyCtx, tmCtx => pure $ LetTy !(a.try tyCtx) (x ** !(t.try (tyCtx :< x) tmCtx))) + MkParseFun (\tyCtx, tmCtx => + pure $ LetTy x.bounds !(a.try tyCtx) (x.val ** !(t.try (tyCtx :< x.val) tmCtx))) mkArrow : List TypeFun -> TypeFun -> TypeFun mkArrow [] cod = cod mkArrow (arg :: args) cod = MkParseFun (\ctx => [| TArrow (arg.try ctx) ((mkArrow args cod).try ctx) |]) - mkBound : HList [List (HList [String, (), TypeFun]), (), TypeFun, (), TermFun] -> TermFun - mkBound [[], _, cod, _, t] = + mkBound : HList [List (HList [String, (), TypeFun]), WithBounds (), TypeFun, (), TermFun] -> TermFun + mkBound [[], m, cod, _, t] = MkParseFun (\tyCtx, tmCtx => pure $ - Annot !(t.try tyCtx tmCtx) !(cod.try tyCtx)) - mkBound [args, _, cod, _, t] = + Annot m.bounds !(t.try tyCtx tmCtx) !(cod.try tyCtx)) + mkBound [args, m, cod, _, t] = let bound = map (\[x, _, a] => x) args in let tys = map (\[x, _, a] => a) args in MkParseFun (\tyCtx, tmCtx => pure $ - Annot (Abs (bound ** !(t.try tyCtx (tmCtx <>< bound)))) !((mkArrow tys cod).try tyCtx)) + Annot m.bounds (Abs m.bounds (bound ** !(t.try tyCtx (tmCtx <>< bound)))) !((mkArrow tys cod).try tyCtx)) AbsTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun AbsTerm = mkAbs <$> Seq - [ match Backslash + [ WithBounds (match Backslash) , sepBy1 (match Comma) (match TermIdent) , match DoubleArrow , Var (%%% "openTerm") ] where - mkAbs : HList [(), List1 String, (), TermFun] -> TermFun - mkAbs [_, args, _, body] = + mkAbs : HList [WithBounds (), List1 String, (), TermFun] -> TermFun + mkAbs [m, args, _, body] = MkParseFun (\tyCtx, tmCtx => - pure $ Abs (forget args ** !(body.try tyCtx (tmCtx <>< forget args)))) + pure $ Abs m.bounds (forget args ** !(body.try tyCtx (tmCtx <>< forget args)))) CaseTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun CaseTerm = @@ -566,12 +574,12 @@ CaseTerm = Seq [ OneOf [ mkCase <$> Seq - [ match Case + [ WithBounds (match Case) , Var (%%% "openTerm") , match Of ] , mkFoldCase <$> Seq - [ match FoldCase + [ WithBounds (match FoldCase) , Var (%%% "openTerm") , match By ] @@ -592,29 +600,30 @@ CaseTerm = mkBranch : HList [String, String, (), TermFun] -> - Assoc (ParseFun 2 $ \tyCtx, tmCtx => (x ** Term tyCtx (tmCtx :< x))) + Assoc (ParseFun 2 $ \tyCtx, tmCtx => (x ** Term Bounds tyCtx (tmCtx :< x))) mkBranch [tag, bound, _, branch] = tag :- MkParseFun (\tyCtx, tmCtx => pure (bound ** !(branch.try tyCtx (tmCtx :< bound)))) - mkCase : HList [_, TermFun, _] -> Cases -> TermFun - mkCase [_, target, _] branches = + mkCase : HList [WithBounds (), TermFun, _] -> Cases -> TermFun + mkCase [m, target, _] branches = let branches = map (map mkBranch) branches in MkParseFun (\tyCtx, tmCtx => - [| Case (target.try tyCtx tmCtx) (tryRow2 branches tyCtx tmCtx) |]) + pure $ Case m.bounds !(target.try tyCtx tmCtx) !(tryRow2 branches tyCtx tmCtx)) - mkFoldCase : HList [_, TermFun, _] -> Cases -> TermFun - mkFoldCase [_, target, _] branches = + mkFoldCase : HList [WithBounds (), TermFun, _] -> Cases -> TermFun + mkFoldCase [m, target, _] branches = let branches = map (map mkBranch) branches in MkParseFun (\tyCtx, tmCtx => pure $ Fold + m.bounds !(target.try tyCtx tmCtx) - ("__tmp" ** Case (Var $ %% "__tmp") !(tryRow2 branches tyCtx (tmCtx :< "__tmp")))) + ("__tmp" ** Case m.bounds (Var m.bounds $ %% "__tmp") !(tryRow2 branches tyCtx (tmCtx :< "__tmp")))) FoldTerm : InkyParser False [<"openTerm" :- TermFun] [<] TermFun FoldTerm = mkFold <$> Seq - [ match Fold + [ WithBounds (match Fold) , Var (%%% "openTerm") , match By , enclose (match ParenOpen) (match ParenClose) $ @@ -626,10 +635,10 @@ FoldTerm = ] ] where - mkFold : HList [(), TermFun, (), HList [(), String, (), TermFun]] -> TermFun - mkFold [_, target, _, [_, arg, _, body]] = + mkFold : HList [WithBounds (), TermFun, (), HList [(), String, (), TermFun]] -> TermFun + mkFold [m, target, _, [_, arg, _, body]] = MkParseFun (\tyCtx, tmCtx => - pure $ Fold !(target.try tyCtx tmCtx) (arg ** !(body.try tyCtx (tmCtx :< arg)))) + pure $ Fold m.bounds !(target.try tyCtx tmCtx) (arg ** !(body.try tyCtx (tmCtx :< arg)))) export OpenTerm : InkyParser False [<] [<] TermFun diff --git a/src/Inky/Term/Pretty.idr b/src/Inky/Term/Pretty.idr index 91a42b8..79e8f6c 100644 --- a/src/Inky/Term/Pretty.idr +++ b/src/Inky/Term/Pretty.idr @@ -1,11 +1,15 @@ module Inky.Term.Pretty +import Data.List.Quantifiers import Data.Singleton import Data.String +import Data.These import Inky.Decidable.Maybe import Inky.Term import Inky.Type.Pretty + +import Text.Bounded import Text.PrettyPrint.Prettyprinter public export @@ -43,12 +47,12 @@ Ord TermPrec where compare Open d2 = GT export -prettyTerm : {tyCtx, tmCtx : SnocList String} -> Term tyCtx tmCtx -> TermPrec -> Doc ann -prettyAllTerm : {tyCtx, tmCtx : SnocList String} -> List (Term tyCtx tmCtx) -> TermPrec -> List (Doc ann) -prettyTermCtx : {tyCtx, tmCtx : SnocList String} -> Context (Term tyCtx tmCtx) -> TermPrec -> SnocList (Doc ann) -prettyCases : {tyCtx, tmCtx : SnocList String} -> Context (x ** Term tyCtx (tmCtx :< x)) -> SnocList (Doc ann) +prettyTerm : {tyCtx, tmCtx : SnocList String} -> Term m tyCtx tmCtx -> TermPrec -> Doc ann +prettyAllTerm : {tyCtx, tmCtx : SnocList String} -> List (Term m tyCtx tmCtx) -> TermPrec -> List (Doc ann) +prettyTermCtx : {tyCtx, tmCtx : SnocList String} -> Context (Term m tyCtx tmCtx) -> TermPrec -> SnocList (Doc ann) +prettyCases : {tyCtx, tmCtx : SnocList String} -> Context (x ** Term m tyCtx (tmCtx :< x)) -> SnocList (Doc ann) prettyLet : Doc ann -> Doc ann -> Doc ann -lessPrettyTerm : {tyCtx, tmCtx : SnocList String} -> Term tyCtx tmCtx -> TermPrec -> Doc ann +lessPrettyTerm : {tyCtx, tmCtx : SnocList String} -> Term m tyCtx tmCtx -> TermPrec -> Doc ann prettyTerm t d = case isLit t <|> isCheckLit t of @@ -65,7 +69,7 @@ prettyTermCtx [<] d = [<] prettyTermCtx (ts :< (l :- t)) d = prettyTermCtx ts d :< (pretty l <+> ":" <++> prettyTerm t d) prettyCases [<] = [<] -prettyCases (ts :< (l :- (x ** Abs (bound ** t)))) = +prettyCases (ts :< (l :- (x ** Abs _ (bound ** t)))) = prettyCases ts :< (group $ align $ pretty l <++> pretty x <++> "=>" <++> @@ -84,26 +88,26 @@ prettyLet binding term = "in") <+> line <+> term -lessPrettyTerm (Annot t a) d = +lessPrettyTerm (Annot _ t a) d = group $ align $ hang 2 $ parenthesise (d < Annot) $ prettyTerm t App <++> ":" <+> line <+> prettyType a Open -lessPrettyTerm (Var i) d = pretty (unVal $ nameOf i) -lessPrettyTerm (Let e (x ** t)) d = +lessPrettyTerm (Var _ i) d = pretty (unVal $ nameOf i) +lessPrettyTerm (Let _ e (x ** t)) d = -- TODO: pretty print annotated abstraction group $ align $ parenthesise (d < Open) $ prettyLet (pretty x <++> "=" <+> line <+> prettyTerm e Open) (prettyTerm t Open) -lessPrettyTerm (LetTy a (x ** t)) d = +lessPrettyTerm (LetTy _ a (x ** t)) d = group $ align $ parenthesise (d < Open) $ prettyLet (pretty x <++> "=" <+> line <+> prettyType a Open) (prettyTerm t Open) -lessPrettyTerm (Abs (bound ** t)) d = +lessPrettyTerm (Abs _ (bound ** t)) d = group $ hang 2 $ parenthesise (d < Open) $ "\\" <+> concatWith (surround $ "," <+> line) (map pretty bound) <++> "=>" <+> line <+> prettyTerm t Open -lessPrettyTerm (App (Map (x ** a) b c) ts) d = +lessPrettyTerm (App _ (Map _ (x ** a) b c) ts) d = group $ align $ hang 2 $ parenthesise (d < App) $ concatWith (surround line) ( pretty "map" @@ -111,29 +115,29 @@ lessPrettyTerm (App (Map (x ** a) b c) ts) d = :: prettyType b Atom :: prettyType c Atom :: prettyAllTerm ts Suffix) -lessPrettyTerm (App (GetChildren (x ** a) b) ts) d = +lessPrettyTerm (App _ (GetChildren _ (x ** a) b) ts) d = group $ align $ hang 2 $ parenthesise (d < App) $ concatWith (surround line) ( pretty "getChildren" :: parens (group $ align $ hang 2 $ "\\" <+> pretty x <++> "=>" <+> line <+> prettyType a Open) :: prettyType b Atom :: prettyAllTerm ts Suffix) -lessPrettyTerm (App f ts) d = +lessPrettyTerm (App _ f ts) d = group $ align $ hang 2 $ parenthesise (d < App) $ concatWith (surround line) (prettyTerm f Suffix :: prettyAllTerm ts Suffix) -lessPrettyTerm (Tup (MkRow ts _)) d = +lessPrettyTerm (Tup _ (MkRow ts _)) d = let parts = prettyTermCtx ts Open <>> [] in group $ align $ enclose "<" ">" $ flatAlt (neutral <++> concatWith (surround $ line' <+> "," <++> neutral) parts <+> line) (concatWith (surround $ "," <++> neutral) parts) -lessPrettyTerm (Prj e l) d = +lessPrettyTerm (Prj _ e l) d = group $ align $ hang 2 $ parenthesise (d < Suffix) $ prettyTerm e Suffix <+> line' <+> "." <+> pretty l -lessPrettyTerm (Inj l t) d = +lessPrettyTerm (Inj _ l t) d = group $ align $ hang 2 $ parenthesise (d < App) $ pretty l <+> line <+> prettyTerm t Suffix -lessPrettyTerm (Case e (MkRow ts _)) d = +lessPrettyTerm (Case _ e (MkRow ts _)) d = let parts = prettyCases ts <>> [] in group $ align $ hang 2 $ parenthesise (d < Open) $ (group $ hang (-2) $ "case" <++> prettyTerm e Open <+> line <+> "of") <+> line <+> @@ -141,19 +145,19 @@ lessPrettyTerm (Case e (MkRow ts _)) d = flatAlt (neutral <++> concatWith (surround $ line' <+> ";" <++> neutral) parts <+> line) (concatWith (surround $ ";" <++> neutral) parts)) -lessPrettyTerm (Roll t) d = +lessPrettyTerm (Roll _ t) d = pretty "~" <+> parenthesise (d < Prefix) (group $ align $ hang 2 $ prettyTerm t Prefix) -lessPrettyTerm (Unroll e) d = +lessPrettyTerm (Unroll _ e) d = pretty "!" <+> parenthesise (d > Prefix) (group $ align $ hang 2 $ prettyTerm e Prefix) -lessPrettyTerm (Fold e (x ** t)) d = +lessPrettyTerm (Fold _ e (x ** t)) d = -- TODO: foldcase group $ align $ hang 2 $ parenthesise (d < Open) $ "fold" <++> prettyTerm e Open <++> "by" <+> hardline <+> (group $ align $ hang 2 $ parens $ "\\" <+> pretty x <++> "=>" <+> line <+> prettyTerm t Open) -lessPrettyTerm (Map (x ** a) b c) d = +lessPrettyTerm (Map _ (x ** a) b c) d = group $ align $ hang 2 $ parenthesise (d < App) $ concatWith (surround line) [ pretty "map" @@ -161,10 +165,220 @@ lessPrettyTerm (Map (x ** a) b c) d = , prettyType b Atom , prettyType c Atom ] -lessPrettyTerm (GetChildren (x ** a) b) d = +lessPrettyTerm (GetChildren _ (x ** a) b) d = group $ align $ hang 2 $ parenthesise (d < App) $ concatWith (surround line) [ pretty "getChildren" , group (align $ hang 2 $ parens $ "\\" <+> pretty x <++> "=>" <+> line <+> prettyType a Open) , prettyType b Atom ] + +-- Typing Errors --------------------------------------------------------------- + +Pretty (ChecksOnly t) where + pretty Abs = "abstraction" + pretty Inj = "injection" + pretty Case = "case split" + pretty Roll = "rolling" + pretty Fold = "fold" + +prettyNotSynths : + {tyCtx, tmCtx : SnocList String} -> + {e : Term m tyCtx tmCtx} -> + {tyEnv : _} -> {tmEnv : _} -> + NotSynths tyEnv tmEnv e -> + List (m, Doc ann) +export +prettyNotChecks : + {tyCtx, tmCtx : SnocList String} -> + {a : Ty [<]} -> + {t : Term m tyCtx tmCtx} -> + {tyEnv : _} -> {tmEnv : _} -> + NotChecks tyEnv tmEnv a t -> + List (m, Doc ann) +prettyNotCheckSpine : + {tyCtx, tmCtx : SnocList String} -> + {a : Ty [<]} -> + {ts : List (Term m tyCtx tmCtx)} -> + {tyEnv : _} -> {tmEnv : _} -> + NotCheckSpine tyEnv tmEnv a ts -> + List (m, Doc ann) +prettyAnyNotSynths : + {tyCtx, tmCtx : SnocList String} -> + {es : Context (Term m tyCtx tmCtx)} -> + {tyEnv : _} -> {tmEnv : _} -> + AnyNotSynths tyEnv tmEnv es -> + List (m, Doc ann) +prettyAnyNotChecks : + {tyCtx, tmCtx : SnocList String} -> + {ts : Context (Term m tyCtx tmCtx)} -> + {tyEnv : _} -> {tmEnv : _} -> {as : Context _} -> + (meta : m) -> + AnyNotChecks tyEnv tmEnv as ts -> + List (m, Doc ann) +prettyAnyNotBranches : + {tyCtx, tmCtx : SnocList String} -> + {ts : Context (x ** Term m tyCtx (tmCtx :< x))} -> + {tyEnv : _} -> {tmEnv : _} -> {as : Context _} -> {a : _} -> + (meta : m) -> + AnyNotBranches tyEnv tmEnv as a ts -> + List (m, Doc ann) + +prettyNotSynths (ChecksNS shape) = + [(e.meta, pretty "cannot synthesise type of" <++> pretty shape)] +prettyNotSynths (AnnotNS {a} (This contra)) = + [(e.meta, pretty "ill-formed type" <+> line <+> prettyType a Open)] +prettyNotSynths (AnnotNS (That contra)) = prettyNotChecks contra +prettyNotSynths (AnnotNS {a} (Both contra1 contra2)) = + (e.meta, pretty "ill-formed type" <+> line <+> prettyType a Open) :: + prettyNotChecks contra2 +prettyNotSynths (LetNS1 contra) = prettyNotSynths contra +prettyNotSynths (LetNS2 prf contra) = + case synthsRecompute prf of + Val a => prettyNotSynths contra +prettyNotSynths (LetTyNS {a} (This contra)) = + [(e.meta, pretty "ill-formed type" <+> line <+> prettyType a Open)] +prettyNotSynths (LetTyNS (That contra)) = prettyNotSynths contra +prettyNotSynths (LetTyNS {a} (Both contra1 contra2)) = + (e.meta, pretty "ill-formed type" <+> line <+> prettyType a Open) + :: prettyNotSynths contra2 +prettyNotSynths (AppNS1 contra) = prettyNotSynths contra +prettyNotSynths (AppNS2 prf contras) = + case synthsRecompute prf of + Val a => prettyNotCheckSpine contras +prettyNotSynths (TupNS contras) = prettyAnyNotSynths contras +prettyNotSynths (PrjNS1 contra) = prettyNotSynths contra +prettyNotSynths (PrjNS2 prf f) = + case synthsRecompute prf of + Val a => + [(e.meta + , pretty "cannot project non-product type" <+> line <+> + prettyType a Open + )] +prettyNotSynths (PrjNS3 {l, as} prf contra) = + case synthsRecompute prf of + Val (TProd as) => + [(e.meta + , pretty "unknown label" <++> enclose "'" "'" (pretty l) <+> line <+> + pretty "in product type" <+> line <+> + prettyType (TProd as) Open + )] +prettyNotSynths (UnrollNS1 contra) = prettyNotSynths contra +prettyNotSynths (UnrollNS2 prf contra) = + case synthsRecompute prf of + Val a => + [(e.meta + , pretty "cannot unroll non-inductive type" <+> line <+> + prettyType a Open + )] +prettyNotSynths (MapNS {a} {b} {c} contras) = + bifoldMap + (const [(e.meta, pretty "ill-formed functor" <+> line <+> prettyType a Open)]) + (bifoldMap + (const [(e.meta, pretty "ill-formed source" <+> line <+> prettyType b Open)]) + (const [(e.meta, pretty "ill-formed target" <+> line <+> prettyType c Open)])) + contras +prettyNotSynths (GetChildrenNS {a} {b} contras) = + bifoldMap + (const [(e.meta, pretty "ill-formed functor" <+> line <+> prettyType a Open)]) + (const [(e.meta, pretty "ill-formed contents" <+> line <+> prettyType b Open)]) + contras + +prettyNotChecks (EmbedNC1 _ contra) = prettyNotSynths contra +prettyNotChecks (EmbedNC2 _ prf contra) = + case synthsRecompute prf of + Val b => + [(t.meta + , pretty "cannot unify" <+> line <+> + prettyType a Open <+> line <+> + pretty "and" <+> line <+> + prettyType b Open + )] +prettyNotChecks (LetNC1 contra) = prettyNotSynths contra +prettyNotChecks (LetNC2 prf contra) = + case synthsRecompute prf of + Val _ => prettyNotChecks contra +prettyNotChecks (LetTyNC {a} (This contra)) = + [(t.meta, pretty "ill-formed type" <+> line <+> prettyType a Open)] +prettyNotChecks (LetTyNC (That contra)) = prettyNotChecks contra +prettyNotChecks (LetTyNC (Both contra1 contra2)) = + (t.meta, pretty "ill-formed type" <+> line <+> prettyType a Open) :: + prettyNotChecks contra2 +prettyNotChecks (AbsNC1 contra) = + [(t.meta, pretty "cannot abstract to construct type" <+> line <+> prettyType a Open)] +prettyNotChecks (AbsNC2 prf contra) = + case isFunctionRecompute prf of + (Val _, Val _) => prettyNotChecks contra +prettyNotChecks (TupNC1 contra) = + [(t.meta, pretty "cannot tuple to construct type" <+> line <+> prettyType a Open)] +prettyNotChecks (TupNC2 contras) = prettyAnyNotChecks t.meta contras +prettyNotChecks (InjNC1 contra) = + [(t.meta, pretty "cannot inject to construct type" <+> line <+> prettyType a Open)] +prettyNotChecks (InjNC2 {l} contra) = + [(t.meta + , pretty "unknown label" <++> enclose "'" "'" (pretty l) <+> line <+> + pretty "in sum type" <+> line <+> + prettyType a Open + )] +prettyNotChecks (InjNC3 i contra) = + case [| (nameOf i).value |] of + Val _ => prettyNotChecks contra +prettyNotChecks (CaseNC1 contra) = prettyNotSynths contra +prettyNotChecks (CaseNC2 prf contra) = + case synthsRecompute prf of + Val a => [(t.meta, pretty "cannot case split on type" <+> line <+> prettyType a Open)] +prettyNotChecks (CaseNC3 prf contras) = + case synthsRecompute prf of + Val _ => prettyAnyNotBranches t.meta contras +prettyNotChecks (RollNC1 contra) = + [(t.meta, pretty "cannot roll to construct type" <+> line <+> prettyType a Open)] +prettyNotChecks (RollNC2 contra) = prettyNotChecks contra +prettyNotChecks (FoldNC1 contra) = prettyNotSynths contra +prettyNotChecks (FoldNC2 prf contra) = + case synthsRecompute prf of + Val a => [(t.meta, pretty "cannot fold over type" <+> line <+> prettyType a Open)] +prettyNotChecks (FoldNC3 prf contra) = + case synthsRecompute prf of + Val _ => prettyNotChecks contra + +prettyNotCheckSpine (Step1 {t} contra) = + [(t.meta, pretty "cannot apply non-function type" <+> line <+> prettyType a Open)] +prettyNotCheckSpine (Step2 (This contra)) = prettyNotChecks contra +prettyNotCheckSpine (Step2 (That contra)) = prettyNotCheckSpine contra +prettyNotCheckSpine (Step2 (Both contra1 contra2)) = + prettyNotChecks contra1 ++ prettyNotCheckSpine contra2 + +prettyAnyNotSynths (Step (This contra)) = prettyNotSynths contra +prettyAnyNotSynths (Step (That contra)) = prettyAnyNotSynths contra +prettyAnyNotSynths (Step (Both contra1 contra2)) = + prettyNotSynths contra1 ++ prettyAnyNotSynths contra2 + +prettyAnyNotChecks meta Base1 = + [(meta + , pretty "missing components" <+> line <+> + concatWith (surround $ "," <++> neutral) (map pretty as.names <>> []) + )] +prettyAnyNotChecks meta (Step1 {t, l} contra) = + [(t.meta , pretty "unknown label" <++> enclose "'" "'" (pretty l))] +prettyAnyNotChecks meta (Step2 i (This contra)) = + case [| (nameOf i).value |] of + Val _ => prettyNotChecks contra +prettyAnyNotChecks meta (Step2 i (That contra)) = prettyAnyNotChecks meta contra +prettyAnyNotChecks meta (Step2 i (Both contra1 contra2)) = + case [| (nameOf i).value |] of + Val _ => prettyNotChecks contra1 ++ prettyAnyNotChecks meta contra2 + +prettyAnyNotBranches meta Base1 = + [(meta + , pretty "missing cases" <+> line <+> + concatWith (surround $ "," <++> neutral) (map pretty as.names <>> []) + )] +prettyAnyNotBranches meta (Step1 {t, l} contra) = + [(t.meta , pretty "unknown label" <++> enclose "'" "'" (pretty l))] +prettyAnyNotBranches meta (Step2 i (This contra)) = + case [| (nameOf i).value |] of + Val _ => prettyNotChecks contra +prettyAnyNotBranches meta (Step2 i (That contra)) = prettyAnyNotBranches meta contra +prettyAnyNotBranches meta (Step2 i (Both contra1 contra2)) = + case [| (nameOf i).value |] of + Val _ => prettyNotChecks contra1 ++ prettyAnyNotBranches meta contra2 |