Skip to content

Commit 94a6809

Browse files
authored
Merge pull request #7 from tomaz1502/preservation
Preservation
2 parents 45f8945 + 1f66c57 commit 94a6809

File tree

4 files changed

+639
-3
lines changed

4 files changed

+639
-3
lines changed

src/Lam/Agda/Lam/FormalizationEvaluator.agda

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,6 @@ stepNothingNormal {Case L _ M _ N} eq with smallStep L in eqL
344344
caseStepNothingR : {L M N x T id2 id3} smallStepCase L id2 M id3 N Nothing ≡ Nothing ¬ (L ≡ Inr x T)
345345
caseStepNothingR () refl
346346

347-
348347
caseStepNothing₂ : {L M N x id2 id3} smallStepCase L id2 M id3 N Nothing ≡ Just x (∃[ e1 ] ∃[ T1 ] (L ≡ Inl e1 T1)) ⊎ (∃[ e2 ] ∃[ T2 ] (L ≡ Inr e2 T2))
349348
caseStepNothing₂ {Inl L x₁} {M} {N} {x} eq = inj₁ ⟨ L , ⟨ x₁ , refl ⟩ ⟩
350349
caseStepNothing₂ {Inr L x₁} {M} {N} {x} eq = inj₂ ⟨ L , ⟨ x₁ , refl ⟩ ⟩

src/Lam/Agda/Lam/FormalizationTypeChecker.agda

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ open import Relation.Binary.PropositionalEquality using
99
(_≡_; refl; sym; trans; cong; subst)
1010
open Relation.Binary.PropositionalEquality.≡-Reasoning
1111

12-
open import Data.Char using (Char)
1312
open import Haskell.Prelude using
1413
(Bool; Int; Maybe; Just; Nothing; _>>=_; case_of_; if_then_else_; maybe; _==_)
1514

src/Lam/Agda/Lam/Nat.agda

Lines changed: 172 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
module Lam.Nat where
22

3-
open import Haskell.Prelude using (Eq; _==_; True; False; Bool; []; _∷_; List; Maybe; Nothing; Just)
3+
open import Haskell.Prelude hiding (Nat; iEqNat; length; _<_; lookup; _+_; drop)
4+
open import Relation.Nullary using (¬_)
5+
open import Data.Empty using (⊥-elim; ⊥)
6+
open import Data.Sum using (_⊎_; inj₁; inj₂)
47

58
data Nat : Set where
69
Z : Nat
@@ -12,13 +15,29 @@ instance
1215
iEqNat ._==_ (S x) (S y) = x == y
1316
iEqNat ._==_ _ _ = False
1417

18+
eq->≡ : {i j : Nat} ((i == j) ≡ True) i ≡ j
19+
eq->≡ {Z} {Z} h = refl
20+
eq->≡ {S i} {S j} h = cong S (eq->≡ {i} {j} h)
21+
22+
eq->not≡ : (i j : Nat) ((i == j) ≡ False) ¬ (i ≡ j)
23+
eq->not≡ (S i) .(S i) h refl = eq->not≡ i i h refl
24+
1525
{-# COMPILE AGDA2HS Nat deriving (Eq, Show) #-}
1626

1727
ltNat : Nat Nat Bool
1828
ltNat Z (S _) = True
1929
ltNat (S x) (S y) = ltNat x y
2030
ltNat _ _ = False
2131

32+
ltSuc : (x y : Nat) ltNat x y ≡ False ltNat (S x) y ≡ False
33+
ltSuc Z Z h = refl
34+
ltSuc (S x) Z h = refl
35+
ltSuc (S x) (S y) h = ltSuc x y h
36+
37+
ltZ : {i} ltNat i Z ≡ False
38+
ltZ {Z} = refl
39+
ltZ {S i} = refl
40+
2241
{-# COMPILE AGDA2HS ltNat #-}
2342

2443
inc : Nat Nat
@@ -32,17 +51,96 @@ dec (S x) = x
3251

3352
{-# COMPILE AGDA2HS dec #-}
3453

54+
add : Nat Nat Nat
55+
add Z j = j
56+
add (S i) j = inc (add i j)
57+
58+
addZero : (i : Nat) add i Z ≡ i
59+
addZero Z = refl
60+
addZero (S i) = cong S (addZero i)
61+
62+
addSuc : (i j : Nat) add i (S j) ≡ S (add i j)
63+
addSuc Z j = refl
64+
addSuc (S i) j = cong S (addSuc i j)
65+
3566
length : {A : Set} List A -> Nat
3667
length [] = Z
3768
length (_ ∷ xs) = S (length xs)
3869

70+
eqSuc : {i j : Nat} S i ≡ S j i ≡ j
71+
eqSuc {i} {.i} refl = refl
72+
3973
data _≤_ : Nat Nat Set where
4074
z≤ : {i} Z ≤ i
4175
s≤s : {i j} i ≤ j (S i) ≤ (S j)
4276

77+
sucLE : {i j : Nat} S i ≤ S j i ≤ j
78+
sucLE (s≤s h) = h
79+
80+
decideLE : (i j : Nat) (i ≤ j) ⊎ (¬ (i ≤ j))
81+
decideLE Z Z = inj₁ z≤
82+
decideLE Z (S j) = inj₁ z≤
83+
decideLE (S i) Z = inj₂ (λ ())
84+
decideLE (S i) (S j) with decideLE i j
85+
... | inj₁ h = inj₁ (s≤s h)
86+
... | inj₂ h = inj₂ (λ abs -> h (sucLE abs))
87+
4388
_<_ : Nat -> Nat -> Set
4489
i < j = S i ≤ j
4590

91+
<-rewrite : {i j k : Nat} i < j j ≡ k i < k
92+
<-rewrite h refl = h
93+
94+
not<Self : (i : Nat) ¬ (i < i)
95+
not<Self (S i) (s≤s h) = not<Self i h
96+
97+
<s : {i j : Nat} i < S j i ≤ j
98+
<s (s≤s h) = h
99+
100+
s< : {i j : Nat} i < j S i < S j
101+
s< {Z} {j} h = s≤s h
102+
s< {S i} {S j} h = s≤s h
103+
104+
s≤Self : (i : Nat) i ≤ S i
105+
s≤Self Z = z≤
106+
s≤Self (S i) = s≤s (s≤Self i)
107+
108+
109+
s<Self : (i : Nat) i < S i
110+
s<Self Z = s≤s z≤
111+
s<Self (S i) = s≤s (s<Self i)
112+
113+
≤-trans : {i j k : Nat} i ≤ j j ≤ k i ≤ k
114+
≤-trans z≤ z≤ = z≤
115+
≤-trans z≤ (s≤s h2) = z≤
116+
≤-trans (s≤s h1) (s≤s h2) = s≤s (≤-trans h1 h2)
117+
118+
addInc : (i j : Nat) j ≤ add i j
119+
addInc Z Z = z≤
120+
addInc Z (S j) = s≤s (addInc Z j)
121+
addInc (S i) Z = z≤
122+
addInc (S i) (S j) = s≤s (≤-trans (s≤Self j) (addInc i (S j)))
123+
124+
<-trans : {i j k : Nat} i < j j < k i < k
125+
<-trans {Z} {.(S _)} {.(S _)} (s≤s h1) (s≤s h2) = s≤s z≤
126+
<-trans {S i} {.(S _)} {.(S _)} (s≤s h1) (s≤s h2) = s≤s (<-trans h1 h2)
127+
128+
<≤-trans : {i j k : Nat} i < j j ≤ k i < k
129+
<≤-trans (s≤s h1) (s≤s h2) = s≤s (≤-trans h1 h2)
130+
131+
≤<-trans : {i j k : Nat} i ≤ j j < k i < k
132+
≤<-trans z≤ (s≤s h2) = s≤s z≤
133+
≤<-trans (s≤s h1) (s≤s h2) = s≤s (≤<-trans h1 h2)
134+
135+
lt->< : {i j : Nat} ltNat i j ≡ True i < j
136+
lt->< {Z} {S j} h = s≤s z≤
137+
lt->< {S i} {S j} h = s≤s (lt->< h)
138+
139+
lt->≤ : {i j : Nat} ltNat i j ≡ False j ≤ i
140+
lt->≤ {Z} {Z} h = z≤
141+
lt->≤ {S i} {Z} h = z≤
142+
lt->≤ {S i} {S j} h = s≤s (lt->≤ h)
143+
46144
lookupMaybe : {t : Set} Nat List t Maybe t
47145
lookupMaybe _ [] = Nothing
48146
lookupMaybe Z (h ∷ _) = Just h
@@ -53,3 +151,76 @@ lookupMaybe (S i) (_ ∷ t) = lookupMaybe i t
53151
lookup : {A : Set} -> (l : List A) -> (i : Nat) -> (h : i < length l) -> A
54152
lookup (x ∷ l) Z h = x
55153
lookup (x ∷ l) (S i) (s≤s h) = lookup l i h
154+
155+
piLookup : {A : Set} (Γ : List A) (i : Nat) (h1 : i < length Γ) (h2 : i < length Γ) lookup Γ i h1 ≡ lookup Γ i h2
156+
piLookup (x ∷ g) Z h1 h2 = refl
157+
piLookup (x ∷ g) (S i) (s≤s h1) (s≤s h2) = piLookup g i h1 h2
158+
159+
insert : {A : Set} Nat A List A List A
160+
insert Z t g = t ∷ g
161+
insert (S i) t [] = t ∷ []
162+
insert (S i) t (x ∷ g) = x ∷ insert i t g
163+
164+
≤-refl : {i : Nat} i ≤ i
165+
≤-refl {Z} = z≤
166+
≤-refl {S i} = s≤s (≤-refl {i})
167+
168+
insertIncLength : {A : Set} {L : List A} {x : A} {i : Nat} length L < length (insert i x L)
169+
insertIncLength {L = []} {i = Z} = s≤s z≤
170+
insertIncLength {L = []} {i = S i} = s≤s z≤
171+
insertIncLength {L = _ ∷ _} {i = Z} = s≤s ≤-refl
172+
insertIncLength {L = x ∷ L} {i = S i} = s≤s insertIncLength
173+
174+
remove : {A : Set} (i : Nat) (L : List A) List A
175+
remove _ [] = []
176+
remove Z (x ∷ L) = L
177+
remove (S i) (x ∷ L) = x ∷ remove i L
178+
179+
removeLargeId : {A : Set} (i : Nat) (L : List A) length L ≤ i remove i L ≡ L
180+
removeLargeId Z [] h = refl
181+
removeLargeId (S i) [] h = refl
182+
removeLargeId (S i) (x ∷ L) (s≤s h) = cong (λ y -> x ∷ y) (removeLargeId i L h)
183+
184+
sucLT : {i j : Nat} S i < S j i < j
185+
sucLT (s≤s h) = h
186+
187+
sucLT2 : {i j : Nat} S i < j i < j
188+
sucLT2 {Z} {.(S _)} (s≤s h) = s≤s z≤
189+
sucLT2 {S i} {.(S _)} (s≤s h) = s≤s (sucLT2 h)
190+
191+
sucLT3 : {i : Nat} i < S i
192+
sucLT3 {Z} = s≤s z≤
193+
sucLT3 {S i} = s≤s sucLT3
194+
195+
sucEQ : {i j : Nat} S i ≡ S j i ≡ j
196+
sucEQ refl = refl
197+
198+
sucNeq : {i j : Nat} ¬ (S i ≡ S j) ¬ (i ≡ j)
199+
sucNeq h1 refl = ⊥-elim (h1 refl)
200+
201+
notLE->LT : {i j : Nat} ¬ (i ≤ j) j < i
202+
notLE->LT {Z} {Z} h = ⊥-elim (h ≤-refl)
203+
notLE->LT {Z} {S j} h = ⊥-elim (h z≤)
204+
notLE->LT {S i} {Z} h = s≤s z≤
205+
notLE->LT {S i} {S j} h = s< (notLE->LT {i} {j} λ abs -> h (s≤s abs))
206+
207+
removeLength : {A : Set} (i : Nat) (L : List A) length L ≤ S (length (remove i L))
208+
removeLength Z [] = z≤
209+
removeLength Z (x ∷ L) = s≤s ≤-refl
210+
removeLength (S i) [] = z≤
211+
removeLength (S i) (x ∷ L) = s≤s (removeLength i L)
212+
213+
lengthRemove : {A : Set} {L : List A} {i j : Nat} i < length L i < j i < length (remove j L)
214+
lengthRemove {_} {L} {i} {j} h1 h2 with decideLE (length L) j
215+
... | (inj₁ jBig) rewrite removeLargeId j L jBig = h1
216+
... | (inj₂ jSmall) = <≤-trans h2 (<s (<≤-trans (notLE->LT jSmall) (removeLength j L)))
217+
218+
almostTrichotomy : (i j : Nat) i ≤ j (¬ (i ≡ j)) i < j
219+
almostTrichotomy Z Z z≤ h2 = ⊥-elim (h2 refl)
220+
almostTrichotomy Z (S j) z≤ h2 = s≤s z≤
221+
almostTrichotomy (S i) (S j) (s≤s h1) h2 = s≤s (almostTrichotomy i j h1 λ eq -> h2 (cong S eq))
222+
223+
drop : {A : Set} Nat List A List A
224+
drop Z l = l
225+
drop (S i) [] = []
226+
drop (S i) (x ∷ l) = drop i l

0 commit comments

Comments
 (0)