Canonical Structure recurse_form x y (f : form x) :=
  Form (recurse_pf y f).(* The algorithm works as follow: Let x and y be the pointers we are looking for
   - If we found x, then search for y using the previous module
   - If we found y, then search for x using the previous module
   - If, instead, we found some pointer z, then recurse
*)

(* Stucture for controlling the flow of the algorithm *)
Structure tagged_seq := Tag {untag : seq ptr}.(* The algorithm works as follow: Let x and y be the pointers we are looking for
   - If we found x, then search for y using the previous module
   - If we found y, then search for x using the previous module
   - If, instead, we found some pointer z, then recurse
*)

(* Stucture for controlling the flow of the algorithm *)
Structure tagged_seq := Tag {untag : seq ptr}.(* The algorithm works as follow: Let x and y be the pointers we are looking for
   - If we found x, then search for y using the previous module
   - If we found y, then search for x using the previous module
   - If, instead, we found some pointer z, then recurse
*)

(* Stucture for controlling the flow of the algorithm *)
Structure tagged_seq := Tag {untag : seq ptr}.Definition foundz_tag := Tag.Definition foundy_tag := foundz_tag.Canonical Structure foundx_tag s := foundy_tag s.(* Main structure *)
Structure form x y := Form {seq_of : tagged_seq; _ : axiom x y seq_of}.(* Main structure *)
Structure form x y := Form {seq_of : tagged_seq; _ : axiom x y seq_of}.(* Main structure *)
Structure form x y := Form {seq_of : tagged_seq; _ : axiom x y seq_of}.

Lemma foundx_pf x y (s : Search.form y) : axiom x y (foundx_tag (x :: s)).