summaryrefslogtreecommitdiff
path: root/src/Cfe/Language/Properties.agda
blob: 52b54707f01f1e41c8a955884435888957ff52e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
{-# OPTIONS --without-K --safe #-}

open import Relation.Binary

module Cfe.Language.Properties
  {c ℓ} (over : Setoid c ℓ)
  where

open Setoid over using () renaming (Carrier to C)
open import Cfe.Language.Base over
open import Data.List
open import Data.List.Relation.Binary.Equality.Setoid over
open import Function
open import Level hiding (Lift)

≈-refl : ∀ {a} → Reflexive (_≈_ {a})
≈-refl {x = A} = record
  { f = id
  ; f⁻¹ = id
  }

≈-sym : ∀ {a b} → Sym (_≈_ {a} {b}) _≈_
≈-sym A≈B = record
  { f = A≈B.f⁻¹
  ; f⁻¹ = A≈B.f
  }
  where
  module A≈B = _≈_ A≈B

≈-trans : ∀ {a b c} → Trans (_≈_ {a}) (_≈_ {b} {c}) _≈_
≈-trans {i = A} {B} {C} A≈B B≈C = record
  { f = B≈C.f ∘ A≈B.f
  ; f⁻¹ = A≈B.f⁻¹ ∘ B≈C.f⁻¹
  }
  where
  module A≈B = _≈_ A≈B
  module B≈C = _≈_ B≈C

≈-isEquivalence : ∀ {a} → IsEquivalence (_≈_ {a})
≈-isEquivalence = record
  { refl = ≈-refl
  ; sym = ≈-sym
  ; trans = ≈-trans
  }

setoid : ∀ a → Setoid (c ⊔ ℓ ⊔ suc a) (c ⊔ ℓ ⊔ a)
setoid a = record { isEquivalence = ≈-isEquivalence {a} }

≤-refl : ∀ {a} → Reflexive (_≤_ {a})
≤-refl = record
  { f = id
  }

≤-reflexive : ∀ {a b} → _≈_ {a} {b} ⇒ _≤_
≤-reflexive A≈B = record
  { f = A≈B.f
  }
  where
  module A≈B = _≈_ A≈B

≤-trans : ∀ {a b c} → Trans (_≤_ {a}) (_≤_ {b} {c}) _≤_
≤-trans A≤B B≤C = record
  { f = B≤C.f ∘ A≤B.f
  }
  where
  module A≤B = _≤_ A≤B
  module B≤C = _≤_ B≤C

≤-antisym : ∀ {a b} → Antisym (_≤_ {a} {b}) _≤_ _≈_
≤-antisym A≤B B≤A = record
  { f = A≤B.f
  ; f⁻¹ = B≤A.f
  }
  where
  module A≤B = _≤_ A≤B
  module B≤A = _≤_ B≤A

≤-min : ∀ {b} → Min (_≤_ {b = b}) ∅
≤-min A = record
  { f = λ ()
  }

≤-isPartialOrder : ∀ a → IsPartialOrder (_≈_ {a}) _≤_
≤-isPartialOrder a = record
  { isPreorder = record
    { isEquivalence = ≈-isEquivalence
    ; reflexive = ≤-reflexive
    ; trans = ≤-trans
    }
  ; antisym = ≤-antisym
  }

poset : ∀ a → Poset (c ⊔ ℓ ⊔ suc a) (c ⊔ ℓ ⊔ a) (c ⊔ a)
poset a = record { isPartialOrder = ≤-isPartialOrder a }

<-trans : ∀ {a b c} → Trans (_<_ {a}) (_<_ {b} {c}) _<_
<-trans A<B B<C = record
  { f = B<C.f ∘ A<B.f
  ; l = A<B.l
  ; l∉A = A<B.l∉A
  ; l∈B = B<C.f A<B.l∈B
  }
  where
  module A<B = _<_ A<B
  module B<C = _<_ B<C

<-irrefl : ∀ {a b} → Irreflexive (_≈_ {a} {b}) _<_
<-irrefl A≈B A<B = A<B.l∉A (A≈B.f⁻¹ A<B.l∈B)
  where
  module A≈B = _≈_ A≈B
  module A<B = _<_ A<B

<-asym : ∀ {a} → Asymmetric (_<_ {a})
<-asym A<B B<A = A<B.l∉A (B<A.f A<B.l∈B)
  where
  module A<B = _<_ A<B
  module B<A = _<_ B<A

lift-cong : ∀ {a} b (L : Language a) → Lift b L ≈ L
lift-cong b L = record
  { f = lower
  ; f⁻¹ = lift
  }