John Harrison pointed out that my Mizar-like function `consider' and `cases' I 
just posted won't work if a string contains /\ followed immediately by a 
newline.  We see the problem from 

#   "move (B,A,C) (B,A,X)  /\  move (B,A,X) (B',A,X) /\
move (B',A,X) (B',A,Y)  /\  move (B',A,Y) (B',A',Y)";;
 
    val it : string =
  "move (B,A,C) (B,A,X)  /\\  move (B,A,X) (B',A,X) /move (B',A,X) (B',A,Y)  
/\\  move (B',A,Y) (B',A',Y)"

Moving the /\ to the next line solves the problem, but that's not a nice 
solution, and I thought I'd use backquotes instead of doublequotes.  So I need 
a function TermToString that just literally translates a backquoted expression 
to the correct doublequoted expression (of course fixing backslashes and 
newlines), without introducing any extra type inference, so 

TermToString `M such that M = transp(vector[v:real^2;w:real^2]):real^2^2` 

should evaluate to 

"M such that M = transp(vector[v:real^2;w:real^2]):real^2^2"

This is a small part of what Freek Wiedijk must have done in moving from miz2 
to miz3.  I've looked pretty carefully in both the HOL Light dox and the HOL4 
dox and can't find anything.  I'm wondering if there's not something about 
Ocaml that I'm missing.  

Page 159 of the HOL4 Description manual says, "The parser turns strings into 
terms."  Doesn't that mean that backquoted expressions get turned into strings? 
 Now HOL4 seems a bit different from HOL Light, as

   [P. 173] Thus the function Parse.Term function takes a (term) quotation and 
returns a term,
   and is thus of type
   term quotation -> term

Now the HOL Light parse_term has type string -> term.  I do think that HOL4 and 
HOL Light both mean the same thing by quotation, an expression delimited by 
single backquotes (called back-ticks by HOL4).  The HOL Light tutorial says on 
p 10 that "backquotes are used for quotations."

As par as I've gotten is to learn a bit about term_of_preterm and 
preterm_of_term, which I believe are inverse functions.  I can make little 
sense of the large output from 

preterm_of_term `M = transp(vector[v:real^2;w:real^2]):real^2^2`;;

but this evaluates to true

let foo = `M = transp(vector[v:real^2;w:real^2]):real^2^2` in 
term_of_preterm (preterm_of_term foo) = foo;;

and that indicates to me that preterm_of_term is not introducing too many extra 
type annotations.   This however evaluates to false: 

term_of_preterm (preterm_of_term `M = 
transp(vector[v:real^2;w:real^2]):real^2^2`) = 
`M = transp(vector[v:real^2;w:real^2]):real^2^2`;;

and I'm suspecting the reason is that some type annotation is taking place.  In 
fact:

# preterm_of_term `M`;;
Warning: inventing type variables
val it : preterm = Varp ("M", Utv "?84705")

# preterm_of_term `M`;;
Warning: inventing type variables
val it : preterm = Varp ("M", Utv "?84706")

Looks to me that 2 separate arbitrary types were assigned to M.  So I guess I 
don't know if preterm_of_term can be used to build my TermToString.  Maybe 
TermToListOfCharacters would be just as good, as long as there was an inverse 
function.  

BTW the problem I'm trying to solve is pretty simple.  I want cases to have 
multiple arguments which are terms, say `t1`, `t2` and `t3`, but I only want to 
make as many  give type annotations as I would need for 
`t1 \/ t2 \/ t3`.   I don't want to repeate type annotations in t1, t2 and t3.  

-- 
Best,
Bill 

------------------------------------------------------------------------------
Own the Future-Intel(R) Level Up Game Demo Contest 2013
Rise to greatness in Intel's independent game demo contest. Compete 
for recognition, cash, and the chance to get your game on Steam. 
$5K grand prize plus 10 genre and skill prizes. Submit your demo 
by 6/6/13. http://altfarm.mediaplex.com/ad/ck/12124-176961-30367-2
_______________________________________________
hol-info mailing list
hol-info@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to