I finally understand how to translate between miz3 and straight HOL Light. I
profited from the Mizar-like code in the HOL Light tutorial p 76--78, which I
modified to
let consider th pf = SUBGOAL_THEN th CHOOSE_TAC THENL [pf; ALL_TAC];;
let state th pf = SUBGOAL_THEN th ASSUME_TAC THENL [pf; ALL_TAC];;
let statelab th lab pf = SUBGOAL_THEN th (LABEL_TAC lab) THENL [pf; ALL_TAC];;
let toprove th = SUBGOAL_THEN th ASSUME_TAC;;
let mby labs MesonList = MAP_EVERY (fun l -> USE_THEN l MP_TAC) labs THEN
(MESON_TAC MesonList);;
let soby labs MesonList = FIRST_ASSUM MP_TAC THEN MAP_EVERY
(fun l -> USE_THEN l MP_TAC) labs THEN (MESON_TAC MesonList);;
Using this code I mechanically turned a 35-line miz3 proof of
UniversalPropertyProduct
|- ∀ M A B f g.
f ∈ M → A ∧ g ∈ M → B
⇒ (∃! h. h ∈ M → A ∏ B ∧ FST ∘ (h,M) = f ∧ SND ∘ (h,M) = g)
into a 28-line tactics script with almost identical MESON solved at numbers:
42063, 42992, 2590, 2687, 4515, 70020
42063, 42992, 1757 1854 4173, 70020
The only purpose of my Mizar-like code is to replace long lines with much
shorter ones, as in
e(FIRST_ASSUM MP_TAC THEN USE_THEN "hDef" MP_TAC THEN USE_THEN "kOffM" MP_TAC
THEN
MESON_TAC[FUN_EQ_THM; ∉]);;
soby ["hDef"; "kOffM"] [FUN_EQ_THM; ∉]
As Rob explained, STRIP_ASSUME_TAC handles the miz3 cases, so there's no need
for special coding. My `toprove' could easily be removed, and `state th pf'
could be replaced by `statelab th "" pf'.
Here's my tactics script for UniversalPropertyProduct, together with the
definitions and lemmas needed and my modification of John's Mizar-like code,
first with more readable math characters, with working HOL Light code below.
I'm including the miz3 proof, and you can see it's practically the same as my
tactics script except the miz3 proof is prettier, far fewer backquotes,
double-quotes, square braces, parentheses and type annotations. I impressed
that Freek made the miz3 code so pretty, and got Ocaml to cache results, but
it's basically what I'm doing in my tactics script.
parse_as_infix("∉",(11, "right"));;
parse_as_infix("∏",(20, "right"));;
parse_as_infix("∘",(20, "right"));;
parse_as_infix("→",(13,"right"));;
let ∉ = new_definition
`∀ a:A l:A->bool. a ∉ l ⇔ ¬(a ∈ l)`;;
let CartesianProduct = new_definition
`∀ X Y. X ∏ Y = {x,y | x ∈ X ∧ y ∈ Y}`;;
let IN_CartesianProduct = prove
(`∀ X Y x y. x,y ∈ X ∏ Y ⇔ x ∈ X ∧ y ∈ Y`,
REWRITE_TAC[IN_ELIM_THM; CartesianProduct] THEN MESON_TAC[PAIR_EQ]);;
let FunctionSpace = new_definition
`∀ s t. s → t = {f | (∀ x. x ∈ s ⇒ f x ∈ t) ∧
∀ x. x ∉ s ⇒ f x = @y. T}`;;
let IN_FunctionSpace = prove
(`∀ s t f. f ∈ s → t
⇔ (∀ x. x ∈ s ⇒ f x ∈ t) ∧ ∀ x. x ∉ s ⇒ f x = @y. T`,
REWRITE_TAC[IN_ELIM_THM; FunctionSpace]);;
let FunctionComposition = new_definition
`∀ f:A->B s:A->bool g:B->C x.
(g ∘ (f,s)) x = if x ∈ s then g (f x) else @y:C. T`;;
let UniversalPropertyProduct = prove
(`∀ M:μ->bool A:α->bool B:β->bool f:μ->α g:μ->β .
f ∈ M → A ∧ g ∈ M → B
⇒ (∃! h. h ∈ M → A ∏ B ∧ FST ∘ (h,M) = f ∧ SND ∘ (h,M) = g)`,
REPEAT GEN_TAC THEN DISCH_THEN(LABEL_TAC "H1") THEN
consider `?h:μ->α#β. h = λx:μ. if x ∈ M then f x,g x else @y. T` (mby []
[]) THEN
statelab `∀ x:μ. (x ∈ M ⇒ (h:μ->α#β) x = f x,g x) ∧ (x ∉ M ⇒ h x = @y.
T)` "hDef"
(soby [] [∉]) THEN
statelab `∀ x:μ. x ∈ M ⇒ (h:μ->α#β) x ∈ A ∏ B` "hProd" (soby ["H1"]
[IN_FunctionSpace; IN_CartesianProduct]) THEN
state `∀ x:μ. x ∈ M ⇒ FST ((h:μ->α#β) x) = f x ∧ SND (h x) = g x`
(mby ["hDef"] [FST_DEF; SND_DEF; PAIR_EQ]) THEN
state `∀ x:μ. (x ∈ M ⇒ (FST ∘ ((h:μ->α#β),M)) x = f x) ∧ (x ∉ M ⇒ (FST ∘
(h,M)) x = f x) ∧
(x ∈ M ⇒ (SND ∘ (h,M)) x = g x) ∧ (x ∉ M ⇒ (SND ∘ (h,M)) x = g x)`
(soby ["H1"] [FunctionComposition; ∉; IN_FunctionSpace]) THEN
statelab `(h:μ->α#β) ∈ M → A ∏ B ∧ FST ∘ (h,M) = f ∧ SND ∘ (h,M) = g`
"hWorks"
(soby ["hDef"; "hProd"] [IN_FunctionSpace; ∉; FUN_EQ_THM]) THEN
toprove `∀ (k:μ->α#β). (k ∈ M → A ∏ B ∧ FST ∘ (k,M) = f ∧ SND ∘ (k,M) =
g) ⇒ h = k`
THENL[GEN_TAC THEN DISCH_THEN(LABEL_TAC "kWorks");
soby ["hWorks"] [EXISTS_UNIQUE_THM]] THEN
statelab `∀ x:μ. x ∉ M ⇒ (k:μ->α#β) x = @y. T` "kOffM" (soby []
[IN_FunctionSpace]) THEN
toprove `∀ x:μ. x ∈ M ⇒ (k:μ->α#β) x = f x,g x ` THENL[
GEN_TAC THEN DISCH_THEN(LABEL_TAC "xM");
soby ["hDef"; "kOffM"] [FUN_EQ_THM; ∉]] THEN
state `FST ((k:μ->α#β) x) = f x ∧ SND (k x) = g x` (soby ["kWorks"]
[FunctionComposition]) THEN
state `(k:μ->α#β) x = FST (k x), SND (k x) ∧ FST (k x) = f x ∧ SND (k x)
= g x`
(soby ["kWorks"] [PAIR]) THEN
soby [] [PAIR_EQ]);;
Here's my original miz3 proof, which I mechanically turned into the above
tactics script. I think they look very similar, and I think this shows that I
understand miz3 in terms of HOL LIGHT.
let UniversalPropertyProduct = thm `;
∀ M:μ->bool A:α->bool B:β->bool f:μ->α g:μ->β .
f ∈ M → A ∧ g ∈ M → B
⇒ (∃! h. h ∈ M → A ∏ B ∧ FST ∘ (h,M) = f ∧ SND ∘ (h,M) = g)
proof
let M be μ->bool;
let A be α->bool;
let B be β->bool;
let f be μ->α;
let g be μ->β;
assume f ∈ M → A ∧ g ∈ M → B [H1];
consider h such that
h = λx. if x ∈ M then f x,g x else @y. T;
∀ x. (x ∈ M ⇒ h x = f x,g x) ∧ (x ∉ M ⇒ h x = @y. T) [hDef] by -, ∉;
∀ x. x ∈ M ⇒ h x ∈ A ∏ B [hProd] by -, H1, IN_FunctionSpace,
IN_CartesianProduct;
∀ x. x ∈ M ⇒ FST (h x) = f x ∧ SND (h x) = g x by hDef, FST_DEF,
SND_DEF, PAIR_EQ;
∀ x. (x ∈ M ⇒ (FST ∘ (h,M)) x = f x) ∧ (x ∉ M ⇒ (FST ∘ (h,M)) x = f x)
∧
(x ∈ M ⇒ (SND ∘ (h,M)) x = g x) ∧ (x ∉ M ⇒ (SND ∘ (h,M)) x = g x)
by FunctionComposition, ∉, -, H1, IN_FunctionSpace;
h ∈ M → A ∏ B ∧ FST ∘ (h,M) = f ∧ SND ∘ (h,M) = g [hWorks] by hDef,
hProd, IN_FunctionSpace, -, ∉, FUN_EQ_THM;
∀ k. (k ∈ M → A ∏ B ∧ FST ∘ (k,M) = f ∧ SND ∘ (k,M) = g) ⇒ h = k
proof
let k be μ->α#β;
assume k ∈ M → A ∏ B ∧ FST ∘ (k,M) = f ∧ SND ∘ (k,M) = g [kWorks];
∀ x. x ∉ M ⇒ k x = @y. T [kOffM] by -, IN_FunctionSpace;
∀ x. x ∈ M ⇒ k x = f x,g x
proof
let x be μ;
assume x ∈ M [xM];
FST (k x) = f x ∧ SND (k x) = g x by -, kWorks, FunctionComposition;
k x = FST (k x), SND (k x) ∧ FST (k x) = f x ∧ SND (k x) = g x by
-, PAIR, kWorks;
qed by -, PAIR_EQ;
qed by hDef, -, kOffM, FUN_EQ_THM, ∉;
qed by hWorks, -, EXISTS_UNIQUE_THM;
`;;
--
Best,
Bill
HOL Light code:
parse_as_infix("NOTIN",(11, "right"));;
parse_as_infix("times",(20, "right"));;
parse_as_infix("composition",(20, "right"));;
parse_as_infix("--->",(13,"right"));;
let NOTIN = new_definition
`! a:A l:A->bool. a NOTIN l <=> ~(a IN l)`;;
let CartesianProduct = new_definition
`! X Y. X times Y = {x,y | x IN X /\ y IN Y}`;;
let IN_CartesianProduct = prove
(`! X Y x y. x,y IN X times Y <=> x IN X /\ y IN Y`,
REWRITE_TAC[IN_ELIM_THM; CartesianProduct] THEN MESON_TAC[PAIR_EQ]);;
let FunctionSpace = new_definition
`! s t. s ---> t = {f | (! x. x IN s ==> f x IN t) /\
! x. x NOTIN s ==> f x = @y. T}`;;
let IN_FunctionSpace = prove
(`! s t f. f IN s ---> t
<=> (! x. x IN s ==> f x IN t) /\ ! x. x NOTIN s ==> f x = @y. T`,
REWRITE_TAC[IN_ELIM_THM; FunctionSpace]);;
let FunctionComposition = new_definition
`! f:A->B s:A->bool g:B->C x.
(g composition (f,s)) x = if x IN s then g (f x) else @y:C. T`;;
let UniversalPropertyProduct = prove
(`! M:mu->bool A:alpha->bool B:beta->bool f:mu->alpha g:mu->beta .
f IN M ---> A /\ g IN M ---> B
==> (?! h. h IN M ---> A times B /\ FST composition (h,M) = f /\
SND composition (h,M) = g)`,
REPEAT GEN_TAC THEN DISCH_THEN(LABEL_TAC "H1") THEN
consider `?h:mu->alpha#beta. h = \x:mu. if x IN M then f x,g x else @y. T`
(mby [] []) THEN
statelab `! x:mu. (x IN M ==> (h:mu->alpha#beta) x = f x,g x) /\ (x NOTIN
M ==> h x = @y. T)` "hDef"
(soby [] [NOTIN]) THEN
statelab `! x:mu. x IN M ==> (h:mu->alpha#beta) x IN A times B` "hProd"
(soby ["H1"] [IN_FunctionSpace; IN_CartesianProduct]) THEN
state `! x:mu. x IN M ==> FST ((h:mu->alpha#beta) x) = f x /\ SND (h x)
= g x`
(mby ["hDef"] [FST_DEF; SND_DEF; PAIR_EQ]) THEN
state `! x:mu. (x IN M ==> (FST composition ((h:mu->alpha#beta),M)) x = f
x) /\ (x NOTIN M ==> (FST composition (h,M)) x = f x) /\
(x IN M ==> (SND composition (h,M)) x = g x) /\ (x NOTIN M ==> (SND
composition (h,M)) x = g x)`
(soby ["H1"] [FunctionComposition; NOTIN; IN_FunctionSpace]) THEN
statelab `(h:mu->alpha#beta) IN M ---> A times B /\ FST composition (h,M)
= f /\ SND composition (h,M) = g` "hWorks"
(soby ["hDef"; "hProd"] [IN_FunctionSpace; NOTIN; FUN_EQ_THM]) THEN
toprove `! (k:mu->alpha#beta). (k IN M ---> A times B /\ FST composition
(k,M) = f /\ SND composition (k,M) = g) ==> h = k`
THENL[GEN_TAC THEN DISCH_THEN(LABEL_TAC "kWorks");
soby ["hWorks"] [EXISTS_UNIQUE_THM]] THEN
statelab `! x:mu. x NOTIN M ==> (k:mu->alpha#beta) x = @y. T` "kOffM"
(soby [] [IN_FunctionSpace]) THEN
toprove `! x:mu. x IN M ==> (k:mu->alpha#beta) x = f x,g x ` THENL[
GEN_TAC THEN DISCH_THEN(LABEL_TAC "xM");
soby ["hDef"; "kOffM"] [FUN_EQ_THM; NOTIN]] THEN
state `FST ((k:mu->alpha#beta) x) = f x /\ SND (k x) = g x` (soby
["kWorks"] [FunctionComposition]) THEN
state `(k:mu->alpha#beta) x = FST (k x), SND (k x) /\ FST (k x) = f x /\
SND (k x) = g x`
(soby ["kWorks"] [PAIR]) THEN
soby [] [PAIR_EQ]);;
#load "unix.cma";;
loadt "miz3/miz3.ml";;
horizon := 0;;
timeout := 50;;
let UniversalPropertyProduct = thm `;
! M:mu->bool A:alpha->bool B:beta->bool f:mu->alpha g:mu->beta .
f IN M ---> A /\ g IN M ---> B
==> (?! h. h IN M ---> A times B /\ FST composition (h,M) = f /\
SND composition (h,M) = g)
proof
let M be mu->bool;
let A be alpha->bool;
let B be beta->bool;
let f be mu->alpha;
let g be mu->beta;
assume f IN M ---> A /\ g IN M ---> B
[H1];
consider h such that
h = \x. if x IN M then f x,g x else @y. T;
! x. (x IN M ==> h x = f x,g x) /\ (x NOTIN M ==> h x = @y. T)
[hDef] by -, NOTIN;
! x. x IN M ==> h x IN A times B [hProd] by -, H1, IN_FunctionSpace,
IN_CartesianProduct;
! x. x IN M ==> FST (h x) = f x /\ SND (h x) = g x by hDef,
FST_DEF, SND_DEF, PAIR_EQ;
! x. (x IN M ==> (FST composition (h,M)) x = f x) /\ (x NOTIN M ==>
(FST composition (h,M)) x = f x) /\
(x IN M ==> (SND composition (h,M)) x = g x) /\ (x NOTIN M ==> (SND
composition (h,M)) x = g x) by FunctionComposition, NOTIN, -, H1,
IN_FunctionSpace;
h IN M ---> A times B /\ FST composition (h,M) = f /\ SND composition
(h,M) = g [hWorks] by hDef, hProd, IN_FunctionSpace, -, NOTIN, FUN_EQ_THM;
! k. (k IN M ---> A times B /\ FST composition (k,M) = f /\ SND
composition (k,M) = g) ==> h = k
proof
let k be mu->alpha#beta;
assume k IN M ---> A times B /\ FST composition (k,M) = f /\ SND
composition (k,M) = g [kWorks];
! x. x NOTIN M ==> k x = @y. T [kOffM] by -, IN_FunctionSpace;
! x. x IN M ==> k x = f x,g x
proof
let x be mu;
assume x IN M [xM];
FST (k x) = f x /\ SND (k x) = g x by -, kWorks, FunctionComposition;
k x = FST (k x), SND (k x) /\ FST (k x) = f x /\ SND (k x) = g x
by -, PAIR, kWorks;
qed by -, PAIR_EQ;
qed by hDef, -, kOffM, FUN_EQ_THM, NOTIN;
qed by hWorks, -, EXISTS_UNIQUE_THM;
`;;
------------------------------------------------------------------------------
Master HTML5, CSS3, ASP.NET, MVC, AJAX, Knockout.js, Web API and
much more. Get web development skills now with LearnDevNow -
350+ hours of step-by-step video tutorials by Microsoft MVPs and experts.
SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122812
_______________________________________________
hol-info mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hol-info