108 lines
2.2 KiB
Standard ML
108 lines
2.2 KiB
Standard ML
|
open HolKernel Parse boolLib bossLib;
|
||
|
|
||
|
open rich_listTheory arithmeticTheory
|
||
|
val _ = new_theory "e3";
|
||
|
|
||
|
|
||
|
``!l. APPEND l [] = l``
|
||
|
|
||
|
Induct >| [
|
||
|
REWRITE_TAC [APPEND],
|
||
|
ASM_REWRITE_TAC [APPEN]
|
||
|
])
|
||
|
|
||
|
|
||
|
|
||
|
open listTheory
|
||
|
|
||
|
|
||
|
val``!l1 l2. REV l1 l2 = REVERSE l1 ++ l2``
|
||
|
|
||
|
Induct >| [
|
||
|
REWRITE_TAC [REV_DEF, REVERSE, APPEND],
|
||
|
ASM_REWRITE_TAC [REVERSE, REV_DEF, APPEND_SNOC1]
|
||
|
])
|
||
|
|
||
|
``!l. REVERSE l = REV l []``
|
||
|
|
||
|
Induct >| [
|
||
|
REWRITE_TAC [REV_DEF, REVERSE],
|
||
|
ASM_REWRITE_TAC [REVERSE, REV_DEF]
|
||
|
])
|
||
|
|
||
|
|
||
|
``!l1 l2. LENGTH (DROP (LENGTH l2) (l1 ++ l2)) = LENGTH l1``
|
||
|
|
||
|
Induct >| [
|
||
|
REWRITE_TAC[LENGTH, APPEND, DROP_LENGTH_NIL],
|
||
|
|
||
|
Cases_on `l2` |> [
|
||
|
REWRITE_TAC[APPEND_NIL, LENGTH, DROP],
|
||
|
|
||
|
ASM_REWRITE_TAC[APPEND, LENGTH, DROP]
|
||
|
|
||
|
|
||
|
``!l1 l2. LENGTH (DROP (LENGTH l2) (l1 ++ l2)) = LENGTH l1``
|
||
|
|
||
|
REPEAT GEN_TAC >>
|
||
|
SPEC_TAC (``l1:'a list``, ``l1:'a list``) THEN
|
||
|
Induct_on `l2` >| [
|
||
|
REWRITE_TAC[LENGTH, DROP, APPEND_NIL],
|
||
|
|
||
|
Cases_on `l1` >| [
|
||
|
REWRITE_TAC[LENGTH, DROP, APPEND, DROP_LENGTH_NIL],
|
||
|
|
||
|
REPEAT GEN_TAC >>
|
||
|
REWRITE_TAC[LENGTH, DROP, APPEND] THEN
|
||
|
`t ++ h' :: l2 = (t ++ [h']) ++ l2` by REWRITE_TAC[APPEND, GSYM APPEND_ASSOC] >>
|
||
|
ASM_REWRITE_TAC[] >>
|
||
|
REWRITE_TAC[LENGTH_APPEND, LENGTH, ADD_CLAUSES]
|
||
|
]
|
||
|
])
|
||
|
|
||
|
|
||
|
val MAKE_CHANGE_def = Define `
|
||
|
(MAKE_CHANGE [] a = if (a = 0) then [[]] else []) /\
|
||
|
(MAKE_CHANGE (c::cs) a = (
|
||
|
(if (c <= a /\ 0 < a) then
|
||
|
(MAP (\l. c::l) (MAKE_CHANGE cs (a - c)))
|
||
|
else []) ++ (MAKE_CHANGE cs a)))`
|
||
|
|
||
|
|
||
|
val MAKE_CHANGE_PROP = prove(``!cs. MAKE_CHANGE cs 0 = [[]]``,
|
||
|
|
||
|
Induct >| [
|
||
|
REWRITE_TAC[MAKE_CHANGE_def],
|
||
|
ASM_REWRITE_TAC[MAKE_CHANGE_def, prim_recTheory.LESS_REFL, APPEND]
|
||
|
])
|
||
|
|
||
|
val MAKE_CHANGE_PROP1 = prove (``!cs a l.
|
||
|
MEM l (MAKE_CHANGE cs a) ==> (SUM l = a)``,
|
||
|
|
||
|
Induct >| [
|
||
|
REPEAT GEN_TAC >>
|
||
|
REWRITE_TAC[MAKE_CHANGE_def] >>
|
||
|
Cases_on `a = 0` >> (
|
||
|
ASM_REWRITE_TAC[MEM] THEN
|
||
|
REPEAT STRIP_TAC THEN
|
||
|
ASM_REWRITE_TAC[SUM]
|
||
|
),
|
||
|
|
||
|
REPEAT GEN_TAC >>
|
||
|
ASM_REWRITE_TAC [MAKE_CHANGE_def, MEM_APPEND, DISJ_IMP_THM] >>
|
||
|
Cases_on `h <= a /\ 0 < a` >| [
|
||
|
ASM_REWRITE_TAC[MEM_MAP] THEN
|
||
|
BETA_TAC THEN
|
||
|
REPEAT STRIP_TAC THEN
|
||
|
`SUM y = (a - h)` by METIS_TAC[] >>
|
||
|
ASM_REWRITE_TAC [SUM] >>
|
||
|
DECIDE_TAC,
|
||
|
|
||
|
ASM_REWRITE_TAC[MEM]
|
||
|
]
|
||
|
]);
|
||
|
|
||
|
|
||
|
val _ = export_theory();
|
||
|
|