If you want to see the stored rule induction principles, you might use:
ThmSetData.all_data "rule_induction";
Or
IndDefLib.thy_rule_inductions "list";
where you get to provide the theory name.
Michael
From: Thomas Tuerk <tho...@tuerk-brechen.de>
Date: Thursday, 19 January 2017 at 03:22
To: "Chun Tian (binghe)" <binghe.l...@gmail.com>
Cc: hol-info <hol-info@lists.sourceforge.net>
Subject: Re: [Hol-info] How to prove this theorem about relations?
Hi Chun,
TypeBase stores information about algebraic datatypes. So, you won't find
information for your inductive relations or recursive functions in there. Use
TypeBasePure.listItems (TypeBase.theTypeBase())
to get an idea what types are currently in the TypeBase. I found the reference
to "Induct_on" in the description in section 5.6.1 on page 187. I was not aware
of this feature. I looked up how it is implemented. In
"src/basicProof/BasicProvers.sml" line 259 you can see that the TypeBase is not
used. Instead, "src/IndDef/IndDefLib.sig" defines a map "rule_induction_map"
that contains these induction theorems.
If you want to get your hands on the strong induction theorem, I would use
DB.fetch, i.e.
DB.fetch "-" "R_strongind"
Cheers
Thomas
On 18.01.2017 14:34, Chun Tian (binghe) wrote:
Sorry, one more question here: how to fetch from TypeBase the induction
theorems generated by relation?
I recall in The HOL System DESCRIPTION, section 5.6.1 (Proofs with Inductive
Relations), it says that we can use (Induct_on `R`) or (Induct_on `R x y`) to
do inductions on relation R, and internally it actually calls (HO_MATCH_MP_TAC
R_strongind). And the information is taken from TypeBase (I can't find a exact
reference for this, but sometimes when I failed to call Induct_on, it said
there's no such types in TypeBase).
Still using my above example, if I try the type of my relation subF, I got
nothing, and errors:
> TypeBase.fetch ``:'a form -> 'a form -> bool``;
val it = NONE: tyinfo option
> TypeBase.induction_of ``:'a form -> 'a form -> bool``;
Exception-
HOL_ERR
{message = "unable to find \"min$fun\" in the TypeBase",
origin_function = "induction_of", origin_structure = "TypeBase"} raised
On 18 January 2017 at 13:55, Thomas Tuerk
<tho...@tuerk-brechen.de<mailto:tho...@tuerk-brechen.de>> wrote:
Hi,
glad I could be of help.
I forgot to mention TypeBase. This is where such theorems about a type are
collected. It is used by tools like the case or induct tactics. So, some other
nice way of getting such theorems is
TypeBase.fetch ``:'a form``
or specialized ones via
TypeBase.distinct_of ``:'a form``
TypeBase.one_one_of ``:'a form``
...
Best
Thomas
On 18.01.2017 13:22, Chun Tian (binghe) wrote:
Hi Thomas,
Oh my god ... I've learnt so much from each line of your reply. Thank you so
much!
Best regards,
Chun
On 18 January 2017 at 12:53, Thomas Tuerk
<tho...@tuerk-brechen.de<mailto:tho...@tuerk-brechen.de>> wrote:
Hi Chun,
you are on the right way with the cases theorem. Essentially you need to
rewrite once with it. Then you end up with
∀A a. (atom a = A) ∨ (∃B C. (atom a = dot B C) ∧ subF A B) ⇒ (A = atom a)
Now you need to use the fact that "atom _ = dot B C" does not hold. This
distinctiveness is proved by the datatype package, just not returned directly.
It is stored in the theory. You can fetch it via
fetch "-" "form_distinct"
The injectivity of constructors you asked for you get via
fetch "-" "form_11"
Just search for "form" and you get interesting stuff
DB.print_find "form"
So your proof might look like
-----------------------------------------
val form_distinct = DB.fetch "-" "form_distinct"
val myTHM = prove(``!A (a:'a). subF A (atom a) ==> (A = atom a)``,
ONCE_REWRITE_TAC [subF_cases] THEN
SIMP_TAC std_ss [form_distinct])
---------------------------------------
There are other ways of accessing the generated theorems, though. Most commonly
used, but sometimes doing also extra unwanted stuff is the stateful simpset. So
something like
SIMP_TAC (srw_ss ()) []
does work as well.
I personally prefer the DatatypeSimps to keep tight control over what rewrites
I use. This is a highly controversial personal taste though.
So, I either use the version above or
val form_ss = DatatypeSimps.type_rewrites_ss [``:'a form``]
val myTHM = prove(``!A (a:'a). subF A (atom a) ==> (A = atom a)``,
ONCE_REWRITE_TAC [subF_cases] THEN
SIMP_TAC (std_ss++form_ss) [])
I hope this helps
Thomas
On 18.01.2017 11:58, Chun Tian (binghe) wrote:
Hi,
Sorry for disturbing again, but I met new difficulties when proving theorems
about relations.
Suppose I have the following simple recursive datatype and a "sub formula"
relation about it:
val _ = Datatype `form = atom 'a | dot form form`;
val (subF_rules, subF_ind, subF_cases) = Hol_reln
`(!(A:'a form). subF A A) /\
(!(A:'a form) B C. subF A B ==> subF A (dot B C)) `;
Now I need to prove this goal: `!A a. subF A (atom a) ==> (A = atom a)`.
I have successfully proved some theorems about relations defined by Hol_reln,
but this one brings some difficulties that I never met before.
The main problem is, "atom" never appears in the definition of Hol_reln, thus I
don't have any theorem talking about it.
But I recall the fact that, an inductive relation defines the *least* relation
satisfying the rules, thus anything undefined is by default false. I believe
this fact has been correctly captured by (and only by) subF_cases generated
from above Hol_reln definition:
val subF_cases =
|- ∀a0 a1. subF a0 a1 ⇔ (a1 = a0) ∨ ∃B C. (a1 = dot B C) ∧ subF a0 B:
thm
If I do cases analysis on `A`, I got a seeming good start point:
> e (Cases_on `A:'a form`);
OK..
2 subgoals:
val it =
∀a. subF (dot f f0) (atom a) ⇒ (dot f f0 = atom a)
∀a'. subF (atom a) (atom a') ⇒ (atom a = atom a')
2 subgoals
: proof
But I still don't know how to prove any of these sub-goals. I have no useful
theorems for rewrite or anything else. The relation rules only tells me that,
forall A, (subFor A A) is true, but it didn't say anything about the other
direction: (subF A B) => A = B (if A and B are both shapes like (atom ...)
Also, I even don't know how to prove this fundamental truth about datatypes:
``(atom A) = (atom B) ==> A = B``, again, I have no theorems to use ... because
the Datatype definition didn't return anything that I can (directly) use inside
a store_thm().
On the other side, Coq proves the same theorem quite simply:
Lemma subAt :
forall (Atoms : Set) (A : Form Atoms) (at_ : Atoms),
subFormula A (At at_) -> A = At at_.
intros Atoms A at_ H.
inversion H.
reflexivity.
Qed.
Need help ...
Regards,
Chun Tian (binghe)
University of Bologna (Italy)
------------------------------------------------------------------------------
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<mailto:hol-info@lists.sourceforge.net>
https://lists.sourceforge.net/lists/listinfo/hol-info
--
---
Chun Tian (binghe)
University of Bologna (Italy)
--
---
Chun Tian (binghe)
University of Bologna (Italy)
------------------------------------------------------------------------------
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