annotate automaton-in-agda/src/induction-ex.agda @ 405:af8f630b7e60

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 24 Sep 2023 18:02:04 +0900
parents cd73fe566291
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
405
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 328
diff changeset
1 {-# OPTIONS --cubical-compatible --guardedness --sized-types #-}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 328
diff changeset
2
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 module induction-ex where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 open import Relation.Binary.PropositionalEquality
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 open import Size
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 open import Data.Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 data List (A : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 [] : List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 _∷_ : A → List A → List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 data Nat : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 zero : Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 suc : Nat → Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 add : Nat → Nat → Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 add zero x = x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 add (suc x) y = suc ( add x y )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 _++_ : {A : Set} → List A → List A → List A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 [] ++ y = y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 (x ∷ t) ++ y = x ∷ ( t ++ y )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 test1 = (zero ∷ []) ++ (zero ∷ [])
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 length : {A : Set } → List A → Nat
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 length [] = zero
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 length (_ ∷ t) = suc ( length t )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 lemma1 : {A : Set} → (x y : List A ) → length ( x ++ y ) ≡ add (length x) (length y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 lemma1 [] y = refl
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 lemma1 (x ∷ t) y = cong ( λ k → suc k ) lemma2 where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 lemma2 : length (t ++ y) ≡ add (length t) (length y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 lemma2 = lemma1 t y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 -- record List1 ( A : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 -- inductive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 -- field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 -- nil : List1 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 -- cons : A → List1 A → List1 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 --
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 -- record List2 ( A : Set ) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 -- coinductive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 -- field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 -- nil : List2 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 -- cons : A → List2 A → List2 A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 data SList (i : Size) (A : Set) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 []' : SList i A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 _∷'_ : {j : Size< i} (x : A) (xs : SList j A) → SList i A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 map : ∀{i A B} → (A → B) → SList i A → SList i B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 map f []' = []'
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 map f ( x ∷' xs)= f x ∷' map f xs
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 foldr : ∀{i} {A B : Set} → (A → B → B) → B → SList i A → B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 foldr c n []' = n
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 foldr c n (x ∷' xs) = c x (foldr c n xs)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 any : ∀{i A} → (A → Bool) → SList i A → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 any p xs = foldr _∨_ false (map p xs)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 -- Sappend : {A : Set } {i j : Size } → SList i A → SList j A → SList {!!} A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 -- Sappend []' y = y
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 -- Sappend (x ∷' x₁) y = _∷'_ {?} x (Sappend x₁ y)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 language : { Σ : Set } → Set
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 language {Σ} = List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 record Lang (i : Size) (A : Set) : Set where
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 coinductive
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 ν : Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 δ : ∀{j : Size< i} → A → Lang j A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 open Lang
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 ∅ : ∀ {i A} → Lang i A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 ν ∅ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 δ ∅ _ = ∅
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
328
cd73fe566291 temporal logic
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
84 -- record syntax does not recognize sized data
cd73fe566291 temporal logic
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
85 -- ∅' : {i : Size } { A : Set } → Lang i A
cd73fe566291 temporal logic
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
86 -- ∅' {i} {A} = record { ν = false ; δ = lemma3 } where
cd73fe566291 temporal logic
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
87 -- lemma3 : {j : Size< i} → A → Lang j A
cd73fe566291 temporal logic
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 183
diff changeset
88 -- lemma3 {j} _ = ∅'
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 ∅l : {A : Set } → language {A}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 ∅l _ = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 ε : ∀ {i A} → Lang i A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 ν ε = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 δ ε _ = ∅
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 εl : {A : Set } → language {A}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 εl [] = true
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 εl (_ ∷ _) = false
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 _+_ : ∀ {i A} → Lang i A → Lang i A → Lang i A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 ν (a + b) = ν a ∨ ν b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 δ (a + b) x = δ a x + δ b x
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 Union : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 Union {Σ} A B x = (A x ) ∨ (B x)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 _·_ : ∀ {i A} → Lang i A → Lang i A → Lang i A
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
109 ν (a · b) = ν a ∧ ν b
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 δ (a · b) x = if (ν a) then ((δ a x · b ) + (δ b x )) else ( δ a x · b )
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
111
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
112 split : {Σ : Set} → (List Σ → Bool)
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
113 → ( List Σ → Bool) → List Σ → Bool
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 split x y [] = x [] ∨ y []
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115 split x y (h ∷ t) = (x [] ∧ y (h ∷ t)) ∨
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
116 split (λ t1 → x ( h ∷ t1 )) (λ t2 → y t2 ) t
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
117
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
118 Concat : {Σ : Set} → ( A B : language {Σ} ) → language {Σ}
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
119 Concat {Σ} A B = split A B
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
120