File: DOC.txt

package info (click to toggle)
hol-light 20190729-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 42,676 kB
  • sloc: ml: 637,078; cpp: 439; makefile: 301; lisp: 286; java: 279; sh: 239; yacc: 108; perl: 78; ansic: 57; sed: 39; python: 13
file content (121 lines) | stat: -rw-r--r-- 4,943 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
                  THEORY OF PERMUTATIONS ON LISTS
            (c) Marco Maggesi <maggesi@math.unifi.it>, 2005-2007
           Distributed with HOL Light under same license terms


The present library provides a simple theory about permutations on lists.
Some theorems and definition provided by this contribution are listed below.


Changes (since version distributed with HOL-Light 2.20)
=======================================================

- An implementation of the Quick Sort algorithm (file qsort.ml).

- Some new useful theorems (e.g., LIST_UNIQ_COUNT PERMUTED_COUNT PERMUTATION_COUNT).

- Several proofs have been rewritten in a clearer/faster.

- Removed (but kept in legacy.ml for now) several theorems falling in
  one or more of the following categories:
    * boring trivialities,
    * intermediate lemmas used only to prove stronger results,
    * things that were supposed to be useful but have not been actually used,
    * other unfortunate/unloved/misspelled stuff.


Some theorems proved in this library
====================================


Additional definitions about lists
----------------------------------

DELETE1               |- (!x. DELETE1 x [] = []) /\
		         (!x h t. DELETE1 x (h :: t) =
			          (if x = h then t else h :: DELETE1 x t))
COUNT                 |- (!x. COUNT x [] = 0) /\
 		         (!x h t. COUNT x (h :: t) =
			          (if x = h then SUC (COUNT x t) else COUNT x t))
LIST_UNIQ             |- LIST_UNIQ [] /\
                         (!x. LIST_UNIQ [x]) /\
 			 (!x xs. LIST_UNIQ (x :: xs) <=>
			         ~MEM x xs /\ LIST_UNIQ xs)


Definition of permuted lists
----------------------------

let PERMUTED_RULES, PERMUTED_INDUCT, PERMUTED_CASES =
  new_inductive_definition
  `[] PERMUTED [] /\
   (!h t1 t2. t1 PERMUTED t2 ==> h :: t1 PERMUTED h :: t2) /\
   (!l1 l2 l3. l1 PERMUTED l2 /\ l2 PERMUTED l3 ==> l1 PERMUTED l3) /\
   (!x y t. x :: y :: t PERMUTED y :: x :: t)`;;


Some theorems about permuted lists
----------------------------------

PERMUTED_RFL            |- !l. l PERMUTED l
PERMUTED_SYM            |- !xs l2. xs PERMUTED l2 <=> l2 PERMUTED xs
PERMUTED_TRS            |- !xs l2 l3. xs PERMUTED l2 /\ l2 PERMUTED l3
			              ==> xs PERMUTED l3
PERMUTED_NIL_EQ_NIL     |- (!l. [] PERMUTED l <=> l = []) /\
			   (!l. l PERMUTED [] <=> l = [])
PERMUTED_MAP            |- !f l1 l2. l1 PERMUTED l2
			             ==> MAP f l1 PERMUTED MAP f l2
PERMUTED_LENGTH         |- !l1 l2. l1 PERMUTED l2 ==> LENGTH l1 = LENGTH l2
PERMUTED_MEM            |- !a l1 l2. l1 PERMUTED l2 ==> (MEM a l1 <=> MEM a l2)
PERMUTED_SWAP_HEAD      |- !a b l. a :: b :: l PERMUTED b :: a :: l
PERMUTED_CONS_DELETE1   |- !a l. MEM a l ==> l PERMUTED a :: DELETE1 a l
PERMUTED_DELETE1        |- (!h t l. h :: t PERMUTED l <=>
			            MEM h l /\ t PERMUTED DELETE1 h l) /\
                           (!h t l. l PERMUTED h :: t <=>
			            MEM h l /\ DELETE1 h l PERMUTED t)
PERMUTED_COUNT          |- !l1 l2. l1 PERMUTED l2 <=>
			           (!x. COUNT x l1 = COUNT x l2)
PERMUTED_TAIL           |- !h t1 t2. h :: t1 PERMUTED h :: t2 <=>
			             t1 PERMUTED t2
PERMUTED_LIST_UNIQ      |- !xs ys. xs PERMUTED ys
			           ==> (LIST_UNIQ xs <=> LIST_UNIQ ys)
PERMUTED_ALL            |- !P xs ys. xs PERMUTED ys ==> (ALL P xs <=> ALL P ys)


Definition of permutation
-------------------------

REVPERM                 |- REVPERM 0 = [] /\ REVPERM (SUC n) = n :: REVPERM n
PERMUTATION             |- !l. PERMUTATION l <=> REVPERM (LENGTH l) PERMUTED l


Theorems about finite permutations
----------------------------------

PERMUTATION_NIL         |- PERMUTATION []
PERMUTATION_LIST_UNIQ   |- !l. PERMUTATION l ==> LIST_UNIQ l
PERMUTATION_MEM         |- !l. PERMUTATION l ==> (!i. MEM i l <=> i < LENGTH l)
PERMUTATION_COUNT       |- !l. PERMUTATION l <=>
		               (!x. COUNT x l = (if x<LENGTH l then 1 else 0))
PERMUTATION_SET_OF_LIST |- !l. PERMUTATION l <=>
			       set_of_list l = {n | n < LENGTH l}
MEM_PERMUTATION         |- !l. (!n. n < LENGTH l ==> MEM n l) ==> PERMUTATION l
PERMUTATION_UNIQ_LT     |- !l. PERMUTATION l <=>
                               LIST_UNIQ l /\ (!n. MEM n l ==> n < LENGTH l)


Quick sort
----------

QSORT                   |- (!le. QSORT le [] = []) /\
                           (!le h t. QSORT le (h :: t) =
			        APPEND (QSORT le (FILTER (\x. ~le h x) t))
 				       (h :: QSORT le (FILTER (\x. le h x) t)))
COUNT_QSORT             |- !le x l. COUNT x (QSORT le l) = COUNT x l
QSORT_PERMUTED          |- !le l. QSORT le l PERMUTED l
ALL_QSORT               |- !P le l. ALL P (QSORT le l) <=> ALL P l
LENGTH_QSORT            |- !le l. LENGTH (QSORT le l) = LENGTH l
MEM_QSORT               |- !le l x. MEM x (QSORT le l) <=> MEM x l
ORDERED_QSORT           |- !le l. (!x y. le x y \/ le y x) /\
                                  (!x y z. le x y \/ le y z ==> le x z)
 				  ==> ORDERED le (QSORT le l)