Forgot: in the examples below, both tactics are used with the theorem |-
!x. x <> 0 ==> x / x = 1


2013/7/11 Vincent Aravantinos <vincent.aravanti...@gmail.com>

> Hi Peter,
>
> here is the difference:
>
> (* The new hypotheses are added as conjuncts rather than as a         *)
> (* separate subgoal to reduce the user's burden of subgoal splits     *)
> (* when creating tactics to prove theorems.  If a separate subgoal    *)
> (* is desired, simply use CONJ_TAC after the dependent rewriting to   *)
> (* split the goal into two, where the first contains the hypotheses   *)
> (* and the second contains the rewritten version of the original      *)
> (* goal.                                                              *)
>
> In my tactic, the new hypotheses are added deeply, as close as possible to
> the atom where the rewrite happens.
>
> Consider the following examples:
>
> - Consider the goal:
>
> !x. x > 0 ==> x / x = y
>
> Then my tactic will replace it by:
>
> !x. x > 0 ==> x <> 0 /\ 1 = y
>
> Whereas, from my tries, dep_rewrite could not apply because x is
> quantified.
>
> - Without the quantification, you can consider the goal:
>
> x > 0 ==> x / x = y
>
> where dep_rewrite would yield
>
> x <> 0 /\ (x > 0 ==> x / x = y)
>
> which is not provable, whereas my tactic yields:
>
> x > 0 ==> x <> 0 /\ x / x = y
>
>
>
> This looks like a small difference but it changes a lot of things in
> practice because calls to dep_rewrite need to be interleaved by calls to
> GEN_TAC or DISCH_TAC (in these examples), whereas with my tactic one call
> to IMP_REWRITE_TAC (with several theorems) is enough.
>
> This change is not just a simple change but required the development of a
> new notion of conversion, hence it seemed better to me to start it from
> scratch rather than patching dep_rewrite.
>
> V.
>
>
>
> 2013/7/11 Peter Vincent Homeier <palan...@trustworthytools.com>
>
>> Vincent, how does this tactic compare to the dependent rewriting package
>> in src/1/dep_rewrite.{sig,sml}? It appears at first glance to address the
>> same problem you are working on. Here is part of the .sig header comment:
>>
>> (* ================================================================== *)
>> (* ================================================================== *)
>> (*                     DEPENDENT REWRITING TACTICS                    *)
>> (* ================================================================== *)
>> (* ================================================================== *)
>> (*                                                                    *)
>> (* This file contains new tactics for dependent rewriting,            *)
>> (* a generalization of the rewriting tactics of standard HOL.         *)
>> (*                                                                    *)
>> (* The main tactics are named DEP_REWRITE_TAC[thm1,...], etc., with   *)
>> (* the standard variations (PURE,ONCE,ASM).  In addition, tactics     *)
>> (* with LIST instead of ONCE are provided, making 12 tactics in all.  *)
>> (*                                                                    *)
>> (* The argument theorems thm1,... are typically implications.         *)
>> (* These tactics identify the consequents of the argument theorems,   *)
>> (* and attempt to match these against the current goal.  If a match   *)
>> (* is found, the goal is rewritten according to the matched instance  *)
>> (* of the consequent, after which the corresponding hypotheses of     *)
>> (* the argument theorems are added to the goal as new conjuncts on    *)
>> (* the left.                                                          *)
>> (*                                                                    *)
>> (* Care needs to be taken that the implications will match the goal   *)
>> (* properly, that is, instances where the hypotheses in fact can be   *)
>> (* proven.  Also, even more commonly than with REWRITE_TAC,           *)
>> (* the rewriting process may diverge.                                 *)
>> (*                                                                    *)
>> (* Each implication theorem for rewriting may have a number of layers *)
>> (* of universal quantification and implications.  At the bottom of    *)
>> (* these layers is the base, which will either be an equality, a      *)
>> (* negation, or a general term.  The pattern for matching will be     *)
>> (* the left-hand-side of an equality, the term negated of a negation, *)
>> (* or the term itself in the third case.  The search is top-to-bottom,*)
>> (* left-to-right, depending on the quantifications of variables.      *)
>> (*                                                                    *)
>> (* To assist in focusing the matching to useful cases, the goal is    *)
>> (* searched for a subterm matching the pattern.  The matching of the  *)
>> (* pattern to subterms is performed by higher-order matching, so for  *)
>> (* example, ``!x. P x`` will match the term ``!n. (n+m) < 4*n``.      *)
>> (*                                                                    *)
>> (* The argument theorems may each be either an implication or not.    *)
>> (* For those which are implications, the hypotheses of the instance   *)
>> (* of each theorem which matched the goal are added to the goal as    *)
>> (* conjuncts on the left side.  For those argument theorems which     *)
>> (* are not implications, the goal is simply rewritten with them.      *)
>> (* This rewriting is also higher order.                               *)
>> (*                                                                    *)
>> (* Deep inner universal quantifications of consequents are supported. *)
>> (* Thus, an argument theorem like EQ_LIST:                            *)
>> (* |- !h1 h2. (h1 = h2) ==> (!l1 l2. (l1 = l2) ==>                    *)
>> (*                  (CONS h1 l1 = CONS h2 l2))                        *)
>> (* before it is used, is internally converted to appear as            *)
>> (* |- !h1 h2 l1 l2. (h1 = h2) /\ (l1 = l2) ==>                        *)
>> (*                  (CONS h1 l1 = CONS h2 l2)                         *)
>> (*                                                                    *)
>> (* As much as possible, the newly added hypotheses are analyzed to    *)
>> (* remove duplicates; thus, several theorems with the same            *)
>> (* hypothesis, or several uses of the same theorem, will generate     *)
>> (* a minimal additional proof burden.                                 *)
>> (*                                                                    *)
>> (* The new hypotheses are added as conjuncts rather than as a         *)
>> (* separate subgoal to reduce the user's burden of subgoal splits     *)
>> (* when creating tactics to prove theorems.  If a separate subgoal    *)
>> (* is desired, simply use CONJ_TAC after the dependent rewriting to   *)
>> (* split the goal into two, where the first contains the hypotheses   *)
>> (* and the second contains the rewritten version of the original      *)
>> (* goal.                                                              *)
>> (*                                                                    *)
>> (* The tactics including PURE in their name will only use the         *)
>> (* listed theorems for all rewriting; otherwise, the standard         *)
>> (* rewrites are used for normal rewriting, but they are not           *)
>> (* considered for dependent rewriting.                                *)
>> (*                                                                    *)
>> (* The tactics including ONCE in their name attempt to use each       *)
>> (* theorem in the list, only once, in order, left to right.           *)
>> (* The hypotheses added in the process of dependent rewriting are     *)
>> (* not rewritten by the ONCE tactics.  This gives a more restrained   *)
>> (* version of dependent rewriting.                                    *)
>> (*                                                                    *)
>> (* The tactics with LIST take a list of lists of theorems, and        *)
>> (* uses each list of theorems once in order, left-to-right.  For      *)
>> (* each list of theorems, the goal is rewritten as much as possible,  *)
>> (* until no further changes can be achieved in the goal.  Hypotheses  *)
>> (* are collected from all rewriting and added to the goal, but they   *)
>> (* are not themselves rewritten.                                      *)
>> (*                                                                    *)
>> (* The tactics without ONCE or LIST attempt to reuse all theorems     *)
>> (* repeatedly, continuing to rewrite until no changes can be          *)
>> (* achieved in the goal.  Hypotheses are rewritten as well, and       *)
>> (* their hypotheses as well, ad infinitum.                            *)
>> (*                                                                    *)
>> (* The tactics with ASM in their name add the assumption list to      *)
>> (* the list of theorems used for dependent rewriting.                 *)
>> (*                                                                    *)
>> (* There are also three more general tactics provided,                *)
>> (* DEP_FIND_THEN, DEP_ONCE_FIND_THEN, and DEP_LIST_FIND_THEN,         *)
>> (* from which the others are constructed.                             *)
>> (*                                                                    *)
>> (* The differences among these is that DEP_ONCE_FIND_THEN uses        *)
>> (* each of its theorems only once, in order left-to-right as given,   *)
>> (* whereas DEP_FIND_THEN continues to reuse its theorems repeatedly   *)
>> (* as long as forward progress and change is possible.  In contrast   *)
>> (* to the others, DEP_LIST_FIND_THEN takes as its argument a list     *)
>> (* of lists of theorems, and processes these in order, left-to-right. *)
>> (* For each list of theorems, the goal is rewritten as many times     *)
>> (* as they apply.  The hypotheses for all these rewritings are        *)
>> (* collected into one set, added to the goal after all rewritings.    *)
>> (*                                                                    *)
>> (* DEP_ONCE_FIND_THEN and DEP_LIST_FIND_THEN will not attack the      *)
>> (* hypotheses generated as a byproduct of the dependent rewriting;    *)
>> (* in contrast, DEP_FIND_THEN will.  DEP_ONCE_FIND_THEN and           *)
>> (* DEP_LIST_FIND_THEN might be fruitfully applied again to their      *)
>> (* results; DEP_FIND_THEN will complete any possible rewriting,       *)
>> (* and need not be reapplied.                                         *)
>> (*                                                                    *)
>> (* These take as argument a thm_tactic, a function which takes a      *)
>> (* theorem and yields a tactic.  It is this which is used to apply    *)
>> (* the instantiated consequent of each successfully matched           *)
>> (* implication to the current goal.  Usually this is something like   *)
>> (* (fn th => REWRITE_TAC[th]), but the user is free to supply any     *)
>> (* thm_tactic he wishes.                                              *)
>> (*                                                                    *)
>> (* One significant note: because of the strategy of adding new        *)
>> (* hypotheses as conjuncts to the current goal, it is not fruitful    *)
>> (* to add *any* new assumptions to the current goal, as one might     *)
>> (* think would happen from using, say, ASSUME_TAC.                    *)
>> (*                                                                    *)
>> (* Rather, any such new assumptions introduced by thm_tactic are      *)
>> (* specifically removed.  Instead, one might wish to try MP_TAC,      *)
>> (* which will have the effect of ASSUME_TAC and then undischarging    *)
>> (* that assumption to become an antecedent of the goal.  Other        *)
>> (* thm_tactics may be used, and they may even convert the single      *)
>> (* current subgoal into multiple subgoals.  If this happens, it is    *)
>> (* fine, but note that the control strategy of DEP_FIND_THEN will     *)
>> (* continue to attack only the first of the multiple subgoals.        *)
>> (*                                                                    *)
>> (* ================================================================== *)
>> (* ================================================================== *)
>>
>> The dependent rewriting package has been part of HOL for many years.
>> Perhaps if you desire some additional functionality, it could be folded
>> into this package?
>>
>> Cheers,
>> Peter
>>
>> On Thu, Jul 11, 2013 at 6:08 AM, Vincent Aravantinos <
>> vincent.aravanti...@gmail.com> wrote:
>>
>>> Hi list,
>>>
>>> I developed a new tactic that takes a theorem of the form P ==> l = r
>>> and replaces l by r in a goal adding whatever it needs to make it work
>>> properly (typically conjunction with P; but can also be an implication or
>>> even existentials).
>>>
>>> This is a follow-up of the discussion I started a few months ago (
>>> http://sourceforge.net/mailarchive/message.php?msg_id=30133516), the
>>> major difference being that it solves the problem raised by Michael Norrish
>>> (i.e., it could not work under the scope of a quantifier) in a systematic
>>> and (in my opinion) elegant way.
>>>
>>> This change entails that the tactic is much more modular and thus can be
>>> chained very smoothly. Many preprocessing options also allows it to be a
>>> (sometimes more powerful) replacement for REWRITE_TAC, SIMP_TAC and even
>>> MATCH_MP_TAC. Please look at the (draft) manual for more info.
>>>
>>> The code is available at: https://github.com/aravantv/impconv (HOL
>>> Light only for now)
>>> To install, type:
>>> # needs "target_rewrite.ml";;
>>> The pdf manual is available in the directory "manual".
>>>
>>> The development of this tactic required quite some work that might be
>>> useful in other context. This is undocumented for now but is described in a
>>> paper which is currently under review.
>>>
>>> Regards,
>>> --
>>> Vincent ARAVANTINOS - PostDoctoral Fellow - Concordia University,
>>> Hardware
>>> Verification Group
>>> http://users.encs.concordia.ca/~vincent/
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> See everything from the browser to the database with AppDynamics
>>> Get end-to-end visibility with application monitoring from AppDynamics
>>> Isolate bottlenecks and diagnose root cause in seconds.
>>> Start your free trial of AppDynamics Pro today!
>>>
>>> http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
>>> _______________________________________________
>>> hol-info mailing list
>>> hol-info@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/hol-info
>>>
>>>
>>
>>
>> --
>> "In Your majesty ride prosperously
>> because of truth, humility, and righteousness;
>> and Your right hand shall teach You awesome things." (Psalm 45:4)
>>
>
>
>
> --
> Vincent ARAVANTINOS - PostDoctoral Fellow - Concordia University, Hardware
> Verification Group
> http://users.encs.concordia.ca/~vincent/
>



-- 
Vincent ARAVANTINOS - PostDoctoral Fellow - Concordia University, Hardware
Verification Group
http://users.encs.concordia.ca/~vincent/
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk
_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to