Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
a18337f
init system capybara
Linyxus Dec 9, 2024
4cf7f49
add syntax constructs
Linyxus Dec 9, 2024
2ec75ec
populate Syntax.lean
Linyxus Dec 9, 2024
4ce82f3
capture set renaming
Linyxus Dec 9, 2024
f0f2bcf
type renaming, add subst
Linyxus Dec 10, 2024
9755b29
finish subst of capture set
Linyxus Dec 10, 2024
c7eceb3
farewell, subst, let's do mnf
Linyxus Dec 16, 2024
a8996d8
finish renaming
Linyxus Dec 16, 2024
8e23e5a
rename aliasing constructs
Linyxus Dec 16, 2024
7e8c61a
add context
Linyxus Dec 16, 2024
cd9027c
add weaken map
Linyxus Dec 16, 2024
56d8be9
weakening
Linyxus Dec 16, 2024
fb23ecc
finish context lookup
Linyxus Dec 16, 2024
c6889ee
term weakening
Linyxus Dec 16, 2024
e7e862b
add type context to the index
Linyxus Dec 16, 2024
906d6ec
init type system
Linyxus Dec 16, 2024
4ffa54d
add subsetting
Linyxus Dec 16, 2024
bbf3e10
add instance for notation
Linyxus Dec 16, 2024
8d5b986
Finish subcapturing
Linyxus Dec 16, 2024
a38da84
add an order, `MorePermissive`
Linyxus Dec 16, 2024
566925e
Finish subtyping
Linyxus Dec 16, 2024
ce42515
add notations
Linyxus Dec 16, 2024
0ce7a71
add CaptureRoot
Linyxus Jan 7, 2025
d7bf821
finish capture root
Linyxus Jan 7, 2025
16eefc7
def: kinding of capture roots
Linyxus Jan 7, 2025
e19416d
def: capture set kinding
Linyxus Jan 7, 2025
778c581
def: CaptureRoot.HasElem
Linyxus Jan 7, 2025
4623472
def: chaining
Linyxus Jan 7, 2025
ca386ad
staging
Linyxus Jan 7, 2025
099607c
def: define Separation
Linyxus Jan 7, 2025
e06110d
infra: add notation for chainning
Linyxus Jan 7, 2025
23f7f0e
def: add capture root drop
Linyxus Jan 7, 2025
1cf6849
def: rename `MorePermissive` to `LessPermissive`
Linyxus Jan 7, 2025
df7099b
def: typing judgement wip
Linyxus Jan 7, 2025
0bb5953
def: typing (WIP)
Linyxus Jan 8, 2025
ae402c6
staging
Linyxus Jan 15, 2025
fa60488
lib: add finite set
Linyxus Jan 15, 2025
85982a3
lib: operations and properties for finite set
Linyxus Jan 15, 2025
9c30d57
def: migrate type to the latest version
Linyxus Jan 16, 2025
27f50e3
def: update `Term`
Linyxus Jan 16, 2025
e9770dd
def: `Context`
Linyxus Jan 16, 2025
4f77c6f
def: less-permissive
Linyxus Jan 16, 2025
468512d
def: fresh capture application
Linyxus Jan 16, 2025
c4de691
def: subcapturing
Linyxus Jan 17, 2025
243000a
def: subtyping
Linyxus Jan 19, 2025
8f583a1
def: `ReachRoot`
Linyxus Jan 20, 2025
aac5bc9
def: chaining
Linyxus Jan 20, 2025
62d0d7f
def: rearrange
Linyxus Jan 20, 2025
ad44636
def: separation checking
Linyxus Jan 20, 2025
0f9d3bd
def: kinding
Linyxus Jan 20, 2025
7fa6f22
def: make chaining up-to-date
Linyxus Jan 20, 2025
2ab6bdc
def: typing wip
Linyxus Jan 21, 2025
0516338
def: application rules
Linyxus Jan 21, 2025
3038d91
def: finish typing
Linyxus Jan 21, 2025
9ea81eb
lib: cleanup
Linyxus Jan 21, 2025
bd5d5dc
lib: cleanup
Linyxus Jan 22, 2025
4a9e370
proof(rebind): init
Linyxus Jan 22, 2025
f9aa128
proof(rebind): wip
Linyxus Jan 22, 2025
2c64c87
proof(rebind): wip
Linyxus Jan 23, 2025
f441828
proof(rebind): rebinding.ext
Linyxus Jan 23, 2025
0648efb
proof(rebind): rebinding.text
Linyxus Jan 23, 2025
8e781c1
proof(rebind): doc
Linyxus Jan 23, 2025
9998d2a
proof(rebind): cext
Linyxus Jan 23, 2025
4321588
proof(rebind): subcapturing wip
Linyxus Jan 23, 2025
8ef1a0f
staging
Linyxus Jan 23, 2025
6cd584e
proof: capture set properties
Linyxus Jan 23, 2025
7654685
I am so sorry
Linyxus Jan 24, 2025
3f3c277
proof(rebind): subcapturing
Linyxus Jan 24, 2025
1011a2e
proof(rebind): subtyping
Linyxus Jan 24, 2025
955e83d
proof(rebind): init typing
Linyxus Jan 24, 2025
4437ef1
proof(rebind): typing scaffold
Linyxus Jan 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Capless/Tactics.lean
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
macro "easy" : tactic => `(tactic| assumption)
macro "sosorry" : tactic => `(tactic| all_goals sorry)
macro "split_and" : tactic => `(tactic| repeat any_goals apply And.intro)
macro "apply!" e:term : tactic => `(tactic| apply $e <;> easy)
macro "apply?" e:term : tactic => `(tactic| apply $e <;> try easy)
1 change: 1 addition & 0 deletions Capybara.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
import «Capybara».Syntax
286 changes: 286 additions & 0 deletions Capybara/Morphism/Core.lean
Original file line number Diff line number Diff line change
@@ -0,0 +1,286 @@
import Mathlib.Data.Fin.Basic
namespace Capybara
/-!
# Morphisms

This module defines morphisms between contexts in the Capybara type system.

## Main definitions

- `FinFun n n'`: A function mapping finite indices from dimension `n` to dimension `n'`
- `Renaming n m k n' m' k'`: A renaming morphism that maps between contexts with dimensions:
- `n` term variables to `n'` term variables
- `m` type variables to `m'` type variables
- `k` capture set variables to `k'` capture set variables
- `CaptureRenaming n k n' k'`: A renaming morphism that maps between capture sets with only two dimensions: terms and captures.

## Implementation Notes

Renamings are used to implement variable substitution and weakening in a well-typed way.
The three dimensions (term, type, and capture set variables) are handled separately but
in parallel through the `Renaming` structure.

Each dimension can be extended independently through the `ext`, `text` and `cext` operations
which add a new variable while preserving the existing mapping.

note: Sonnet wrote this documentation.
-/

/-!
A renaming function maps indices from one dimension to another.
-/
def FinFun (n : Nat) (n' : Nat) : Type := Fin n -> Fin n'

/-!
Extend a renaming function by one on the term variable dimension.
-/
def FinFun.ext (f : FinFun n n') : FinFun (n+1) (n'+1) := by
intro x
cases x using Fin.cases
case zero => exact 0
case succ x0 => exact Fin.succ (f x0)

def FinFun.id {n : Nat} : FinFun n n := fun x => x

/-!
A weaken function that shifts all indices by one.
-/
def FinFun.weaken {n : Nat} : FinFun n (n+1) := by
intro x
exact Fin.succ x

/-!
Open a bound variable.
-/
def FinFun.open {n : Nat} (x : Fin n) : FinFun (n+1) n := by
intro y
cases y using Fin.cases
case zero => exact x
case succ y0 => exact y0

/-!
A renaming function, which maps the three dimensions of a context (term, type, and capture set variables).
-/
structure Renaming (n m k n' m' k' : Nat) where
var : FinFun n n'
tvar : FinFun m m'
cvar : FinFun k k'

/-!
Capture renaming function.
-/
structure CaptureRenaming (n k n' k' : Nat) where
var : FinFun n n'
cvar : FinFun k k'

def Renaming.asCapt (ρ : Renaming n m k n' m' k') : CaptureRenaming n k n' k' :=
{
var := ρ.var
cvar := ρ.cvar
}

/-!
Extend a renaming function by one on the term variable dimension.
-/
def Renaming.ext (ρ : Renaming n m k n' m' k') :
Renaming (n+1) m k (n'+1) m' k' :=
{
var := ρ.var.ext
tvar := ρ.tvar
cvar := ρ.cvar
}

/-!
Extend a renaming function by one on the type variable dimension.
-/
def Renaming.text (ρ : Renaming n m k n' m' k') :
Renaming n (m+1) k n' (m'+1) k' :=
{
var := ρ.var
tvar := ρ.tvar.ext
cvar := ρ.cvar
}

/-!
Extend a renaming function by one on the capture set variable dimension.
-/
def Renaming.cext (ρ : Renaming n m k n' m' k') :
Renaming n m (k+1) n' m' (k'+1) :=
{
var := ρ.var
tvar := ρ.tvar
cvar := ρ.cvar.ext
}

/-!
Weaken the renaming by one on the term variable dimension.
-/
def Renaming.weaken : Renaming n m k (n+1) m k :=
{
var := FinFun.weaken
tvar := FinFun.id
cvar := FinFun.id
}

/-!
Weaken the renaming by one on the type variable dimension.
-/
def Renaming.tweaken : Renaming n m k n (m+1) k :=
{
var := FinFun.id
tvar := FinFun.weaken
cvar := FinFun.id
}

/-!
Weaken the renaming by one on the capture variable dimension.
-/
def Renaming.cweaken : Renaming n m k n m (k+1) :=
{
var := FinFun.id
tvar := FinFun.id
cvar := FinFun.weaken
}

def Renaming.open (x : Fin n) : Renaming (n+1) m k n m k :=
{
var := FinFun.open x
tvar := FinFun.id
cvar := FinFun.id
}

def Renaming.topen (X : Fin m) : Renaming n (m+1) k n m k :=
{
var := FinFun.id
tvar := FinFun.open X
cvar := FinFun.id
}

def Renaming.copen (X : Fin k) : Renaming n m (k+1) n m k :=
{
var := FinFun.id
tvar := FinFun.id
cvar := FinFun.open X
}

def Renaming.id : Renaming n m k n m k :=
{
var := FinFun.id
tvar := FinFun.id
cvar := FinFun.id
}

def FinFun.comp (f : FinFun n n') (g : FinFun n' n'') : FinFun n n'' :=
fun x => g (f x)

def Renaming.comp (ρ : Renaming n m k n' m' k') (ρ' : Renaming n' m' k' n'' m'' k'') : Renaming n m k n'' m'' k'' :=
{
var := ρ.var.comp ρ'.var
tvar := ρ.tvar.comp ρ'.tvar
cvar := ρ.cvar.comp ρ'.cvar
}

def CaptureRenaming.comp (ρ : CaptureRenaming n k n' k') (ρ' : CaptureRenaming n' k' n'' k'') : CaptureRenaming n k n'' k'' :=
{
var := ρ.var.comp ρ'.var
cvar := ρ.cvar.comp ρ'.cvar
}

/-!
Basic properties of renamings.
-/
theorem Renaming.ext_var_zero {ρ : Renaming n m k n' m' k'} : ρ.ext.var 0 = 0 := by
simp [Renaming.ext]
rfl

theorem Renaming.ext_var_succ {ρ : Renaming n m k n' m' k'} {x : Fin n} : ρ.ext.var (Fin.succ x) = Fin.succ (ρ.var x) := by
simp [Renaming.ext]
rfl

theorem FinFun.id_comp_id {n : Nat} : FinFun.comp (n:=n) FinFun.id FinFun.id = FinFun.id := by rfl

theorem Renaming.id_comp_id {n m k : Nat} : Renaming.comp (n:=n) (m:=m) (k:=k) Renaming.id Renaming.id = Renaming.id := by rfl

theorem FinFun.id_ext {n : Nat} : FinFun.ext (n:=n) FinFun.id = FinFun.id := by
funext x0
cases x0 using Fin.cases
case zero => simp [FinFun.id, FinFun.ext]
case succ x0 => simp [FinFun.id, FinFun.ext]

theorem Renaming.id_ext {n m k : Nat} : Renaming.ext (n:=n) (m:=m) (k:=k) Renaming.id = Renaming.id := by simp [Renaming.ext, Renaming.id, FinFun.id_ext]

theorem Renaming.id_text {n m k : Nat} : Renaming.text (n:=n) (m:=m) (k:=k) Renaming.id = Renaming.id := by simp [Renaming.text, Renaming.id, FinFun.id_ext]

theorem Renaming.id_cext {n m k : Nat} : Renaming.cext (n:=n) (m:=m) (k:=k) Renaming.id = Renaming.id := by simp [Renaming.cext, Renaming.id, FinFun.id_ext]

theorem FinFun.comp_ext {f : FinFun n n'} {g : FinFun n' n''} : (f.comp g).ext = f.ext.comp g.ext := by
funext x
cases x using Fin.cases
case zero => rfl
case succ x0 => simp [FinFun.comp, FinFun.ext]

theorem Renaming.comp_ext {ρ : Renaming n m k n' m' k'} {ρ' : Renaming n' m' k' n'' m'' k''} :
(ρ.comp ρ').ext = ρ.ext.comp ρ'.ext := by
simp [Renaming.ext, Renaming.comp, FinFun.comp_ext]

theorem Renaming.comp_text {ρ : Renaming n m k n' m' k'} {ρ' : Renaming n' m' k' n'' m'' k''} :
(ρ.comp ρ').text = ρ.text.comp ρ'.text := by
simp [Renaming.text, Renaming.comp, FinFun.comp_ext]

theorem Renaming.comp_cext {ρ : Renaming n m k n' m' k'} {ρ' : Renaming n' m' k' n'' m'' k''} :
(ρ.comp ρ').cext = ρ.cext.comp ρ'.cext := by
simp [Renaming.cext, Renaming.comp, FinFun.comp_ext]

theorem FinFun.comp_weaken {f : FinFun n n'} :
f.comp FinFun.weaken = FinFun.weaken.comp (f.ext) := by
funext x
simp [FinFun.comp, FinFun.weaken, FinFun.ext]

theorem FinFun.comp_id {f : FinFun n n'} : f.comp FinFun.id = f := by
funext x
simp [FinFun.comp, FinFun.id]

theorem FinFun.id_comp {f : FinFun n n'} : FinFun.id.comp f = f := by
funext x
simp [FinFun.comp, FinFun.id]

theorem Renaming.comp_weaken {ρ : Renaming n m k n' m' k'} :
ρ.comp Renaming.weaken = Renaming.weaken.comp ρ.ext := by
simp [Renaming.weaken, Renaming.comp, Renaming.ext]
simp [FinFun.comp_weaken, FinFun.comp_id, FinFun.id_comp]

theorem Renaming.comp_tweaken {ρ : Renaming n m k n' m' k'} :
ρ.comp Renaming.tweaken = Renaming.tweaken.comp ρ.text := by
simp [Renaming.tweaken, Renaming.comp, Renaming.text]
simp [FinFun.comp_weaken, FinFun.comp_id, FinFun.id_comp]

theorem Renaming.comp_cweaken {ρ : Renaming n m k n' m' k'} :
ρ.comp Renaming.cweaken = Renaming.cweaken.comp ρ.cext := by
simp [Renaming.cweaken, Renaming.comp, Renaming.cext]
simp [FinFun.comp_weaken, FinFun.comp_id, FinFun.id_comp]

theorem Renaming.comp_asCapt {ρ : Renaming n m k n' m' k'} {ρ' : Renaming n' m' k' n'' m'' k''} :
(ρ.comp ρ').asCapt = ρ.asCapt.comp ρ'.asCapt := by
simp [Renaming.asCapt, CaptureRenaming.comp, Renaming.comp]

theorem Renaming.weaken_transportM {n m1 m2 k : Nat} :
(Renaming.weaken (n:=n) (m:=m1) (k:=k)).asCapt =
(Renaming.weaken (n:=n) (m:=m2) (k:=k)).asCapt := by
simp [Renaming.weaken, Renaming.asCapt]

theorem Renaming.cweaken_transportM {n m1 m2 k : Nat} :
(Renaming.cweaken (n:=n) (m:=m1) (k:=k)).asCapt =
(Renaming.cweaken (n:=n) (m:=m2) (k:=k)).asCapt := by
simp [Renaming.cweaken, Renaming.asCapt]

@[simp]
theorem Renaming.text_asCapt {ρ : Renaming n m k n' m' k'} :
ρ.text.asCapt = ρ.asCapt := by
simp [text, asCapt]

@[simp]
theorem Renaming.asCapt_var {ρ : Renaming n m k n' m' k'} :
ρ.asCapt.var = ρ.var := by
simp [asCapt]

end Capybara
Loading