[Date Prev][Date Next] [Chronological] [Thread] [Top]

[mizar] Question about functions' correctness



Dear All,

I posted a question on August 19th about how to prove correctness (existence and uniqueness) of a binary recursive function. Professor Trybulec and Grabowski asked me to attach the mizar article for more specificity. I am pasting the article here and my comments and questions follow the article.

environ
 vocabularies MCART_1,   ::` operator
              FUNCT_1,   ::nothing imported from SEQ_1
              ARYTM_3,
              NAT_1,     ::mod
              PRE_FF,
              ARYTM,     ::required for numeral zero(0)
              MARGREL1,  ::for BOOLEAN,TRUE
              MY_MIZAR;  ::egcd, if_then_else

 notations SUBSET_1,
           NUMBERS,    ::required for zero
           NAT_1,
           NAT_D,      ::mod format
           MCART_1,    ::requried for [ and ] (cart.prod.)
           SEQ_1,      ::.operator(?)
           FUNCT_2,    ::Function of
           DOMAIN_1,   ::unknown functor format ]
           MARGREL1,   ::BOOLEAN, TRUE, FALSE
           XXREAL_0;   ::>=, <

 constructors NAT_1,
              NAT_D,
              SEQ_1,
              DOMAIN_1,
              MARGREL1,
              XXREAL_0;

 registrations SUBSET_1,
               ORDINAL1,
               XXREAL_0; ::>=, < (with Element of NAT)
                         ::cluster natural -> ext-real num.

 requirements NUMERALS, SUBSET, BOOLE, ARITHM;
 theorems ORDINAL1,MCART_1;
 schemes NAT_1;

begin

 definition
 let D be set; let x be Element of BOOLEAN;
 let y,z be Element of D;
 func if_then_else(x,y,z) -> Element of D equals
 :Def2:y if (x = TRUE) otherwise z;
 correctness;
 end;

 definition
 let D be set; let x be Element of D;
 func saeq0(x) -> Element of BOOLEAN equals
 :Def3:TRUE if (x = 0) otherwise FALSE;
 correctness;
 end;

 definition
 let m,n be Element of NAT;
 func modmn(m,n) -> Element of NAT equals
 :Def4: m mod n;
 correctness;
 end;

 definition
 func egcd -> Function of [:NAT,NAT:],NAT means
  for m,n being Element of NAT holds
   (m >= n & n > 0) implies
     (it.([m,n])=if_then_else(saeq0(n),m,it.([n,modmn(m,n)])));
 existence;
::>      *4
 uniqueness;
::>       *4
 end;


My comments first:
1) Please ignore some of the directive items (they were required for some proofs I removed and left only those required my questions).
2) I am interested in translating quite some functions from a functional language to Mizar and prove properties of them. That is why
   I want to have a much better understanding of writing Mizar functions, functors and use them in my proofs. To this end, I constantly
   search the MML for functors and functions as examples, read Mizar tutorials and articles that I find on the Internet.
  I realized that I need much more insight and understanding.
3)egcd is a recursive Euclidean greatest common divisor function which is the more or less translation of
   egcd(m,n) = if (n = 0) then m else egcd(n,m mod n) with the assumption of m >= n > 0.
4) I got help from Professor Yatsuka Nakamura's paper called "Proving the Correctness of Functional Programs using Mizar" both in writing the
   if_then_else functor and getting ideas on how to write the rest.

QUESTIONS:
1) What scheme I can/should use from the MML to prove the existence and uniqueness of egcd? (I could not find one in the MML)
2) I tried to write egcd like the following with arguments but could not complete the parts with question marks.

       definition
       let m,n be Element of NAT;
       func egcd(m,n) -> Element of NAT means
       for m,n be Element of NAT holds (m >= n & n > 0) implies
           ?????=if_then_else(saeq0(n),m, ?????);
       existence;
       uniqueness;
       end;


I will stop with these questions and comments for now. I truly appreciate your help. Thank you and have a good semester...

Adem Ozyavas