End KNOT_PROP.
(* Coercion *)
Module TyFunctorProp2TyFunctor (TF : TY_FUNCTOR_PROP) <: TY_FUNCTOR.
(*  EXport TFP. Does not seem to work? *)
Definition F := TF.F.
Definition T: Type := Prop.
Definition T_bot : T := False.
Definition other := TF.other.
End TyFunctorProp2TyFunctor.
Module KnotProp (TF':TY_FUNCTOR_PROP) : KNOT_PROP with Module TF:=TF'.
Module TF := TF'.
Module TF_G := TyFunctorProp2TyFunctor(TF).
Module Knot_G := Knot(TF_G).
Definition knot : Type := Knot_G.knot.
Definition predicate := (knot * other) -> Prop.
Definition squash : (nat * F predicate) -> knot :=
Knot_G.squash.
Definition unsquash : knot -> (nat * F predicate) :=
Knot_G.unsquash.
Definition ag_knot := Knot_G.ag_knot.
Existing Instance ag_knot.
Existing Instance ag_prod.
Definition approx (n:nat) (p:predicate) : predicate :=
fun w => level w < n /\ p w.

(* Specifications: *)
Lemma squash_unsquash : forall x, squash (unsquash x) = x.
Lemma unsquash_squash : forall n x', unsquash (squash (n,x')) = (n,fmap F (approx n) x').
Definition knot_level := Knot_G.knot_level.