What’s in Main
Tobias Nipkow December 12, 2021
Abstract
This document lists the main types, functions and syntax provided by theory Main. It is meant as a quick overview of what is available.
For infix operators and their precedences see the final section. The sophisticated class structure is only hinted at. For details see https:
//isabelle.in.tum.de/library/HOL/HOL.
HOL
The basic logic: x = y, True, False, ¬ P, P ∧ Q, P ∨ Q, P −→ Q, ∀x. P,
∃x. P, ∃!x. P, THE x. P.
undefined :: 0a default :: 0a Syntax
x 6= y ≡ ¬ (x = y) (~=)
P ←→ Q ≡ P = Q
if x then y else z ≡ If x y z
let x = e1 in e2 ≡ Let e1 (λx. e2)
Orderings
A collection of classes defining basic orderings: preorder, partial order, linear order, dense linear order and wellorder.
(≤) :: 0a ⇒ 0a ⇒ bool (<=) (<) :: 0a ⇒ 0a ⇒ bool
Least :: (0a ⇒ bool) ⇒ 0a Greatest :: (0a ⇒ bool) ⇒ 0a min :: 0a ⇒ 0a ⇒ 0a max :: 0a ⇒ 0a ⇒ 0a
top :: 0a
bot :: 0a
mono :: (0a ⇒ 0b) ⇒ bool strict_mono :: (0a ⇒ 0b) ⇒ bool Syntax
x ≥ y ≡ y ≤ x (>=)
x > y ≡ y < x
∀x≤y. P ≡ ∀x. x ≤ y −→ P
∃x≤y. P ≡ ∃x. x ≤ y ∧ P Similarly for <, ≥ and >
LEAST x. P ≡ Least (λx. P) GREATEST x. P ≡ Greatest (λx. P)
Lattices
Classes semilattice, lattice, distributive lattice and complete lattice (the lat- ter in theory HOL.Set).
inf :: 0a ⇒ 0a ⇒ 0a sup :: 0a ⇒ 0a ⇒ 0a Inf :: 0a set ⇒ 0a Sup :: 0a set ⇒ 0a Syntax
Available via unbundle lattice_syntax.
x v y ≡ x ≤ y x @ y ≡ x < y x u y ≡ inf x y x t y ≡ sup x y
dA ≡ Inf A
FA ≡ Sup A
> ≡ top
⊥ ≡ bot
Set
{} :: 0a set
insert :: 0a ⇒ 0a set ⇒ 0a set Collect :: (0a ⇒ bool) ⇒ 0a set
(∈) :: 0a ⇒ 0a set ⇒ bool (:) (∪) :: 0a set ⇒ 0a set ⇒ 0a set (Un) (∩) :: 0a set ⇒ 0a set ⇒ 0a set (Int) S :: 0a set set ⇒ 0a set
T :: 0a set set ⇒ 0a set Pow :: 0a set ⇒ 0a set set UNIV :: 0a set
(‘) :: (0a ⇒ 0b) ⇒ 0a set ⇒ 0b set Ball :: 0a set ⇒ (0a ⇒ bool) ⇒ bool Bex :: 0a set ⇒ (0a ⇒ bool) ⇒ bool Syntax
{a1,. . .,an} ≡ insert a1 (. . . (insert an {}). . .)
a ∈/ A ≡ ¬(x ∈ A)
A ⊆ B ≡ A ≤ B
A ⊂ B ≡ A <B
A ⊇ B ≡ B ≤ A
A ⊃ B ≡ B < A
{x. P} ≡ Collect (λx. P)
{t | x1 . . . xn. P} ≡ {v. ∃x1 . . . xn. v = t ∧ P} Sx∈I. A ≡ S
((λx. A) ‘ I) (UN)
Sx. A ≡ S
((λx. A) ‘ UNIV) Tx∈I. A ≡ T
((λx. A) ‘ I) (INT)
Tx. A ≡ T
((λx. A) ‘ UNIV)
∀x∈A. P ≡ Ball A (λx. P)
∃x∈A. P ≡ Bex A (λx. P)
range f ≡ f ‘ UNIV
Fun
id :: 0a ⇒ 0a
(◦) ::(0a ⇒ 0b) ⇒ (0c ⇒ 0a) ⇒ 0c ⇒ 0b (o) inj_on ::(0a ⇒ 0b) ⇒ 0a set ⇒ bool
inj ::(0a ⇒ 0b) ⇒ bool surj ::(0a ⇒ 0b) ⇒ bool bij ::(0a ⇒ 0b) ⇒ bool
bij_betw ::(0a ⇒ 0b) ⇒ 0a set ⇒ 0b set ⇒ bool fun_upd ::(0a ⇒ 0b) ⇒ 0a ⇒ 0b ⇒ 0a ⇒ 0b Syntax
f(x := y) ≡ fun_upd f x y
f(x1:=y1,. . .,xn:=yn) ≡ f(x1:=y1). . .(xn:=yn)
Hilbert_Choice
Hilbert’s selection (ε) operator: SOME x. P.
inv_into :: 0a set ⇒ (0a ⇒ 0b) ⇒ 0b ⇒ 0a Syntax
inv ≡ inv_into UNIV
Fixed Points
Theory: HOL.Inductive.
Least and greatest fixed points in a complete lattice 0a:
lfp :: (0a ⇒ 0a) ⇒ 0a gfp :: (0a ⇒ 0a) ⇒ 0a
Note that in particular sets (0a ⇒ bool) are complete lattices.
Sum_Type
Type constructor +.
Inl :: 0a ⇒ 0a + 0b Inr :: 0a ⇒ 0b + 0a
(<+>) :: 0a set ⇒ 0b set ⇒ (0a + 0b) set
Product_Type
Types unit and ×.
() ::unit
Pair :: 0a ⇒ 0b ⇒ 0a × 0b fst :: 0a × 0b ⇒ 0a snd :: 0a × 0b ⇒ 0b
case_prod ::(0a ⇒ 0b ⇒ 0c) ⇒ 0a × 0b ⇒ 0c curry ::(0a × 0b ⇒ 0c) ⇒ 0a ⇒ 0b ⇒ 0c
Sigma :: 0a set ⇒ (0a ⇒ 0b set) ⇒ (0a × 0b) set Syntax
(a, b) ≡ Pair a b
λ(x, y). t ≡ case_prod (λx y. t) A × B ≡ Sigma A (λ_. B)
Pairs may be nested. Nesting to the right is printed as a tuple, e.g. (a, b, c) is really (a, (b, c)). Pattern matching with pairs and tuples extends to all binders, e.g. ∀(x, y)∈A. P, {(x, y). P}, etc.
Relation
converse :: (0a × 0b) set ⇒ (0b × 0a) set
(O) :: (0a × 0b) set ⇒ (0b × 0c) set ⇒ (0a × 0c) set (‘‘) :: (0a × 0b) set ⇒ 0a set ⇒ 0b set
inv_image :: (0a × 0a) set ⇒ (0b ⇒ 0a) ⇒ (0b × 0b) set Id_on :: 0a set ⇒ (0a × 0a) set
Id :: (0a × 0a) set
Domain :: (0a × 0b) set ⇒ 0a set Range :: (0a × 0b) set ⇒ 0b set Field :: (0a × 0a) set ⇒ 0a set
refl_on :: 0a set ⇒ (0a × 0a) set ⇒ bool refl :: (0a × 0a) set ⇒ bool
sym :: (0a × 0a) set ⇒ bool
antisym :: (0a × 0a) set ⇒ bool trans :: (0a × 0a) set ⇒ bool irrefl :: (0a × 0a) set ⇒ bool
total_on :: 0a set ⇒ (0a × 0a) set ⇒ bool total :: (0a × 0a) set ⇒ bool
Syntax
r−1 ≡ converse r (^-1)
Type synonym 0a rel = (0a × 0a) set
Equiv_Relations
equiv :: 0a set ⇒ (0a × 0a) set ⇒ bool (//) :: 0a set ⇒ (0a × 0a) set ⇒ 0a set set congruent :: (0a × 0a) set ⇒ (0a ⇒ 0b) ⇒ bool
congruent2 :: (0a × 0a) set ⇒ (0b × 0b) set ⇒ (0a ⇒ 0b ⇒ 0c) ⇒ bool Syntax
f respects r ≡ congruent r f f respects2 r ≡ congruent2 r r f
Transitive_Closure
rtrancl ::(0a × 0a) set ⇒ (0a × 0a) set trancl ::(0a × 0a) set ⇒ (0a × 0a) set reflcl ::(0a × 0a) set ⇒ (0a × 0a) set acyclic ::(0a × 0a) set ⇒ bool
(^^) ::(0a × 0a) set ⇒ nat ⇒ (0a × 0a) set Syntax
r∗ ≡ rtrancl r (^*) r+ ≡ trancl r (^+) r= ≡ reflcl r (^=)
Algebra
Theories HOL.Groups, HOL.Rings, HOL.Fields and HOL.Divides define a large collection of classes describing common algebraic structures from semi- groups up to fields. Everything is done in terms of overloaded operators:
0 :: 0a 1 :: 0a
(+) :: 0a ⇒ 0a ⇒ 0a (−) :: 0a ⇒ 0a ⇒ 0a
uminus :: 0a ⇒ 0a (-) (∗) :: 0a ⇒ 0a ⇒ 0a
inverse :: 0a ⇒ 0a (div) :: 0a ⇒ 0a ⇒ 0a abs :: 0a ⇒ 0a sgn :: 0a ⇒ 0a
(dvd) :: 0a ⇒ 0a ⇒ bool (div) :: 0a ⇒ 0a ⇒ 0a (mod) :: 0a ⇒ 0a ⇒ 0a Syntax
|x| ≡ abs x
Nat
datatype nat = 0 | Suc nat
(+) (−) (∗) (^) (div) (mod) (dvd) (≤) (<) min max Min Max
of_nat :: nat ⇒ 0a
(^^) :: (0a ⇒ 0a) ⇒ nat ⇒ 0a ⇒ 0a
Int
Type int
(+) (−) uminus (∗) (^) (div) (mod) (dvd) (≤) (<) min max Min Max
abs sgn
nat ::int ⇒ nat of_int ::int ⇒ 0a
:: 0a set (Ints) Syntax
int ≡ of_nat
Finite_Set
finite :: 0a set ⇒ bool card :: 0a set ⇒ nat
Finite_Set.fold :: (0a ⇒ 0b ⇒ 0b) ⇒ 0b ⇒ 0a set ⇒ 0b
Lattices_Big
Min :: 0a set ⇒ 0a Max :: 0a set ⇒ 0a
arg_min :: (0a ⇒ 0b) ⇒ (0a ⇒ bool) ⇒ 0a
is_arg_min :: (0a ⇒ 0b) ⇒ (0a ⇒ bool) ⇒ 0a ⇒ bool arg_max :: (0a ⇒ 0b) ⇒ (0a ⇒ bool) ⇒ 0a
is_arg_max :: (0a ⇒ 0b) ⇒ (0a ⇒ bool) ⇒ 0a ⇒ bool Syntax
ARG_MIN f x. P ≡ arg_min f (λx. P) ARG_MAX f x. P ≡ arg_max f (λx. P)
Groups_Big
sum :: (0a ⇒ 0b) ⇒ 0a set ⇒ 0b prod :: (0a ⇒ 0b) ⇒ 0a set ⇒ 0b Syntax
P A ≡ sum (λx. x) A (SUM)
Px∈A. t ≡ sum (λx. t) A Px|P. t ≡ P
x | P. t Similarly for Q
instead of P
(PROD)
Wellfounded
wf ::(0a × 0a) set ⇒ bool Wellfounded.acc ::(0a × 0a) set ⇒ 0a set measure ::(0a ⇒ nat) ⇒ (0a × 0a) set
(<∗lex∗>) ::(0a × 0a) set ⇒ (0b × 0b) set ⇒ ((0a × 0b) × 0a × 0b) set (<∗mlex∗>) ::(0a ⇒ nat) ⇒ (0a × 0a) set ⇒ (0a × 0a) set
less_than ::(nat × nat) set pred_nat ::(nat × nat) set
Set_Interval
lessThan :: 0a ⇒ 0a set atMost :: 0a ⇒ 0a set greaterThan :: 0a ⇒ 0a set atLeast :: 0a ⇒ 0a set greaterThanLessThan :: 0a ⇒ 0a ⇒ 0a set atLeastLessThan :: 0a ⇒ 0a ⇒ 0a set greaterThanAtMost :: 0a ⇒ 0a ⇒ 0a set atLeastAtMost :: 0a ⇒ 0a ⇒ 0a set Syntax
{..<y} ≡ lessThan y {..y} ≡ atMost y
{x<..} ≡ greaterThan x
{x..} ≡ atLeast x
{x<..<y} ≡ greaterThanLessThan x y
{x..<y} ≡ atLeastLessThan x y
{x<..y} ≡ greaterThanAtMost x y
{x..y} ≡ atLeastAtMost x y Si≤n. A ≡ S
i ∈ {..n}. A
Si<n. A ≡ S
i ∈ {..<n}. A Similarly for T
instead of S
Px = a..b. t ≡ sum (λx. t) {a..b}
Px = a..<b. t ≡ sum (λx. t) {a..<b}
Px≤b. t ≡ sum (λx. t) {..b}
Px<b. t ≡ sum (λx. t) {..<b}
Similarly for Q
instead of P
Power
(^) :: 0a ⇒ nat ⇒ 0a
Option
datatype 0a option = None | Some 0a the :: 0a option ⇒ 0a
map_option :: (0a ⇒ 0b) ⇒ 0a option ⇒ 0b option set_option :: 0a option ⇒ 0a set
Option.bind :: 0a option ⇒ (0a ⇒ 0b option) ⇒ 0b option
List
datatype 0a list = [] | (#) 0a (0a list) (@) :: 0a list ⇒ 0a list ⇒ 0a list butlast :: 0a list ⇒ 0a list
concat :: 0a list list ⇒ 0a list distinct :: 0a list ⇒ bool
drop ::nat ⇒ 0a list ⇒ 0a list
dropWhile ::(0a ⇒ bool) ⇒ 0a list ⇒ 0a list filter ::(0a ⇒ bool) ⇒ 0a list ⇒ 0a list find ::(0a ⇒ bool) ⇒ 0a list ⇒ 0a option fold ::(0a ⇒ 0b ⇒ 0b) ⇒ 0a list ⇒ 0b ⇒ 0b foldr ::(0a ⇒ 0b ⇒ 0b) ⇒ 0a list ⇒ 0b ⇒ 0b foldl ::(0a ⇒ 0b ⇒ 0a) ⇒ 0a ⇒ 0b list ⇒ 0a hd :: 0a list ⇒ 0a
last :: 0a list ⇒ 0a length :: 0a list ⇒ nat
lenlex ::(0a × 0a) set ⇒ (0a list × 0a list) set lex ::(0a × 0a) set ⇒ (0a list × 0a list) set
lexn ::(0a × 0a) set ⇒ nat ⇒ (0a list × 0a list) set lexord ::(0a × 0a) set ⇒ (0a list × 0a list) set
listrel ::(0a × 0b) set ⇒ (0a list × 0b list) set listrel1 ::(0a × 0a) set ⇒ (0a list × 0a list) set lists :: 0a set ⇒ 0a list set
listset :: 0a set list ⇒ 0a list set sum_list :: 0a list ⇒ 0a
prod_list :: 0a list ⇒ 0a
list_all2 :: (0a ⇒ 0b ⇒ bool) ⇒ 0a list ⇒ 0b list ⇒ bool list_update :: 0a list ⇒ nat ⇒ 0a ⇒ 0a list
map :: (0a ⇒ 0b) ⇒ 0a list ⇒ 0b list measures :: (0a ⇒ nat) list ⇒ (0a × 0a) set (!) :: 0a list ⇒ nat ⇒ 0a
nths :: 0a list ⇒ nat set ⇒ 0a list remdups :: 0a list ⇒ 0a list
removeAll :: 0a ⇒ 0a list ⇒ 0a list remove1 :: 0a ⇒ 0a list ⇒ 0a list replicate :: nat ⇒ 0a ⇒ 0a list rev :: 0a list ⇒ 0a list
rotate :: nat ⇒ 0a list ⇒ 0a list rotate1 :: 0a list ⇒ 0a list
set :: 0a list ⇒ 0a set
shuffles :: 0a list ⇒ 0a list ⇒ 0a list set sort :: 0a list ⇒ 0a list
sorted :: 0a list ⇒ bool
sorted_wrt :: (0a ⇒ 0a ⇒ bool) ⇒ 0a list ⇒ bool splice :: 0a list ⇒ 0a list ⇒ 0a list
take :: nat ⇒ 0a list ⇒ 0a list
takeWhile :: (0a ⇒ bool) ⇒ 0a list ⇒ 0a list tl :: 0a list ⇒ 0a list
upt :: nat ⇒ nat ⇒ nat list upto :: int ⇒ int ⇒ int list
zip :: 0a list ⇒ 0b list ⇒ (0a × 0b) list Syntax
[x1,. . .,xn] ≡ x1 #. . . # xn # []
[m..<n] ≡ upt m n [i..j] ≡ upto i j
xs[n := x] ≡ list_update xs n x
Px←xs. e ≡ listsum (map (λx. e) xs)
Filter input syntax [pat ← e. b], where pat is a tuple pattern, which stands for filter (λpat. b) e.
List comprehension input syntax: [e. q1, . . ., qn] where each qualifier qi is either a generator pat ← e or a guard, i.e. boolean expression.
Map
Maps model partial functions and are often used as finite tables. However, the domain of a map may be infinite.
Map.empty :: 0a ⇒ 0b option
(++) :: (0a ⇒ 0b option) ⇒ (0a ⇒ 0b option) ⇒ 0a ⇒ 0b option (◦m) :: (0a ⇒ 0b option) ⇒ (0c ⇒ 0a option) ⇒ 0c ⇒ 0b option (|‘) :: (0a ⇒ 0b option) ⇒ 0a set ⇒ 0a ⇒ 0b option
dom :: (0a ⇒ 0b option) ⇒ 0a set ran :: (0a ⇒ 0b option) ⇒ 0b set
(⊆m) :: (0a ⇒ 0b option) ⇒ (0a ⇒ 0b option) ⇒ bool map_of :: (0a × 0b) list ⇒ 0a ⇒ 0b option
map_upds :: (0a ⇒ 0b option) ⇒ 0a list ⇒ 0b list ⇒ 0a ⇒ 0b option Syntax
Map.empty ≡ λ_. None
m(x 7→ y) ≡ m(x:=Some y)
m(x17→y1,. . .,xn7→yn) ≡ m(x17→y1). . .(xn7→yn)
[x17→y1,. . .,xn7→yn] ≡ Map.empty(x17→y1,. . .,xn7→yn) m(xs [7→] ys) ≡ map_upds m xs ys
Infix operators in Main
Operator precedence associativity
Meta-logic =⇒ 1 right
≡ 2
Logic ∧ 35 right
∨ 30 right
−→, ←→ 25 right
=,6= 50 left
Orderings ≤, <, ≥, > 50
Sets ⊆, ⊂,⊇, ⊃ 50
∈, ∈/ 50
∩ 70 left
∪ 65 left
Functions and Relations ◦ 55 left
‘ 90 right
O 75 right
‘‘ 90 right
^^ 80 right
Numbers +,− 65 left
∗, / 70 left
div, mod 70 left
^ 80 right
dvd 50
Lists #,@ 65 right
! 100 left