Parameter T_bot:T.
Parameter T_rel : T -> T -> Prop.
Parameter T_rel_bot : forall x, T_rel T_bot x.
Parameter T_rel_refl : forall x, T_rel x x.
Parameter T_rel_trans : transitive T T_rel.
End TY_FUNCTOR_FULL.
Module Type KNOT_FULL.
Declare Module TF:TY_FUNCTOR_FULL.
Parameter knot:Type.
Parameter ageable_knot : ageable knot.
Existing Instance ageable_knot.
Parameter hered : (knot * other -> T) -> Prop.
Definition predicate := { p:knot * other -> T | hered p }.
Parameter squash : (nat * F predicate predicate) -> knot.
Parameter unsquash : knot -> (nat * F predicate predicate).
Parameter approx : nat -> predicate -> predicate.

(* Specifications: *)
Axiom squash_unsquash : forall k:knot, squash (unsquash k) = k.
Axiom unsquash_squash : forall (n:nat) (f:F predicate predicate),
unsquash (squash (n,f)) = (n, bimap (approx n) (approx n) f).
Axiom approx_spec : forall n p ko,
proj1_sig (approx n p) ko =
if (le_gt_dec n (level (fst ko))) then T_bot else proj1_sig p ko.