Skip to Content.
Sympa Menu

coq-club - Re: [Coq-Club] Mapping of types to new one in a project

coq-club AT inria.fr

Subject: The Coq mailing list

List archive

Re: [Coq-Club] Mapping of types to new one in a project


Chronological Thread 
  • From: mukesh tiwari <mukeshtiwari.iiitm AT gmail.com>
  • To: coq-club AT inria.fr
  • Subject: Re: [Coq-Club] Mapping of types to new one in a project
  • Date: Mon, 24 Jul 2023 19:27:06 +0100
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None smtp.pra=mukeshtiwari.iiitm AT gmail.com; spf=Pass smtp.mailfrom=mukeshtiwari.iiitm AT gmail.com; spf=None smtp.helo=postmaster AT mail-yw1-f169.google.com
  • Ironport-data: A9a23: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
  • Ironport-hdrordr: A9a23:4Z/Y+6ym99W67/cXZ7j1KrPwFb1zdoMgy1knxilNoH1uA7Wlfq WV9sjzuiWE7Qr5NEtQ++xofZPwIk80lqQV3WByB8bHYOCOggLBR72Kr7GD/9SKIVyYygcy79 YHT0G8MrHN5JpB4PoSLDPWLz/o+re6zJw=
  • Ironport-phdr: A9a23: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 gRRhL2hc9VVOYr81EhvLFJ9mdaSc3c=
  • Ironport-sdr: 64bec289_2ICjd4R725jML9t3Ow6mr9ZZTi+Q1EhFX+ahYS9HHSd3kTA im6/YJLo0+/EoDU2DOOUhM6q1+ESK+KsdKApNRw==

No worries. Also, if you don't mind functional extensionality [1], then you can prove: Theorem same_f_old_new : f_new  = fun r => List.map f (f_old r)  and use it to replace f_new (it will make rewrite a bit easier).

Best,
Mukesh
 


[1] https://coq.inria.fr/library/Coq.Logic.FunctionalExtensionality.html

On Mon, Jul 24, 2023 at 6:52 PM Suneel Sarswat <suneel.sarswat AT gmail.com> wrote:
Dear Mukesh,
Thanks a lot for this answer. This is natural and I am feeling bad about my laziness. 
Also thanks for the last two theorems, this will be anyway needed.  
Have a great day.
Regards,
Suneel

On Mon, Jul 24, 2023 at 10:34 PM mukesh tiwari <mukeshtiwari.iiitm AT gmail.com> wrote:
Hi Suneel,

I am not sure if it's exactly going to help in your case but you can prove a lemma like this:

 Theorem same_f_old_new : forall (r : list r_old), f_new r = List.map f (f_old r).
 

And use it to replace (f_new r) with (List.map f (f_old r), and hopefully, after this you can use the theorems related to f_old.  (I must confess that I don't understand coercions (:>) very well so it is quite possible that there might be an easier solution, or this one may not work).

Best,
Mukesh

Require Import List.

Section Rec.

  Record r_old : Type :=
      mk_old {
        a :> nat;
        b : nat
      }.

  Record r_new : Type := 
    mk_new {
    c : nat;
    d : nat 
  }.

  Definition f (u : r_old) : r_new :=
    match u as _ return r_new with
    | mk_old a b => mk_new a b 
    end.

  Definition g (u : r_new) : r_old :=
  match u as _ return r_old with
  | mk_new a b => mk_old a b
  end.

(* This might come handy *) Theorem first : forall (r : r_old), g (f r) = r. Proof. intro r. refine match r with | mk_old a b => eq_refl end. Qed. Theorem second : forall (r : r_new), f (g r) = r. Proof. intro r. refine match r with | mk_new a b => eq_refl end. Qed.
(* end of handy theorems *) (* Your definition of f_old *) Definition f_old (B: list r_old) : (list r_old). Admitted. (* Your definition of f_new *) Definition f_new (B: list r_old): (list r_new). Admitted. Theorem same_fold_new_old : forall (r : list r_old), f_new r = List.map f (f_old r). Proof. Admitted.

  (* I don't think you need this but we never know :) *)
  Theorem same_fold_old_new : forall (r : list r_old), f_old r = List.map g (f_new r).
  Proof.
  Admitted.

End Rec.





On Mon, Jul 24, 2023 at 12:54 PM Suneel Sarswat <suneel.sarswat AT gmail.com> wrote:
Dear friends,

I have an old project (large one) in which I have a few functions, their specifications, and their correctness theorem along with their correctness proofs. Now I have redefined some of the functions and even input-output types. Although my new input types have changed, but the actual values and computations are the same. It's the types at each input instance that have changed (not their actual values and computations) and old functions are replaced with more efficient versions now (See a minimum example below.).

Now I want to restate some of the theorems in terms of new input-output types and functions. The goal is to do this with a minimum amount of new proofs or minimum efforts by using old functions and their correctness proofs.  

Basically, I want to show a bijection between the outputs of new and old programs and then want to use it to show the correctness of the theorems without redoing the old work again (which means using the old work as a black box). Please suggest some ideas.

Have a great day.

- Suneel

--------------------------------

(* Old input type *)

Record r_old:Type:= Mk_r{
                        a:> nat;
                        b: nat;
                        }.


(* Current input type is *)

Record r_new:Type:= Mk_r{
                        c: nat;
                        d: nat;
                        }.

(* I have a = c and b = d. *)

(* Old function *)

Definition f_old (B: list r_old): (list r_old):= f_old ( Sort_old a_dec B).

(* New function *)

Definition f_new (B: list r_old): (list r_new):= f_new ( Sort_new c_dec B).

(* Note: 
    Sort_new is more efficient than Sort_old. 
    The elements of B are all unique.
    f_new and f_old are the "same" programs in the sense that they do exactly the same calculations. Also is there any way to avoid writing f_new?*)




Archive powered by MHonArc 2.6.19+.

Top of Page