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 hered_spec : forall p,
hered p =
(forall k k' k'' o o',
clos_refl_trans _ age k k' ->
knot_rel  k' k'' ->
ORel o o' ->
T_rel (p (k,o)) (p (k'',o'))).