software_foundation/basics/main.lean

237 lines
3.9 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--- Data and Functions
inductive Day : Type :=
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
deriving Repr
def next_weekday (d : Day) : Day :=
match d with
| .Monday => .Tuesday
| .Tuesday => .Wednesday
| .Wednesday => .Thursday
| .Thursday => .Friday
| .Friday | .Saturday | .Sunday => .Monday
#eval next_weekday Day.Friday
#eval next_weekday (next_weekday .Saturday)
theorem test_next_weekday : next_weekday (next_weekday .Saturday) = .Tuesday := by
rfl
--- Booleans
#print bool
#eval not true
#print not
#print and
#print or
example : or true false = true := by rfl
example : or false false = false := by rfl
example : or false true = true := by rfl
example : or true true = true := by rfl
#eval true false
example : true false = true := by
simp
example : false false true = true := by
simp
def negb' (b : Bool) : Bool :=
if b then false
else true
#eval negb' true
example : negb' true = ¬ true := by
simp
rfl
--- Exercise 1
namespace Exercise1
def nandb (b₁ : Bool) (b₂ : Bool) : Bool :=
match (b₁, b₂) with
| (true, true) => false
| _ => true
example : (nandb true false) = true := by
rfl
example : (nandb false false) = true := by
rfl
example : (nandb false true) = true := by
rfl
example : (nandb true true) = false := by
rfl
def andb3
| true, true, true => true
| _, _, _ => false
example : andb3 true true true = true := by rfl
example : andb3 false true true = false := by rfl
example : andb3 true false true = false := by rfl
example : andb3 true true false = false := by rfl
end Exercise1
--- Types
#check true
#check Bool.not
#check true.not
#check not
--- New Types from Old
inductive Rgb : Type :=
| red
| green
| blue
inductive Color : Type :=
| black
| white
| primary (p : Rgb)
#check Color.primary
def monochrome (c : Color) : Bool :=
match c with
| .black => true
| .white => true
| .primary _p => false
def isred (c : Color) : Bool :=
match c with
| .primary .red => true
| _ => false
--- Modules
namespace Playground
def foo : Rgb := .blue
end Playground
def foo : Bool := true
#check Playground.foo
#check foo
--- Tuples
namespace TuplePlayground
inductive Bit : Type :=
| B₁
| B₀
inductive Nybble :=
| bits (b₀ b₁ b₂ b₃ : Bit)
#print Nybble
#check Nybble.bits .B₁ .B₀ .B₁ .B₀
def all_zero (nb : Nybble) : Bool :=
match nb with
| .bits .B₀ .B₀ .B₀ .B₀ => true
| .bits _ _ _ _ => false
#eval all_zero (.bits .B₁ .B₁ .B₁ .B₁)
#eval all_zero (.bits .B₀ .B₀ .B₀ .B₀)
end TuplePlayground
--- Numbers
namespace NatPlayground
#eval Nat.zero
#eval Nat.zero.succ
#eval Nat.zero.succ.succ
example : Nat.zero.succ.succ = 2 := by rfl
end NatPlayground
open Nat in
#check succ (succ (succ 0))
def minustwo (n : Nat) : Nat :=
match n with
| 0 => 0
| .succ .zero => 0
| .succ (.succ n') => n'
#eval minustwo 4
def even (n : Nat) : Bool :=
match n with
| .zero => true
| .succ .zero => false
| .succ (.succ n') => even n'
example : even 4 = true := by
rfl
example : even 51 = false := by
rfl
namespace NatPlayground2
def plus (n : Nat) (m : Nat) : Nat :=
match n with
| .zero => m
| .succ n' => .succ (plus n' m)
#eval plus 3 4
def mult (n m : Nat) : Nat :=
match n with
| .zero => .zero
| .succ n' => plus m (mult n' m)
end NatPlayground2
namespace Exercise1
def factorial (n : Nat) : Nat :=
match n with
| 0 => 1
| .succ n' => (n' + 1) * factorial n'
#eval factorial 3
example : factorial 3 = 6 := by
rfl
example : factorial 5 = .mul 10 12 := by
rfl
end Exercise1
#check LT.lt 1 2
#check LT Nat
#check (LT Nat)
#check Nat.lt 1 2
namespace Exercise1
def ltb (n m : Nat) : Bool :=
match n, m with
| 0, _ => true
| _, 0 => false
| .succ n', .succ m' => ltb n' m'
#eval ltb 1 2
#eval ltb 10242 1055090
example : (ltb 1 2) = true := by rfl
end Exercise1
--- Proof by Simplification