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.
Definition knot_rel (k1 k2:knot) :=
let (n,f) := unsquash k1 in
let (n',f') := unsquash k2 in
n = n' /\ Rel predicate predicate f f'.

Axiom knot_age1 : forall k:knot,
age1 k =
match unsquash k with
| (O,_) => None
| (S n,x) => Some (squash (n,x))
end.