[NoBinding, gram_keyword s]
| `Number s -> [NoBinding, gram_number s]
and aux_layout = function
- | Ast.Sub (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\sub"] @ aux p2
- | Ast.Sup (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\sup"] @ aux p2
- | Ast.Below (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\below"] @ aux p2
- | Ast.Above (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\above"] @ aux p2
- | Ast.Frac (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\frac"] @ aux p2
- | Ast.InfRule (p1, p2, p3) -> [NoBinding, gram_symbol "\\infrule"] @ aux p1 @ aux p2 @ aux p3
- | Ast.Atop (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\atop"] @ aux p2
- | Ast.Over (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\over"] @ aux p2
+ | Ast.Sub (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\sub "] @ aux p2
+ | Ast.Sup (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\sup "] @ aux p2
+ | Ast.Below (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\below "] @ aux p2
+ | Ast.Above (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\above "] @ aux p2
+ | Ast.Frac (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\frac "] @ aux p2
+ | Ast.InfRule (p1, p2, p3) -> [NoBinding, gram_symbol "\\infrule "] @ aux p1 @ aux p2 @ aux p3
+ | Ast.Atop (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\atop "] @ aux p2
+ | Ast.Over (p1, p2) -> aux p1 @ [NoBinding, gram_symbol "\\over "] @ aux p2
| Ast.Root (p1, p2) ->
- [NoBinding, gram_symbol "\\root"] @ aux p2
- @ [NoBinding, gram_symbol "\\of"] @ aux p1
- | Ast.Sqrt p -> [NoBinding, gram_symbol "\\sqrt"] @ aux p
+ [NoBinding, gram_symbol "\\root "] @ aux p2
+ @ [NoBinding, gram_symbol "\\of "] @ aux p1
+ | Ast.Sqrt p -> [NoBinding, gram_symbol "\\sqrt "] @ aux p
| Ast.Break -> []
| Ast.Box (_, pl) -> List.flatten (List.map aux pl)
| Ast.Group pl -> List.flatten (List.map aux pl)
v = [ PERCENTAGE ] -> id, v]];
l1_simple_pattern:
[ "layout" LEFTA
- [ p1 = SELF; SYMBOL "\\sub"; p2 = SELF ->
+ [ p1 = SELF; SYMBOL "\\sub "; p2 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Sub (p1 l, p2 l)))
- | p1 = SELF; SYMBOL "\\sup"; p2 = SELF ->
+ | p1 = SELF; SYMBOL "\\sup "; p2 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Sup (p1 l, p2 l)))
- | p1 = SELF; SYMBOL "\\below"; p2 = SELF ->
+ | p1 = SELF; SYMBOL "\\below "; p2 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Below (p1 l, p2 l)))
- | p1 = SELF; SYMBOL "\\above"; p2 = SELF ->
+ | p1 = SELF; SYMBOL "\\above "; p2 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Above (p1 l, p2 l)))
- | p1 = SELF; SYMBOL "\\over"; p2 = SELF ->
+ | p1 = SELF; SYMBOL "\\over "; p2 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Over (p1 l, p2 l)))
- | p1 = SELF; SYMBOL "\\atop"; p2 = SELF ->
+ | p1 = SELF; SYMBOL "\\atop "; p2 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Atop (p1 l, p2 l)))
- | p1 = SELF; SYMBOL "\\frac"; p2 = SELF ->
+ | p1 = SELF; SYMBOL "\\frac "; p2 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Frac (p1 l, p2 l)))
- | SYMBOL "\\infrule"; p1 = SELF; p2 = SELF; p3 = SELF ->
+ | SYMBOL "\\infrule "; p1 = SELF; p2 = SELF; p3 = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.InfRule (p1 l, p2 l, p3 l)))
- | SYMBOL "\\sqrt"; p = SELF ->
+ | SYMBOL "\\sqrt "; p = SELF ->
return_term_of_level loc (fun l -> Ast.Layout (Ast.Sqrt p l))
- | SYMBOL "\\root"; index = SELF; SYMBOL "\\of"; arg = SELF ->
+ | SYMBOL "\\root "; index = SELF; SYMBOL "\\of "; arg = SELF ->
return_term_of_level loc
(fun l -> Ast.Layout (Ast.Root (arg l, index l)))
| "hbox"; LPAREN; p = l1_pattern; RPAREN ->
]
];
explicit_subst: [
- [ SYMBOL "\\subst"; (* to avoid catching frequent "a [1]" cases *)
+ [ SYMBOL "\\subst "; (* to avoid catching frequent "a [1]" cases *)
SYMBOL "[";
substs = LIST1 [
i = IDENT; SYMBOL <:unicode<Assign>> (* ≔ *); t = term -> (i, t)
@{ ${ fold right @{$Px} rec acc @{'sigma (λ${ident x}.$acc)} } }
}.
+(* equality, conguence ******************************************************)
+
+notation > "hvbox(a break = b)"
+ non associative with precedence 45
+for @{ 'eq ? $a $b }.
+
+notation < "hvbox(term 46 a break maction (=) (=\sub t) term 46 b)"
+ non associative with precedence 45
+for @{ 'eq $t $a $b }.
+
+notation > "hvbox(n break (≅ \sub p) m)"
+ non associative with precedence 45
+for @{ 'congruent $n $m $p }.
+
+notation < "hvbox(term 46 n break ≅ \sub p term 46 m)"
+ non associative with precedence 45
+for @{ 'congruent $n $m $p }.
+
(* other notations **********************************************************)
notation "hvbox(\langle term 19 a, break term 19 b\rangle)"
right associative with precedence 20
for @{ \Pi $_:$a.$b }.
-notation > "hvbox(a break = b)"
- non associative with precedence 45
-for @{ 'eq ? $a $b }.
-notation < "hvbox(term 46 a break maction (=) (=\sub t) term 46 b)"
- non associative with precedence 45
-for @{ 'eq $t $a $b }.
-
notation "hvbox(a break \leq b)"
non associative with precedence 45
for @{ 'leq $a $b }.
notation "hvbox(a break ↑ b)" with precedence 55 for @{ 'funion $a $b }.
-notation "a \sup term 89 b" with precedence 90 for @{ 'exp $a $b}.
+notation < "term 91 a \sup term 90 b" with precedence 90 for @{ 'exp $a $b}.
+notation > "a \sup term 89 b" with precedence 90 for @{ 'exp $a $b}.
notation > "a ^ term 89 b" with precedence 90 for @{ 'exp $a $b}.
notation "s \sup (-1)" with precedence 90 for @{ 'invert $s }.
notation > "s ^ (-1)" with precedence 90 for @{ 'invert $s }.