comparison a02/lecture.ind @ 326:a3fb231feeb9

omega
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 21 Jan 2022 10:45:42 +0900
parents e5cf49902db3
children 407684f806e4
comparison
equal deleted inserted replaced
325:39f0e1d7a7e5 326:a3fb231feeb9
282 282
283 最低限5題をまとめてレポートで提出せよ 283 最低限5題をまとめてレポートで提出せよ
284 284
285 <a href="agda/record1.agda"> record1</a> <!--- Exercise 2.2 ---> 285 <a href="agda/record1.agda"> record1</a> <!--- Exercise 2.2 --->
286 286
287 --Sum type 287 --data -- Sum type
288
289 record は ∧ に対応するが、∨はどうすれば良いのか。残念ながら∧と対称につくることはできない。(なぜか?)
290
291 Agda では data という場合分けをする型を導入する。Curry Howard対応が成立する様に、論理記号に対応する
292 型を導入する。型には導入と削除がある。
293
294 導入のない data を定義すると、それを矛盾として使うことができる。それを使って否定を定義する。
295
296 さらに
297
298 有限な要素を持つ集合(型)
299 自然数
300 λ項の等しさとしての等式
301 不等号
302
303 も data を使って定義できる。
304
305 data は invariant あるいは、制約付きのデータ構造を表すこともできる。
306
307 さらに、
308
309  規則にしたがって生成される集合
310
311 も表すことができる。一つ一つ、ゆっくり片付けていこう。
288 312
289 <a href="sumtype.html"> Sum type 排他的論理和</a> 313 <a href="sumtype.html"> Sum type 排他的論理和</a>
290 314
291 315 以下は必要に応じて説明していく。
316
317 --λ計算の進み方
318
319 Agda の値と型は項で定義されていて、それを簡約化することにより計算が進む。
320
321 Agda (そして Haskell )は、項を簡約化していくことにより計算が進むプログラミング言語である。
322
323 簡約化の順序には自由度があり、それは実装にって変わる。
324
325  関数適用にる置き換え
326  場合分けによる変数の確定
327 確定した変数での置き換え
328
329 自由度に関係なく、項は決まった形に簡約化されるようにλ計算は作られている。(合流性 -- 要証明だが、割と難しい)
330
331 (Agda で Agda を実装できるのか?)
332
333 合流性があるので、data で定義された等号が正しく動作する。
334
335 変数が含まれている場合の等号は単一化と呼ばれる。変数の置き換えが置きるのは data の場合分けと、関数呼び出しの二種類になる。
336
337 --停止性の問題
338
339 入力を data の場合分けで分解していくことは、入力が決まった大きさの項なので、必ず有限回しかできない。
340
341 つまり、そういう計算が止まることは Agda にはわかる。例えば List や Nat の分解である。
342
343 分解は再帰的なので、再帰呼び出しがとまるかどうかは、再帰呼び出しの引数が、dataの分解になっているかどうかで判断される。
344
345 これは一般的なプログラムでは自明にはならない。その時には型チェックエラーになる。 {-# TERMINATING #-} を指定することにより
346 それを抑制できる。その場合は、そういう止まるとすればという仮定を持つ計算あるいは証明になる。
347
348 -- induction
349
350 自明な停止条件でない推論もいくつかある。
351
352 引数が直接 data を分解しないが、引数が減少する自然数に対応する場合
353 生成される引数パターンが有限だと分かっている場合
354
355 の二つの場合は Agda で induction を定義できる。
356
357 --古典論理、一階述語論理との差
358
359 Agda の → ∧ ∨ は、項の型として定義されている。
360
361 _∧_ : Set → Set → Set
362
363 古典論理では真と偽の二つしかない。
364
365 data Bool : Set where
366 true : Bool
367 false : Bool
368
369 この差は、二重否定の扱いに現れる。
370
371 _/\_ : Bool → Bool → Bool
372 true /\ true = true
373 _ /\ _ = false
374
375 _\/_ : Bool → Bool → Bool
376 false \/ false = false
377 _ \/ _ = true
378
379 not_ : Bool → Bool
380 not true = false
381 not false = true
382
383
384 とする。
385
386 以下は Bool では証明できるが、Set では示せない。
387
388 lem-in-bool : (b : Bool) → not p \/ p
389 lem-in-bool = ?
390
391 double-negation-bool : {B : Bool} → not (not B) → B
392 double-negation-bool = ?
393
394 Set の方では対偶は一方向しか成立しない。また、二重否定や排中律も成立しない。
395
396 contra-position : {n m : Level } {A : Set n} {B : Set m} → (A → B) → ¬ B → ¬ A
397 contra-position {n} {m} {A} {B} f ¬b a ?
398
399 これは、Agdaの Set が具体的なλ項を要求するためである。つまり、
400
401   実際に構成できる証明しか Set は受け付けない
402
403 Bool の場合は最初から true / false がわかっている。Set の場合は、そこに入る項がある、入らないことを証明する項がある。
404 そして、どちらかわからない場合がある。
405
406 実際にわからない場合があることが証明されている(不完全性定理)。一方で、
407
408   証明するべき式が恒真(すべての可能な入力について真)なら、証明がある(完全性)
409
410 であることも証明されている。恒真かどうかはわからないので、この二つは矛盾しない。
411
412
413 --一階述語論理の定義
414
415 Agda を使って一階述語論理を定義することもできる。
416
417
418
419
420
421
422
423
424
425