Hi Bill,

It can get quite confusing sometimes, especially when "," is involved.  I
think people (or those that are not already super-familiar with the syntax)
intuitively expect mandatory surrounding parentheses around pairs/tuples.

But anyway, this should help you.  In the following list for HOL Light,
higher items bind more tightly (i.e. have higher "precedence") than lower
items:
- function application
- type annotation
- all prefixes
- "," separators in set enumeration (i.e. { a, b, c })
- all infixes, including "," for pairs
- all binders, including "\" and "let", and "if"
- ";" separators in list enumeration (i.e. [ a; b; c ])

Note that this is just my own informal list, derived from observed
behaviour, and there might be errors in it.  Please someone say if they find
an error!

Mark.


on 6/12/12 5:14 AM, Bill Richter <[email protected]> wrote:

> I'm trying to learn HOL Light by reading the tutorial, and I keep running
> into things I don't understand.  Maybe it's a good idea to have a thread
for
> the experts to straighten out beginners like me.  Here's my latest
problem,
> about parenthesis and maybe precedence.  I have an improved proof of the
> universal property of the Cartesian product below (John's code, with my
> modified definition of composition), but I don't understand why it works.
I
> knew this worked:
>
> parse_as_infix("timesp",(20, "right"));;
>
> let CartesianProductp = new_definition
> `! X Y. X timesp Y = {pair:A#B | ? x y. pair = x,y /\ x IN X /\ y IN
> Y}`;;
>
> let IN_CartesianProduct = thm `;
> ! X Y x:A y:B.
> x,y IN X timesp Y  <=>  x IN X /\ y IN Y
> by CartesianProductp, SET_RULE, PAIR_EQ`;;
>
> But why do I need the variable pair? I wanted
>
> parse_as_infix("timeb",(20, "right"));;
>
> let CartesianProductb = new_definition
> `! X Y. X timeb Y = {x,y:A#B | x IN X /\ y IN Y}`;;
>
> let IN_CartesianProductb = thm `;
> ! X Y x:A y:B.
> x,y IN X timeb Y  <=>  x IN X /\ y IN Y
> by CartesianProductb, SET_RULE, PAIR_EQ`;;
>
> But this theorem earns a #8 syntax or type error hol.  So let's try
> parentheses, as John does in the tutorial (the bug problem, p 64 ff):
>
> parse_as_infix("timec",(20, "right"));;
> let CartesianProductc = new_definition
> `! X Y. X timec Y = {(x,y):A#B | x IN X /\ y IN Y}`;;
>
> let IN_CartesianProductc = thm `;
> ! X Y x:A y:B.
> x,y IN X timec Y  <=>  x IN X /\ y IN Y
> by CartesianProductc, SET_RULE, PAIR_EQ`;;
>
> Now this works!  In spite of the fact that the def is printed without
> parentheses:
> #   val CartesianProductc : thm = |- !X Y. X timec Y = {x,y | x IN X /\ y
IN
> Y}
> What's going on?  Is this related to the parentheses here, which are
> printed:
>
> FST;;
> val it : thm = |- !x y. FST (x,y) = x
>
> The comma infix "," has precedence 14.  Is that lower than the precedence
of
> function application?  There's a lot written in the tutorial about
> precedence, but I found nothing about the precedence of function
> application, forall, exists or lambda.  Here's my improved code, which is
> due to John except my definition of composition, first with the statements
> using math characters:
>
> (*
> parse_as_infix("∉",(11, "right"));;
> parse_as_infix("∏",(20, "right"));;
> parse_as_infix("∘",(20, "right"));;
> parse_as_infix("→",(13,"right"));;
>
> ∉     |- ∀a l. a ∉ l ⇔ ¬(a ∈ l)
>
> CartesianProduct
> |- ∀ X Y. X ∏ Y = {x,y | x ∈ X ∧ y ∈ Y}
>
> IN_CartesianProduct
> |- ∀ X Y x y. x,y ∈ X ∏ Y ⇔ x ∈ X ∧ y ∈ Y
>
> FunctionSpace
> |- ∀ s t.     s → t =
> {f | (∀ x. x ∈ s ⇒ f x ∈ t) ∧ ∀x. x ∉ s ⇒ f x = @y. T}
>
> IN_FunctionSpace
> |- ∀ s t f.     f ∈ s → t ⇔
> (∀ x. x ∈ s ⇒ f x ∈ t) ∧ ∀ x. x ∉ s ⇒ f x = @y. T
>
> FunctionComposition
> |- ∀ x f s g. (g ∘ (f,s)) x = (if x ∈ s then g (f x) else @y. T)
>
> UniversalPropertyProduct
> |- ∀ M A B f g.
> f ∈ M → A ∧ g ∈ M → B
> ⇒ (∃! h. h ∈ M → A ∏ B  ∧  FST ∘ (h,M) = f  ∧  SND ∘ (h,M) = g)
> *)
>
> horizon := 0;;
> timeout := 50;;
>
> parse_as_infix("NOTIN",(11, "right"));;
> parse_as_infix("times",(20, "right"));;
> parse_as_infix("composition",(20, "right"));;
> parse_as_infix("--->",(13,"right"));;
>
> let NOTIN = new_definition
> `! a:A l:A->bool. a NOTIN l <=> ~(a IN l)`;;
>
> let CartesianProduct = new_definition
> `! X Y. X times Y = {(x,y):A#B | x IN X /\ y IN Y}`;;
>
> let IN_CartesianProduct = thm `;
> ! X Y x:A y:B.
> x,y IN X times Y  <=>  x IN X /\ y IN Y
> by CartesianProduct, SET_RULE, PAIR_EQ`;;
>
> let FunctionSpace = new_definition
> `! s t. s ---> t = {f: A->B | (! x. x IN s ==> f x  IN t) /\
> ! x. x NOTIN s ==> f x  = @y. T}`;;
>
> let IN_FunctionSpace = thm `;
> ! s: A->bool t: B->bool f: A->B. f IN s ---> t
> <=>  (! x. x IN s ==> f x IN t)  /\  ! x. x NOTIN s ==> f x  = @y. T
> by FunctionSpace, SET_RULE`;;
>
> let FunctionComposition = new_definition
> `! f:A->B s:A->bool g:B->C x.
> (g composition (f,s)) x = if x IN s then g (f x) else @y:C. T`;;
>
> let UniversalPropertyProduct = thm `;
> let M be mu->bool;
> let A be alpha->bool;
> let B be beta->bool;
> let f be mu->alpha;
> let g be mu->beta;
> assume f IN M ---> A /\ g IN M ---> B
> [H1];
> thus ?! h. h IN M ---> A times B  /\  FST composition (h,M) = f  /\  SND
> composition (h,M) = g
>
> proof
> consider h such that
> h = \x. if x IN M then f x,g x else @y. T;
> ! x. (x IN M  ==>  h x = f x,g x) /\ (x NOTIN M  ==>  h x = @y. T)
> [hDef] by -, NOTIN;
> ! x. x IN M  ==>  h x IN A times B     [hProd] by -, H1,
> IN_FunctionSpace, IN_CartesianProduct;
> ! x. x IN M  ==>  FST (h x) = f x  /\  SND (h x) = g x     by hDef,
> FST_DEF, SND_DEF, PAIR_EQ;
> ! x. (x IN M  ==>  (FST composition (h,M)) x = f x) /\ (x NOTIN M  ==>
> (FST composition (h,M)) x = f x)  /\
> (x IN M  ==>  (SND composition (h,M)) x = g x) /\ (x NOTIN M  ==>  (SND
> composition (h,M)) x = g x)     by FunctionComposition, NOTIN, -, H1,
> IN_FunctionSpace;
> h IN M ---> A times B  /\  FST composition (h,M) = f  /\  SND
> composition (h,M) = g     [hWorks] by hDef, hProd, IN_FunctionSpace, -,
> NOTIN, FUN_EQ_THM;
> ! k. (k IN M ---> A times B  /\  FST composition (k,M) = f  /\  SND
> composition (k,M) = g)  ==> h = k
> proof
> let k be mu->alpha#beta;
> assume k IN M ---> A times B  /\  FST composition (k,M) = f  /\  SND
> composition (k,M) = g     [kWorks];
> ! x. x NOTIN M  ==>  k x = @y. T     [kOffM] by -, IN_FunctionSpace;
> ! x. x IN M ==> k x = f x,g x
> proof
> let x be mu;
> assume x IN M     [xM];
> FST (k x) = f x  /\  SND (k x) = g x by -, kWorks,
> FunctionComposition;
> k x = FST (k x), SND (k x)  /\ FST (k x) = f x  /\ SND (k x) = g x
> by -, PAIR, kWorks;
> qed     by -, PAIR_EQ;
> qed     by     hDef, -, kOffM, FUN_EQ_THM, NOTIN;
> qed     by hWorks, -, EXISTS_UNIQUE_THM;
> `;;
>
>
>
----------------------------------------------------------------------------
> --
> LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
> Remotely access PCs and mobile devices and provide instant support
> Improve your efficiency, and focus on delivering more value-add services
> Discover what IT Professionals Know. Rescue delivers
> http://p.sf.net/sfu/logmein_12329d2d
> _______________________________________________
> hol-info mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/hol-info
>
>
>

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
hol-info mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hol-info

Reply via email to