fact: Definition Notation_Friendly_SharpenFully (RepT : Type) {m n n'} (consSigs : Vector.t consSig n) (methSigs : Vector.t methSig n') (consDefs : ilist consSigs) (methDefs : ilist methSigs) (DelegateSigs' : Vector.t ADTSig m) (DelegateReps' : Vector.t Type m) (Delegatees := Build_NamedDelegatees DelegateSigs' DelegateReps') (DelegateIDs := m) (DelegateSigs := fun idx => delegateeSig (Vector.nth Delegatees idx)) (DelegateReps := fun idx => delegateeRep (Vector.nth Delegatees idx)) (rep : (Fin.t DelegateIDs -> Type) -> Type) (cConstructors : forall (DelegateReps : Fin.t DelegateIDs -> Type) (DelegateImpls : forall idx, ComputationalADT.pcADT (DelegateSigs idx) (DelegateReps idx)), ilist (B := fun Sig : consSig => ComputationalADT.cConstructorType (rep DelegateReps) (consDom Sig)) consSigs) (cMethods : forall (DelegateReps : Fin.t DelegateIDs -> Type) (DelegateImpls : forall idx, ComputationalADT.pcADT (DelegateSigs idx) (DelegateReps idx)), ilist (B := fun Sig : methSig => ComputationalADT.cMethodType (rep DelegateReps) (methDom Sig) (methCod Sig)) methSigs) (DelegateSpecs' : ilist (B := fun nadt => ADT (delegateeSig nadt)) Delegatees ) (DelegateSpecs := ith DelegateSpecs') (cAbsR : forall (DelegateReps : Fin.t DelegateIDs -> Type) (DelegateImpls : forall idx, ComputationalADT.pcADT (DelegateSigs idx) (DelegateReps idx)) (ValidImpls : forall idx : Fin.t DelegateIDs, refineADT (DelegateSpecs idx) (ComputationalADT.LiftcADT (existT _ _ (DelegateImpls idx)))), RepT -> rep DelegateReps -> Prop) (cConstructorsRefinesSpec : forall (DelegateReps : Fin.t DelegateIDs -> Type) (DelegateImpls : forall idx, ComputationalADT.pcADT (DelegateSigs idx) (DelegateReps idx)) (ValidImpls : forall idx : Fin.t DelegateIDs, refineADT (DelegateSpecs idx) (ComputationalADT.LiftcADT (existT _ _ (DelegateImpls idx)))), Iterate_Dep_Type_BoundedIndex (fun idx => @refineConstructor (RepT) (rep DelegateReps) (cAbsR _ _ ValidImpls) (consDom (Vector.nth consSigs idx)) (getConsDef consDefs idx) (LiftcConstructor _ _ (ith (cConstructors DelegateReps DelegateImpls) idx)))) (cMethodsRefinesSpec : forall (DelegateReps : Fin.t DelegateIDs -> Type) (DelegateImpls : forall idx, ComputationalADT.pcADT (DelegateSigs idx) (DelegateReps idx)) (ValidImpls : forall idx : Fin.t DelegateIDs, refineADT (DelegateSpecs idx) (ComputationalADT.LiftcADT (existT _ _ (DelegateImpls idx)))), Iterate_Dep_Type_BoundedIndex (fun idx => @refineMethod RepT (rep DelegateReps) (cAbsR _ _ ValidImpls) (methDom (Vector.nth methSigs idx)) (methCod (Vector.nth methSigs idx)) (getMethDef methDefs idx) (LiftcMethod (ith (cMethods DelegateReps DelegateImpls) idx)))) : FullySharpenedUnderDelegates (BuildADT consDefs methDefs) {| Sharpened_DelegateSigs := DelegateSigs; Sharpened_Implementation := Notation_Friendly_BuildMostlySharpenedcADT _ rep cConstructors cMethods; Sharpened_DelegateSpecs := DelegateSpecs |}.
imports: Coq.Lists.List Coq.Arith.Arith Fiat.Common Fiat.Computation Fiat.ADT.ADTSig Fiat.ADT.Core Fiat.ADT.ComputationalADT Fiat.Common.BoundedLookup Fiat.Common.ilist Fiat.Common.IterateBoundedIndex Fiat.ADTNotation.BuildADTSig Fiat.ADTNotation.BuildADT Fiat.ADTNotation.BuildComputationalADT Fiat.ADTNotation.BuildADTReplaceMethods Fiat.ADTRefinement.Core Fiat.ADTRefinement.GeneralRefinements Fiat.ADTRefinement.SetoidMorphisms Fiat.ADTRefinement.BuildADTSetoidMorphisms Coq.Strings.String