Apologies for joining this discussion rather late.

Jonathan, To answer one of your questions in the last posting, I think there
are neater ways than to disable the pretty printer for terms.  In HOL Light
there is a function called 'variables', which lists all the variables that
occur in a term (either bound variables or free variables).  Using this on
the conclusion of 'real_neg' gives 2 variables called 'x1' (with different
HOL types).  So the thing to do is apply 'dest_var' on each of the variables
returned by 'variables':

      map dest_var (variables (concl real_neg));;

which returns:

      [("x1", `:hreal#hreal`); ("u", `:hreal#hreal`); ("x1", `:real`)]

So you can use HOL Light's 'vsubst' to rename the free 'x1' if you wish (or
INST if dealing with a theorem).

An alternative but rather cumbersome approach is to use HOL Light's term
destructors to pull apart the expression piece-by-piece:

      let (tm1,tm2) = dest_eq (concl real_neg);;
      let (tm3,tm4) = dest_comb tm2;;
      etc, etc .....

or if you just want to get to a specific subterm buried deep within, use a
chain of destructors composed together:

    let (_,[v1;v2]) = (snd o strip_comb o snd o dest_conj o snd o
dest_exists o snd o dest_abs o snd o dest_comb o snd o dest_eq) (concl
real_neg);;

I should point out that there is another HOL system called HOL Zero that
deals with this problem of parsing/printing overloaded variables in term
quotations.  It uses an adapted form of Hindley-Milner type inference when
parsing, so any sufficiently-type-annotated term will get successfully
parsed.  Also, the pretty printer type-annotates its output so that there is
no ambiguity about the types of any variables or constants, so any output of
the pretty printer can be cut-and-pasted back for parser input.  Your
example term would parse without requiring any type annotation, because it
is clear from the type of 'dest_real' that the `x1` first argument to
'dest_real' is of type `:real` and the `x1` second argument is of type
`:hreal#hreal`.  If you did wish to see the types excplicitly, HOL Zero has
a display option to display the types of all printed variables.

Mark.


on 13/10/11 9:57 AM, Jonathan von Schroeder <[email protected]>
wrote:

> Hi Czeray,
> thanks for the clarification. Looking at src/HOL/Import/* I couldn't
really
> figure out how to invoke the automatic generation myself. Can you give me
> any hints?
>
> I'd also greatly appreciate if you could tell me how to pragmatically
> distinguish these two variables to be able to rename them (maybe you can
> point me to how it's done in the automatic translation). The only approach
I
> can currently think of is to do it by looking at the types and renaming
all
> variables that have the same name but incompatible types since on the rhs
> both variables are "below" the existential quantification:
>
> # #remove_printer print_qterm;;
>> # concl (real_neg);;
>> val it : term =
>>   Comb
>>    (Comb (Const ("=", `:real->real->bool`),
>>      Comb (Const ("real_neg", `:real->real`), Var ("x1", `:real`))),
>>    Comb (Const ("mk_real", `:(hreal#hreal->bool)->real`),
>>     Abs (Var ("u", `:hreal#hreal`),
>>      Comb (Const ("?", `:(hreal#hreal->bool)->bool`),
>>       Abs (Var ("x1", `:hreal#hreal`),
>>        Comb
>>         (Comb (Const ("/\\", `:bool->bool->bool`),
>>           Comb
>>            (Comb (Const ("treal_eq", `:hreal#hreal->hreal#hreal->bool`),
>>              Comb (Const ("treal_neg", `:hreal#hreal->hreal#hreal`),
>>               Var ("x1", `:hreal#hreal`))),
>>            Var ("u", `:hreal#hreal`))),
>>         Comb
>>          (Comb (Const ("dest_real", `:real->hreal#hreal->bool`),
>>            Var ("x1", `:real`)),
>>          Var ("x1", `:hreal#hreal`))))))))
>
> Jonathan
>
> On 12 October 2011 03:38, Cezary Kaliszyk <[email protected]>
wrote:
>
>> 2011/10/11 Jonathan von Schroeder <[email protected]>:
>> > Hi all,
>> > im currently having a problem figuring out the meaning of the following
>> > theorem (from realax.ml):
>> >>
>> >> # real_neg;;
>> >> val it : thm =
>> >>   |- --x1 = mk_real (\u. ?x1. treal_neg x1 treal_eq u /\ dest_real x1
>> x1)
>>
>> You can also look at the version automatically translated to Isabelle
>> by HOL/Import. In the isabelle source the file:
>>  src/HOL/Import/HOLLight/HOLLight.thy
>> You can find the following:
>>
>> definition real_neg :: "hollight.real => hollight.real"  where
>>  "real_neg == %x1. mk_real (%u. EX x1a. treal_eq (treal_neg x1a) u &
>> dest_real x1 x1a)"
>>
>> In the above, the name of the other variable has been automatically
> changed
>> from 'x1' to 'x1a' to avoid the name clash.
>>
>> Cezary
>>
>
>
>
> ----------------------------------------
>
>
----------------------------------------------------------------------------
> --
> All the data continuously generated in your IT infrastructure contains a
> definitive record of customers, application performance, security
> threats, fraudulent activity and more. Splunk takes this data and makes
> sense of it. Business sense. IT sense. Common sense.
> http://p.sf.net/sfu/splunk-d2d-oct
>
>
> ----------------------------------------
> _______________________________________________
> hol-info mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/hol-info
>
>
>

------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1
_______________________________________________
hol-info mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to