associate_restriction : (string * string) -> unit
associate_restriction("B", "RES_B")
---- parse ---->
Bv::P. B RES_B P (\v. B)
<---- print ----
Anything can be written between the binder and "::" that could be written between the binder and "." in the old notation. See the examples below.
The following associations are predefined:
\v::P. B <----> RES_ABSTRACT P (\v. B) !v::P. B <----> RES_FORALL P (\v. B) ?v::P. B <----> RES_EXISTS P (\v. B) @v::P. B <----> RES_SELECT P (\v. B)
Where the constants RES_FORALL, RES_EXISTS and RES_SELECT are defined in the theory bool, such that :
|- RES_FORALL P B = !x:'a. P x ==> B x |- RES_EXISTS P B = ?x:'a. P x /\ B x |- RES_SELECT P B = @x:'a. P x /\ B x
|- (!p m x. x IN p ==> (RES_ABSTRACT p m x = m x)) /\
!p m1 m2.
(!x. x IN p ==> (m1 x = m2 x)) ==>
(RES_ABSTRACT p m1 = RES_ABSTRACT p m2)
- new_binder_definition("DURING", ``DURING(p:num#num->bool) = $!p``);
> val it = |- !p. $DURING p = $! p : thm
- ``DURING x::(m,n). p x``;
<<HOL warning: parse_term.parse_term: on line 2, characters 4-23:
parse_term: No restricted quantifier associated with DURING>>
[...]
- new_definition("RES_DURING",
``RES_DURING(m,n)p = !x. m<=x /\ x<=n ==> p x``);
> val it = |- !m n p. RES_DURING (m,n) p = !x. m <= x /\ x <= n ==> p x : thm
- associate_restriction("DURING","RES_DURING");
> val it = () : unit
- ``DURING x::(m,n). p x``;
> val it = ``DURING x::(m,n). p x`` : term
- dest_comb it;
> val it = (``RES_DURING (m,n)``, ``\x. p x``) : term * term