That's to say, I need to create my own sorted predicate? I realised it in the 
past few days, however, I have no idea about this, I always wanted to implement 
it by myself. But now, I find I just need to use SORTED,as follows:


val mysorted_def = Define `
    mysorted xs = SORTED (\x y. x <= y) xs`


Thank you very much! I will try my proofs again.


Regards,


Liu


-----Original Messages-----
From:michael.norr...@data61.csiro.au
Sent Time:2017-12-04 13:35:21 (Monday)
To: 2015200...@mail.buct.edu.cn
Cc: hol-info@lists.sourceforge.net
Subject: Re: [Hol-info] Proof about sorting



I’m pretty confident that your property is a consequence of being SORTED; see 
SORTED_EQ in sortingTheory for example.

 

You would then need to establish that your function does indeed create lists 
that are SORTED.

 

Your property0 is also too specific, you shouldn’t require pop = mySort pop.

 

Michael

 

From: Liu Gengyang <2015200...@mail.buct.edu.cn>
Date: Monday, 4 December 2017 at 14:38
To: "Norrish, Michael (Data61, Acton)" <michael.norr...@data61.csiro.au>
Cc: hol4_QA <hol-info@lists.sourceforge.net>
Subject: Re: Re: [Hol-info] Proof about sorting

 

 

Hi Michael,

 

I have been seen these documents before, but there is no theorem same to which 
I wanted. Also, I try to use QSORT to prove the property1 which same as 
property0, as follows:

 

!xs. EVERY (\y. HD (QSORT (\x. $<= x) xs) <= y) xs

Induct >-

   RW_TAC list_ss [] >>

RW_TAC list_ss [listTheory.EVERY_DEF,QSORT_DEF] >| [

   FULL_SIMP_TAC list_ss [PARTITION_DEF] >>

   Cases_on `xs` >| [

      FULL_SIMP_TAC list_ss [PART_DEF,listTheory.EVERY_DEF] >>

      `l1 = []` by RW_TAC std_ss [] >>

      `l2 = []` by RW_TAC std_ss [] >>

      FULL_SIMP_TAC list_ss [QSORT_DEF],

      ……

 

(*Here,I think I need to prove any elements in l1 are smaller than h firstly, 
then to prove HD [x++y++z] = HD [x], so I can prove this subgoal. 
Unfortunately, I am failed*)

 

In addition, I think the definition about sorting(i.e. mergesortN_curried_def, 
QSORT_curried_DEF, QSORT3_curried_DEF etc.) in mergesortTheory and 
sortingTheory is different from mine. Even if I proved property1, I still can't 
prove property0.

 

Regards,

 

Liu





-----Original Messages-----
From:michael.norr...@data61.csiro.au
Sent Time:2017-12-04 11:03:39 (Monday)
To:2015200...@mail.buct.edu.cn, hol-info@lists.sourceforge.net
Cc:
Subject: Re: [Hol-info] Proof about sorting

There are proofs that quick-sort and merge-sort are correct in the distribution 
already.  Perhaps looking at these examples in src/sort will give you some 
clues.

 

Michael

 

From: Liu Gengyang <2015200...@mail.buct.edu.cn>
Date: Monday, 4 December 2017 at 13:02
To: hol4_QA <hol-info@lists.sourceforge.net>
Subject: [Hol-info] Proof about sorting

 

Hi,

 

Recently I am meeting a problem, it has been confusing me a few days, seeking 
for help.

 

I defined a sorting predicate mySort:

 

val insert_def = Define `

    (insert x [] = [x]) /\ 

    (insert x (h::t) = if x <= h

           then (x::h::t)

           else (h::(insert x t)))`;

 

val mySort_def = Define `

  (mySort [] = []) /\

  (mySort (h::t) = (insert h (mySort t)))`;

 

EVAL ``mySort [2;4;1;5;3;2]``

> val it = |- mySort [2; 4; 1; 5; 3; 2] = [1; 2; 2; 3; 4; 5] : thm

 

Now I want to prove the property0: for any pop: list, if it is sorted by 
mySort, the first element in pop will less than or equal to other elements in 
pop.

 

I try to represent property0 in HOL4, but I meet a question, that is ``mySort 
pop`` isn't a bool term, so I use two ways to solve it:

 

1, !pop. (pop = mySort pop) ==> EVERY(\x. (HD pop) <= x) pop

 

2, !pop. EVERY (\x. HD (mySort pop) <= x) (mySort pop)

 

However, I can't prove both of them. When I used the Induct tactic to `pop` or 
`mySort pop`, the goal will be more and more complex, and the property0 can't 
reflect in the proving process, it seems unsolvable. Does the representation of 
1 and 2 is wrong, or the definition of mySort is wrong too?How can I prove the 
property0?

 

By the way, I prove 3 property about mySort and insert during I prove 1 and 2.

 

val INSNOTNULL_POP = prove(``!h pop.insert h pop <> []``,

    RW_TAC std_ss [] >>

    Cases_on `pop` >-

      RW_TAC list_ss [insert_def] >>

    RW_TAC list_ss [insert_def]);

val SORTNOTNULL_POP = prove(``!pop. pop <> [] ==> mySort pop <> [] /\ (mySort 
pop= insert (HD pop) (mySort (TL pop)))``,

    RW_TAC list_ss [] >| [

        Cases_on `pop` >-

          RW_TAC list_ss [mySort_def] >>

        RW_TAC list_ss [mySort_def,INSNOTNULL_POP],

        Induct_on `pop` >-

          RW_TAC list_ss [] >>

        RW_TAC list_ss [] >>

        RW_TAC list_ss [mySort_def]

]);

val SORTNULL_POP = prove(``!pop. (pop = []) <=>(mySort pop = [])``,

    GEN_TAC >>

    EQ_TAC >-

      RW_TAC list_ss [mySort_def] >>

    Induct_on `pop` >-

      RW_TAC list_ss [] >>

    RW_TAC list_ss [mySort_def] >>

    Cases_on `pop` >-

      RW_TAC list_ss [mySort_def,insert_def] >>

    RW_TAC list_ss [mySort_def,INSNOTNULL_POP]);

 

Regards,

 

Liu
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to