• 定义变量
def b: Bool := true
def n: Nat := 1
def prod: Nat × Nat := (1, 2) 
  • 检查变量类型
#check b  -- true : Bool
#check prod -- Nat × Nat
#check Bool -- Type
#check Type -- Type 1
#check Type 1 -- Type 2
#check Prod -- Prod.{u, v} (α : Type u) (β : Type v) : Type (max u v)
  • 检查值
#eval 1 + 2 -- 3
  • 定义多态常量(polymorphic constants)
universe u
def F1 (α : Type u) : Type u := Prod α α
def F2.{u} (α : Type u) : Type u := Prod α α
  • 函数
    • 定义匿名函数
    #check fun (x : Nat) => x + 5 -- Nat → Nat 
    #check λ (x : Nat) => x + 5   -- λ and fun mean the same thing
    #check fun x : Nat => x + 5   -- Nat inferred 
    #check λ x : Nat => x + 5     -- Nat inferred
    #check fun (α β γ : Type) (u : β → γ) (v : α → β) (x : α) => u (v x)
    • 调用匿名函数
    #eval (λ x : Nat => x + 5) 10   -- 15
    • 定义具名函数
    def double : (Nat -> Nat) := fun x => x + x
    def double (x : Nat) := x + x
  • 局部定义
def t (x: Nat) : Nat := let y := x + x; y + y
  • variable 和 section
section useful 
	variable (α β γ : Type)
	variable (g : β → γ) (f : α → β) (h : α → α)
	variable (x : α) 
	def compose := g (f x) 
	def doTwice := h (h x) 
	def doThrice := h (h (h x)) 
end useful
  • Namespace
namespace Foo 
	def a : Nat := 5 
	def f (x : Nat) : Nat := x + 7 
	def fa : Nat := f a 
	def ffa : Nat := f (f a) 
	#check a 
	#check f 
	#check fa
	#check ffa 
	#check Foo.fa 
end Foo 
-- #check a -- error 
-- #check f -- error 
#check Foo.a 
#check Foo.f 
#check Foo.fa 
#check Foo.ffa 
open Foo 
#check a 
#check f 
#check fa 
#check Foo.fa
  • 嵌套namespace
namespace Foo 
	def a : Nat := 5
	def f (x : Nat) : Nat := x + 7 
	def fa : Nat := f a 
	namespace Bar 
		def ffa : Nat := f (f a) 
		#check fa 
		#check ffa 
	end Bar 
	#check fa 
	#check Bar.ffa 
end Foo 
#check Foo.fa 
#check Foo.Bar.ffa 
open Foo 
#check fa 
#check Bar.ffa
  • namespace可多次打开
namespace Foo
  def a : Nat := 5
  def f (x : Nat) : Nat := x + 7
  def fa : Nat := f a
end Foo
 
#check Foo.a
#check Foo.f
 
namespace Foo
  def ffa : Nat := f (f a)
end Foo
  • 隐式参数
def ident.{u} {α : Type u} (a : α) := a
#check ident -- ident.{u} {α : Type u} (a : α) : α
#check ident 1 -- Nat
#check @ident  -- @ident : {α : Type u_1} -> α -> α
#eval @ident Nat 1 -- 1