Am 2013-05-05 um 03:31 schrieb Ramana Kumar <ramana.ku...@cl.cam.ac.uk>:

> On Sun, May 5, 2013 at 5:45 AM, Vincent Aravantinos 
> <vincent.aravanti...@gmail.com> wrote:
>> Hi Bill
>> 
>> 2013/5/4 Bill Richter <rich...@math.northwestern.edu>
>>> Question: given the string of a theorem "IN_ELIM_THM", how can I access the 
>>> theorem IN_ELIM_THM?  Or given a string of a thm_list->tactic "MESON_TAC", 
>>> how can I access MESON_TAC?  
>> 
>> 
>> # let get = Obj.magic o Toploop.getvalue;;
>> val get : string -> 'a = <fun>
>> # ((get "IN_ELIM_THM"):thm)
>> val it : thm =
>>   |- (!P x. x IN GSPEC (\v. P (SETSPEC v)) <=> P (\p t. p /\ x = t)) /\
>>      (!p x. x IN {y | p y} <=> p x) /\
>>      (!P x. GSPEC (\v. P (SETSPEC v)) x <=> P (\p t. p /\ x = t)) /\
>>      (!p x. {y | p y} x <=> p x) /\
>>      (!p x. x IN (\y. p y) <=> p x)
>> # ((get "MESON_TAC"):thm list->tactic);;
>> val it : thm list -> tactic = <fun>
>> 
>> Note that you must explicitly provide the type of the value you want to 
>> retrieve.
>> It makes use of some quite undocumented features of Ocaml (Obj.magic and 
>> Toploop.getvalue).
>> Jon uses this somewhere (help.ml if I remember well).
> 
> In HOL4 you can get a named theorem with DB.fetch, which has type string -> 
> string -> thm. (The first string is the name of the theory, the second is the 
> name of the theorem.)
> 
> In HOL Light I guess there's no database of theorems indexed by names? That 
> would be one way to avoid having to use Obj.magic.

Indeed.

>> It is correct but it does not solve your problem. The variable x belongs to 
>> the language of HOL Light. You have all possible control, through ocaml, 
>> over HOL Light terms, because HOL Light terms are just ocaml values. But 
>> ocaml values are not ocaml values so it does not work in the same way. 
>> That's precisely the difference between the object language (HOL) and the 
>> meta language (ocaml): ocaml is the meta language of HOL Light so you can 
>> control HOL Light through ocaml, but ocaml is not its own meta language 
>> (that's why we have to go through tricky undocumented features to allow such 
>> a behavior).
> 
> I presume you mean "But OCaml terms are not OCaml values" there.
> Otherwise I'm confused by what you're saying.

Ha, yes, of course!

> (Side note: some languages are their own meta-languages, like Scheme, where a 
> quoted expression is a value. Also there is a language like that for theorem 
> proving called reFLect.)
>  
>> 
>> 
>> 
>> -- 
>> Vincent ARAVANTINOS - PostDoctoral Fellow - Concordia University, Hardware 
>> Verification Group
>> http://users.encs.concordia.ca/~vincent/
>> 
>> 
>> 2013/5/4 Bill Richter <rich...@math.northwestern.edu>
>>> Question: given the string of a theorem "IN_ELIM_THM", how can I access the 
>>> theorem IN_ELIM_THM?  Or given a string of a thm_list->tactic "MESON_TAC", 
>>> how can I access MESON_TAC?  This is a problem that Freek must have solved 
>>> in miz3.ml, but I can't figure out how.  John did not seem to solve it in 
>>> mizar.ml, as his readable proof of the Knaster-Tarski fixpoint theorem is 
>>> prefaced by
>>> 
>>> e(LABEL_TAC "IN_ELIM_THM" IN_ELIM_THM);;
>>> 
>>> It seems to me that we should be able to do this with
>>> assoc "IN_ELIM_THM" env;;
>>> where env is some association list of pairs given by labels and theorems.  
>>> Or maybe just an association list of the module Hol.thm.  Something like 
>>> this is explained in an example in the Ocaml manual:
>>> http://caml.inria.fr/pub/docs/manual-ocaml/manual003.html#toc10
>>> 
>>>    We first define a function to evaluate an expression given an
>>>    environment that maps variable names to their values. For
>>>    simplicity, the environment is represented as an association list.
>>> 
>>> Another reason to think this can be done is that we can do it with term 
>>> variables.  As Konrad was explaining, if you have a string "x" and the type 
>>> `:alpha` of a variable x, you can recover x with
>>> mk_var("x",`:alpha`).
>>> Isn't that correct?  I don't see why something like this shouldn't work 
>>> more generally than for term variables.
>>> 
>>> My string/parser/readability project was going great until I ran into this 
>>> problem.  Below is the progress I made so far, which is mainly interesting 
>>> as it shows I can use the str library, and that the parser can be easily 
>>> used to get the math characters of HOL4 and Isabelle.  Plus I finally threw 
>>> and caught exceptions!
>>> 
>>> --
>>> Best,
>>> Bill
>>> 
>>> #load "str.cma";;.
>>> 
>>> let parse_qproof s = (String.sub s 1 (String.length s - 1));;
>>> 
>>> let (make_env: goal -> (string * pretype) list) =
>>>   fun (asl,w) -> map ((fun (s,ty) -> s,pretype_of_type ty) o dest_var)
>>>                    (freesl (w::(map (concl o snd) asl)));;
>>> 
>>> let parse_env_string env s = (term_of_preterm o retypecheck env)
>>>   ((fst o parse_preterm o lex o explode) s);;
>>> 
>>> let (exists_TAC: string -> tactic) =
>>>   fun stm (asl,w) -> let env = make_env (asl,w) in
>>>     EXISTS_TAC (parse_env_string env stm) (asl,w);;
>>> 
>>> let ConvertToHOL s =
>>>   try
>>>     let len = Str.search_forward (Str.regexp "INTRO_TAC") s 0 in
>>>       INTRO_TAC (String.sub s (len + 9) ((String.length s) - len - 9))
>>>   with Not_found ->
>>>   try
>>>     let len = Str.search_forward (Str.regexp "exists_TAC") s 0 in
>>>       exists_TAC (String.sub s (len + 10) ((String.length s) - len - 10))
>>>   with Not_found ->  ALL_TAC;;
>>> 
>>> let rec OrganizeTHEN s =
>>>   try
>>>     let len = Str.search_forward (Str.regexp "THEN") s 0 in
>>>       (ConvertToHOL (String.sub s 0 len)) THEN
>>>       (OrganizeTHEN (String.sub s (len + 4) ((String.length s) - len - 4)))
>>>   with Not_found -> ALL_TAC;;
>>> 
>>> let StringToTac s =
>>>   let s = Str.global_replace (Str.regexp "⇒") "==>" s in
>>>   let s = Str.global_replace (Str.regexp "⇔") "<=>" s in
>>>   let s = Str.global_replace (Str.regexp "∧ ") "/\\ " s in
>>>   let s = Str.global_replace (Str.regexp "∨") "\\/" s in
>>>   let s = Str.global_replace (Str.regexp "¬") "~" s in
>>>   let s = Str.global_replace (Str.regexp "∀") "!" s in
>>>   let s = Str.global_replace (Str.regexp "∃") "?" s in
>>>   let s = Str.global_replace (Str.regexp "λ") "\\" s in
>>>   OrganizeTHEN s;;
>>> 
>>> g `!P. (!x. ?y. P x y) ==> ?f. !x. P x (f x)`;;
>>> e(StringToTac `;INTRO_TAC !P; H1 THEN
>>>  exists_TAC \x. @y. P x y THEN
>>>  HYP MESON_TAC "H1" []`);;
>>> 
>>> ------------------------------------------------------------------------------
>>> Get 100% visibility into Java/.NET code with AppDynamics Lite
>>> It's a free troubleshooting tool designed for production
>>> Get down to code-level detail for bottlenecks, with <2% overhead.
>>> Download for free and get started troubleshooting in minutes.
>>> http://p.sf.net/sfu/appdyn_d2d_ap2
>>> _______________________________________________
>>> hol-info mailing list
>>> hol-info@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/hol-info
>> 
>> 
>> 
>> -- 
>> Vincent ARAVANTINOS - PostDoctoral Fellow - Concordia University, Hardware 
>> Verification Group
>> http://users.encs.concordia.ca/~vincent/
>> 
>> ------------------------------------------------------------------------------
>> Get 100% visibility into Java/.NET code with AppDynamics Lite
>> It's a free troubleshooting tool designed for production
>> Get down to code-level detail for bottlenecks, with <2% overhead.
>> Download for free and get started troubleshooting in minutes.
>> http://p.sf.net/sfu/appdyn_d2d_ap2
>> _______________________________________________
>> hol-info mailing list
>> hol-info@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/hol-info
> 
------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite
It's a free troubleshooting tool designed for production
Get down to code-level detail for bottlenecks, with <2% overhead.
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap2
_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to