Mercurial > hg > Members > kono > Proof > automaton
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 |