72
プログラミング技術 山崎利治

プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

 プログラミング技術�����山崎利治

Page 2: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

前口上

これは

「プログラマとして体得していて欲しい技術」

についての元プログラマの個人的な意見である.

プログラマとは 公共の安寧に影響するソフトウエアを開発する職業プログラマのことで,職業とはプログラマとして給料を得ているという意味である.

Page 3: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

予定 �第 �部�

��� 小さなプログラムの作成 ����今回�

初期のプログラム作成論

�構造的プログラミング,段階的洗練,情報隠蔽,

プログラムの検証 �一階論理��

��� 小さなプログラムの作成 ����次回�

�����論理,洗練計算

Page 4: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

予定 �第 ��部�

��� 大きなプログラムの作成 ���

抽象データ型

��� 大きなプログラムの作成 ���

状態系�

Page 5: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラムとは ���

� 計算機を動かす処方箋である.

� 数学的な定理である.

後者の見方では

プログラムが仕様の模型であることを厳密に証明しなければならない�

後者の見方をするひとは少ない.しかし,その見方は検討する価値がある�

Page 6: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラムとは?���

数学的な定理であるとは ������ ����� の言葉でプログラム作成の道徳として,つぎを主張したものである.

� 計算機は数学機械である.計算機の挙動すべてが数学的な精密さで定義され,どんな細部も定義から演繹できる.

� プログラムは数学式である.プログラムは意図した,あるいは,意図していない計算機の挙動を細大漏らさず定義する.

� プログラム言語は数学理論である.プログラム言語は概念,記法,定義,公理,定理を含み,プログラマがプログラムを仕様に合致するように書き,かつ,それを証明するのを助ける.

� プログラム作成は数学活動である.プログラム作成は他の応用数学や工学分野同様,実践で役立つためには,課題を数学的に定式化し,証明を厳密に行う必要がある.

Page 7: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラミングの見方 ���

プログラミングの教科書につぎがあった.

� ���� ���� ��� � �� �������� ������������

�������������� � !�

"� #������ � ������� �����������$ �� %������&�����

������&� ���� �'(�

(� ������)*���� � ���������� �� ������������ ������&� ����

�' �

+� ,����������� ��� ��� �� ������������ ������&� ����

�!�

-� ��.���� ��� ������� �� ������������ /������� �!�

� ������������ ��� ����� �� ������������ ������&� ����

�!+�

Page 8: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラミングの見方 ���

����年代のプログラミング事情

� 言語参照文書のなかの例文を眺めて作譜していた.

� 興味は課題の算法に集中し,

� 作成方法自体も問題であると気付かなかった.

� 気付いたひとたちが作譜教科書を書き始めた.

それらが前掲の書物で,表題に著者の気持ちが表れている.

Page 9: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラミングの見方 ���

��������「作譜は非常に魅力的なもので,経済的あるいは学問的に実り多い仕事であるのみならず,詩や音楽の創作に似た美学的作業でもある.」算法についての百科辞書.

� ��������������基本的な概念に基づいた系統的な作業としての作譜教育をめざす.言語 ������がこの意図を十分に果たした.

� ������������������作譜過程の解説を目的とする,最弱前件による論理的作譜を範例とした作譜解説.

� �!�"���#��仕様と検証を強調した教科書であるが,計算機で実行するよりも,英作文同様に先生が大切であるとする.

$� �����������「科学を,知識とともに原理原則を積極的に適用する実用的な行為」と解釈する.洗練計算の教科書.  

%�������&$���作譜は数学の厳密さをもつ学科であるという教科書.

Page 10: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラミング技術とは?

プログラミング技術� 作成技術 � 分析技術

� プログラムは仕様の実現として正しくなければならない.故に,それを主張できるプログラムを書く必要がある.また�プログラムを分析して正しいと判断できなければならない.その行為は科学 �論理・数学�

を規範とし �まさに「技術」といえる.

� この技術性がプログラミング教育を可能にする.

� 一方,手紙を書く,料理するなどのように体験に依存する「技芸」・「技能」でもあるが.

Page 11: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラム作成論

プログラム作成論の始まりは '()*年代の構造的プログラミングであ

る.それがソフトウエア工学に成長する �'()+��.プログラム作成論

が生んだ重要な概念としてつぎを注意する.

� 構造的プログラミング !�"#!"��$ %��&��''()&

� 段階的洗練 !�%*( � ��+)�'�)!

� 情報隠蔽 (),��'�!(�) -($()&

� プログラムの検証 %��&��' #����#!)� .��(+#�!(�)

��

Page 12: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

構造的プログラミング ���

'()*年代後半では,

� 機械語や直訳語から解放され,#!�����, �!-!�, ��.�などの命令型の「高水準」言語が利用されるようになった.

� 当時のプログラム作成は多くが「流れ図」に頼っていた.

結果,多くの「スパゲッティ」プログラムが生まれた.

参考  0������ や ��1�� は名札が格納できる値を許し,可変接続子が利用できた.

�� �� ���������� 20������� 計算 �� ��3

�� �� �� ��������� 20������ 割当 �� ��3

�� �� �� ��� �� ���� ��� �� � 2��1�� 従属 �� ��3

参考 "  最近は �����&���� などの利用により意図的に飛越文を書くこともある.

��

Page 13: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

構造的プログラミング ���

���� � ������の手紙 �$! �! �����/��� �!�� "���" ���/0���

���,'()+��の冒頭

ここ数年,プログラマの質はその書くプログラムのもつ ����文の密度の単調減少関数であることを観察してきた.ごく最近,����文が破壊作用を起こす理由を発見したので,�機械命令を除いて�すべての「高水準」プログラム言語から

����文を追放すべきであると確信するにいたった.

��

Page 14: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

構造的プログラミング ���

1!�!文が破壊作用を起こす理由プログラム文脈 �静構造� �� プログラム実行 �動構造�

� 1!�!文の追放

� ������は縷々上を解説するが,現場のプログラマは経験上直ちに理解できた.また,つぎ �23!�/�4��!5 � � もそれを援護した.

1!�!プログラムは,論理変数とその処理を導入して同値な反復プログラムに書きなおせる.

ここで,反復プログラムとは連接 ��'6�7�,選択 � 0 - ���� �' ����

�7 8�,反復 �9� �� - "! � !"�の基本3構造から構成した 1!�!文を使わないプログラムをいう.

��

Page 15: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

構造的プログラミング ��

先の反復プログラムにおいて,反復文として 9� �� - "! � !" をとれば,帰納関数 �をプログラムできるが, 0!� � "! � !"��の �回実行� だけをとるときは,原始帰納関数しかプログラムできない �手続き定義と呼出しはもたない�.

"�, 4�:�, � ;�� など,いづれも合成・選択・反復 �例外機構つき�

の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラミングは段階的洗練やプログラムの検証などの重要概念を伴った作成方法を意味したが,プログラム作成現場では構造化プログラミングとして,飛越文を使わずに基本3構造によってプログラムすることと理解した.

� �&*������関数 � � � � � � � � ���� �� � � � ��

��� � �� � ��� � �� ��� ��� � �� � ��� � ����� � ����� � � � ���

��

Page 16: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

段階的洗練

�� ����や �� � ���の先駆的論文が有名であるが,プログラム作成法として基準になった考えである.その説明は,あとの 洗練計算で行うが,つぎのような考えである.

� はじめのプログラムは実行できない抽象プログラム �仕様�である.

� 一緒にまとめて定義したデータや手続きを段階的に具体化 �洗練�する.

� 実行できるプログラムになるまで反復する.

� 計算量を考慮した後戻りもある.

これは洗練計算 �� ������計算�となり,さらには形式的プログラム開発方法に発展する.

��

Page 17: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

情報隠蔽 ���

'(<*年台のプログラム開発事情:

� プログラムが大きくなり,付帯文書も膨大になった.プログラム開発時に無反省に「なんでも書いておこう」という気風があった.

� プログラム部分 �モジュール�の作成基準 �モジュール内凝集度やモジュール間結合度など�や記述方法を模索していた.

� 「プログラム属」,「ソフトウエア枠組」,「製造系列」などが議論され始めていた.

� 多くは用語「仕様・設計・実現」の意味が未整理であったことに遠因がある.

������� �������� ����4��� �����4��* �����&� ����

��

Page 18: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

情報隠蔽 ���

���� ������は 2� ��&���5�� ��� ����4��� ������ ���&�6&����� 4���

�7������� ���8 �'"�など一連の論文で3プログラム・モジュール論

を展開した.モジュール仕様記述はつぎのようにするといいという.

�� モジュール実現のための必要情報を含み,そのほかは含まない

�� モジュール利用のための必要情報を含み,そのほかは含まない

/� モジュールと利用プログラム間の整合性・完全性が検討できる形式性をもつ

0� モジュール実現者にではなく,利用者に解るように書く

��

Page 19: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

情報隠蔽  ���

������はモジュールを状態をもつ系と考えた.すなわち,状態を参

照する関数と状態を変化させる関数を分け,その関数の効果と例外を

記せとしている.これは ������モジュールと通称され,のちのオブ

ジェクト指向に採用された.

いずれにせよ,仕様と実現が分離できれば,つぎの利点を生む.

� 利用プログラムの正しさの推論が楽になる

� モジュール実現の変更が利用プログラムに影響しない

モジュール仕様は,あとで抽象データ型や状態系として例示する.

��

Page 20: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

プログラムの検証

プログラムは正しくなければならない.構造的プログラミングは プログラム

の正しさを当初から重視していた.

プログラム正当性検証とはつぎをいう.

� 「仕様」とはプログラムの意図の明確な表明であり

� 「正当性」とはプログラムが仕様を満たすことであり

� 「検証」とはその証明である

では,仕様はどう書き,どう証明するか?  仕様記述例はつぎである.証明は次回に 2証明問題は異なるが3.

Page 21: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

仕様記述の一例

整数配列 ��� � ��を整列 ��!���するプログラムの仕様

� � ��� ��� � ��� ��� � �� � �������

���� � ��� � � � � � � � ��� � ���

� �� �� ��

��� � ��� �� � ��� �� �

��� � � � � � � � � � � � ��� � ��� ��

����� ���� は事前条件,事後条件.それぞれプログラム実行前,実行後に成立

しなければならない条件である.

��

Page 22: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

仕様記述の一例整列プログラムの仕様はつぎを記す必要がある.

'� 配列 �と �は多重集合として等しい �重複順列の置換�.

7� 配列 � � ��� � � � �は順序保存写像である.

��� �� � ��� ��は '�の主張である.

� -�1, /��� ���多重集合とは,要素を複数回含むことができる集合のようなものである.集合 � 上の多重集合を � から自然数集合への写像と考える.

������� � �� �� �� � �� �� � �� �

��� ��は配列 �を多重集合に変換したものを表す.

��� � ����� � ���

��� �� � � ��� � � ��� �� � �� � � � � � ���

上で,��は集合 � の要素数.

��

Page 23: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

仕様・プログラム・検証

�����������はプログラムの正当性検証を行う論理体系�����論理を開発した.次回に紹介したい.そこでは,人工言語

� プログラム言語

� 仕様言語

� 証明言語

を扱う.今回は準備として「一階論理」+� ! ��$�� 1�&(#を一瞥する.

��

Page 24: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理今回一瞥する「一階論理」は伝統的に学ばれてきた古典論理学 2一階述語論

理学3のことである.これは論理を学びまた利用する基礎である.論理学は

専門の研究以外にも応用のためのさまざまな論理が生まれている.計算科学

周辺でも

� %!���論理 �プログラム検証�

� 動的論理 �プロセス意味論�

� 時間論理 �状態系記述.模型検査�

� 等式論理 �抽象データ型�

� %!��論理 �抽象データ型.論理プログラム�

� 型論理 �関数プログラム�

� などなど

��

Page 25: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理

用語「論理」はつぎのように使われている.

� 論理学のこと

� 論理学で扱う思考形式と法則そのもの

� 思考の法則的連関

� 実際に行う推理の仕方,議論の筋道

� 客観的事物間の法則的連関,比喩的意味

� 恒真式を含み推論規則で閉じている論理式全体

��

Page 26: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理学

論理学 �正しい思考の形式と法則の研究�はつぎに役立つ.

� 知見を言語によって「表明」�式�し

� 推論操作によってその表明を「証明」する

論理体系はつぎの成分をもつ.

� 語彙 �論議領域�

� 言語 �構文法�

� 意味論 �模型�

� 証明論 �公理+推論規則���

Page 27: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理学論理学=証明論+模型論

模型論 論理の意味的扱い.言語と抽象構造

証明論 論理の純構文的扱い.式と証明

言語

構文

������

����

����

����

解釈

�����

����

����

����

��

領域

証明論 ��健全性・完全性

��模型論

��

Page 28: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理学

鍵になる術語

語彙 定数記号,関数記号,関係記号,変数記号

論理結合子,限量子,補助記号

言語 式,素式,項,

有効範囲,代入,閉式,理論

模型 構造,付値,真 �妥当�,充足可能,模型

証明 公理,推論規則,証明可能

模型と証明 健全性,完全性,有限模型性,不完全性

��

Page 29: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論議領域

知見表明の範囲を明示する論議領域を設定する.そこで2種の表示が

できるようにする.

� 対象の表示  個体の直接表示 �定数や変数�と,個体上の関数による間接表示 �項�

� 対象間の関係の表示 �素式�

素式があれば,それらを論理結合子や限量子を用いて式が構成できる.

��

Page 30: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論議領域論議領域はつぎのような � �� � �� �である.

� � は対象の非空集合で台という

� は � 上の関係の集合 ����

� ��� � � � �

� � は � 上の関数の集合 ����

� � � �� � � � � � ��

� �が � 上の �� 項関係であることは,��� � � � � ���

� � ならば,

����� � � � � ����の成立 �真�,非成立 �偽�を決定できる手段があるこ

とを意味する.

� � が � 上の �� 項関数であることは,��� � � � � ���

� � ならば,

� ���� � � � � ���� � � であることを意味する.

いずれにせよ,� � �� が論議の語彙を定めることになる.

Page 31: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論議領域

自然数演算の論議領域例

� � �� � �� � �����

� � � �

� � � � � �

� ��� � � � � �

��

Page 32: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理言語語彙

論理記号 変数記号 �可算個�

�対象非依存� 等号記号�

論理結合子��������� 限量子 �

句読点「�」や括弧「�� �� �� �� �� �」など

非論理記号 関係記号

�対象依存� 関数記号

�定数記号���

Page 33: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理結合子と式定数� � �   �かつ � 連言 #�)2")#!(�)

� � � �または � 選言 $( 2")#!(�)

� � � �ならば � 含意 ('%1(#�!(�)

�� �でない 否定 )�&�!(�)

� � � �と �は同値 同値 �3"(.�1�)#�

偽,矛盾 �式定数� ,�1 "'� �4 "�$"'

� 真 �式定数� .��"'

結合の優先順位は �� � � �� �� �

��

Page 34: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

論理結合子

�� � �� � �� � � �� �� � � ��

��� � �� � �� � � ��� �� � � �

�� � �� � �� � � �� �� � � �

�� � ��� �� � �

�� � ��� ��� � ���

��� � ��� �� � ��

�� � � � ���� � �

� � � � � � � �� � �

� � � � � � � ��� �

��

Page 35: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

限量子 � ��� �   ある �が存在して ��� �をみたす.

� ���� すべての �は ����をみたす.

 

� �� � � � ��

� Æ�� �� � � � �� Æ �� �� �� � �� ��

すべての �に対して Æが存在して � �� � � � �� Æ

ならば � �� �� � �� �をみたす ����� �� � � ��.

��

Page 36: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

単種一階論理言語�

一種類の対象を論議するための単種一階論理言語 �を定義する.

� �� �定数記号�   � � ���� �項�

� � ��� �変数記号�   � � ���� �素式�

� �� �関数記号�   � � ���� �式�

� � ��� �関係記号�  

単種とは対象の種類 2型3が一種類であること,一階とは変数は対象を指示するものに限る論理をいう.

��

Page 37: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

�の構文

� は項,�は素式,�は式:

� ��� � � � � �� � � � � � ���

� ��� � � �� � ��� � � � � � ���

� ��� � � �� � � � � � � � � � � � � � � � � � �

関数記号 や関係記号 � には,項数 2������9�����32引数の数3という自然数

��� �� �����が付随する.  項は個別の対象の指示,素式は式構成の基本要素,式が判断・表明である.

��

Page 38: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

限量子の有効範囲

式の中に � 限量子 �� � � � ��が出現するとき,その有効範囲をつぎの

ように定義する �.以下で � �� は式.

� � �中の � の有効範囲は � �である

� �� � � 中の � の有効範囲は � � � のそれと同じ

� � � � � �� � � � � � 中の � の有効範囲は

� � � のそれと同じ

� � � � � 中の � の有効範囲は � � � のそれと同じ

�  定義に存在限量子,否定,連言だけを使った.他も同様.

��

Page 39: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

限量子の有効範囲��� � � � � � � ��� � � � � ��� � � �� � ���� � � ��

上式について

� 限量子の有効範囲は ���

� 限量子の有効範囲は � � � ��� � � � � ��� � � ��

� 限量子の有効範囲は � ��� � � �

��

Page 40: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自由変数と束縛変数,文式中に出現する変数 � が � 限量子の有効範囲にあるとき束縛されているといい,束縛されていない変数を自由変数という�  式 �に表れる自由変数集合 �� ���はつぎのように定義できる.

� �� ��� �

� �� �� � � ���

� �� ��� � �に出現する変数全体

� �� ���� � �� ���

� �� �� � �� � �� �� � �� � �� �� � �� � �� ��� � �� ���

� �� �� � � �� � �� �� � � �� � �� ��� � ���

� 自由変数をもたない式を閉式,文という.

Page 41: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自由変数と束縛変数

� � Æ �� �� � � � �� Æ �� �� �� � �� ��

� � � �� � � � �� Æ

� �� � �� �� � �� �

�� � � � �

� � � Æ � �

� � � � �

�� ��� � �� � �� �

�� ��� � �� � �� ��

�� �� � �� � �� ��� � �� ��� � �� � �� �� � ��

�� �� Æ � � � �� �� � �� � �Æ� � �� � �� �� ��

�� ��� � �� �� Æ � � � �Æ� � �� � �� ��

�の束縛変数は  �� Æ

�の自由変数は  � � �� �

��

Page 42: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

代入代入 ��-�� ��� !� とは,変数に項を割り当てる写像 � � ��� � ���

をいい,これは定義域を項や素式や式を含む集合上の写像に拡張できる.例

�� � � �� ���� �� �� � ��� ����� ���� ��� ��とするとき,

��� � �� �� ��� � � � �� �� � ���� �����

��� � �� �� ���を �� � �� �� ����� � ��� �� � ��� �����と記す.��

Page 43: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

代入

� � � �はそれぞれ変数,項とする.

'� �が項であるとき,� に自由出現するすべての � を � で置換して得られる項を ����� �と記す.

7� �が素式 ����� � � � � ���であるとき,����� �は

�������� �� � � � � �� ���� ��である.

=� �が �� の形のとき,����� �は �� ���� �を表す.

>� �が � � � �� � ��������の形のとき,����� �は � ���� � � � ���� �

を表す.

?� �が ! を �または �として,! � � � の形のとき,����� �は

�'� � � � ならば �.

�7�'� � �� � かつ � に �が不出現ならば ! � � � ���� �.

�7�7� � �� � かつ � に �が出現ならば ! � � �� ���� ������ � �ただし,� は �� � に不出現の変数�.

��

Page 44: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

代入 �例�

��� � �� � � ����� � � � �� � � �

は誤り

場合は前スライドの 5������で

� � �� �� � � �� � � �� �� �ゆえに,新変数 � を選び,

���� � � ��� � � ����� ������ �

� � � �� � � ����� �

� � � �� � � �

��

Page 45: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

�構造

�構造� � �� � ��とは,� と �がつぎをみたすときにいう.

� � は非空集合,�の領域という

� �は �の語彙に � 上の定数,関数,関係を対応させる写像である

� �が定数記号のとき �� � �

� � が � 項関数記号のとき � � � � � � �

� �が � 項関係記号のとき � � �

上の �を解釈という.

�に � の各要素 � に対する名前 �� を新定数として追加し,�を拡張する.この言語も同様に �と記す.�も � の名前 �� に対して ��� � �

として �の解釈に拡張する.この解釈も同様 �で表す.

��

Page 46: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

項の意味付け

� を �の変数を含まない項とする.

このとき,� の要素 ��� ��をつぎのように定める �帰納的に�.

� �が定数 のとき,��� �� � �

� �が ���� � � � � ���の形のとき,��� �� � ��������� � � � � ���� ���

��� � 項� �

��

Page 47: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

閉式の付値閉式の意味づけ ���付値 ������ �閉式� ��� �を定義する.

������� � � � � ����� � �� �������� � � � � ���� ��� � � � ��� ���� �

��� � ��� � �� ��� �� � ����� ��� ���� �

��� � � �� � ��������� ��� ���

��� � � �� � ��������� ��� ���

��� � � �� � ��������� ��� ���

��� � � �� � ��� � ������ ��� ���

������ � � �����

��� � � ��� � ����� �����������

��� � � ��� � ����� �����������

�  これも多重使用 2�:���������3している.

��

Page 48: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

式の付値

一般の式の付値はつぎによる.

����� � ������

ここで,��は � �� � � � � �� �で � の閉包という �ただし,

�� ��� � ���� � � � � ���のとき�

� ����� � �のとき �は構造�に関して真であるといい,

� �� �と記す.このとき �を �の模型という,真でないときは偽という.��を構造と式の間の充足関係という.

��

Page 49: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

解釈例

�は定数記号 �,2項関係記号 � をもつのみとする.

�構造 � � �� � � �を,� � ��� �� �� " � �� �� � �� � � ��とする.

半順序集合 �� ���をつぎの %����図で表す ���1� � � ��.

����

����

����

����

���

Page 50: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

解釈例

このとき,

�� � � � � � � ����� � �� � ��� � � �� ��� � � ��

��� � � �� � � �

Page 51: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

恒真式

�を �の式とする.

� 式 �は恒真 .�1($ �� �の任意の構造�に対して

� �� � このとき,�� �と記す.

恒真式の例

� � � � � �

� � � � � � � �

� � � � � � � �

恒真式は命題論理では ��������� と呼んでいる.

��

Page 52: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

充足可能式

�を �の式で,�� ��� � ���� � � � � ���とする.

� 式 �は充足可能 �!( +�41� �� �の構造� � �� � � �

と � の要素 ��� � � � � ��が存在して

� �� �������� � � � � ����� �が成りたつ.

��

Page 53: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

理論・模型

� �の閉式の集合� を �の理論 !-���6という.

� ����� � �� � � � � �� ��

� � �� � �構造�は理論� の模型�� � � �����

� � は �の閉式集合,�は �の式とする.� �� � となる任意の模型�に対して,� �� �となるとき �は � の論理的帰結 #�) �3"�)#�といい,� �� �と記す.

��

Page 54: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然演繹系

言語 �の構文と解釈を眺めた.つぎは「証明」である.証明も形式化

する.証明系の一つ自然演繹 ������� "�"��� !� ��による.

簡単のために論理結合子をつぎとする.

�  矛盾 �式定数�

� ����

その他はつぎの省略である.  

�� � � � � � � � � �� � �� � �� � ��

� � � � �� � � � � � � �� � ��

� � �� � � � �

��

Page 55: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然語による証明例� �� � �� � ���� ��� � ��� ���

'� � � �� � ��と � � � を仮定すると �が導けることを示す.

7� � � � から �が導ける.

=� この �と仮定の � � �� � ��から � � �が導ける.

>� 7と同様にして,� � � から �が導ける.

?� =と >で � と � � �が導けたが,さらに,

)� � と � � � から �が導ける.結局 ' が示せた.

<� ' は �� � �� � ���から ��� � �� � ��が導けた.

+� 書き直せば �が導けたことになる.

��

Page 56: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然演繹推論規則推論規則はつぎの図のように表す.

��

� ��

横線の上の式を仮定,下の式を結論という.心算は「� や � �が証明できればば �が証明できる」である.

証明とは推論規則によって構成した式の木である.木の根や節に式が付随している.木の根の式が証明式であり,末端の節が仮定式である.�が証明式のとき,�は ��で証明可能といい ��� �と書く.推論規則には論理結合子ごとに導入と除去の2種類がある.

��

Page 57: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然演繹推論規則仮定

導入

�� ��� �

�������

�� � � �� � �

� �

� � �

�� � �

��� �

� � ��� ��� � �

除去

�� � ��

�����

� ��# �

� � � �

� �� # �

� � �� �� # �

� � �� �� # �

� � �

����� ���# �

��

Page 58: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然演繹推論規則

仮定規則は単一式から構成した証明木である.これは式が仮定であり,同時に結論である.式は等式か非論理公理である.

�� ��� �は矛盾を仮定すれば直ちに任意の式を結論とできる規則であ

る. ���「矛盾からは任意の式が証明できる」��#�@��A 0���!

��B� ��� B�!"� -��.

�������

�� � � �� � �は �といくつかの仮定から �が証明できたとき,直ち

に � � �が結論できる.この結論は �に依存せず,他の仮定にのみ依存する.このとき �を落とす " �����1�ことができる.

��

Page 59: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然演繹推論規則

��� �

� � ��� ��� � �

は,結論 �を証明でき,そして,その仮定のなかで変数 � 自由出現しないとする.そのときには,� � ��� �が結論できる汎化則 �$������� C�� !�.

�� � ��

�����

� ��# �は,� � ��� ���を仮定して矛盾に至る証明がえられれば,そこから �が結論できることをいう.ここに至れば仮定 � � �

は落とす " �����1�ことができる背理法 �� ��"��� ! �"

�-���"�/.

��

Page 60: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然演繹推論規則

� � � �

� �� # �は肯定式 ����/!"�� 5!����である.

� � ��� �

����

��# �

は,結論 � � ��� �を証明でき,そして,�が項で �の中において � に代入できるとする.そのときには,����が結論できる代入例 ��������� �� !�.

Page 61: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

自然演繹推論規則� � � �� �

� � �

� � � �� ��

� � � � � �

� � � �� ��

� � �

��� � � ������� ��

� � � ����

����

�� ��

� � � � � � �� ��

��� ��

�� ��

 下式は一意ではない

��

Page 62: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

形式的証明例� �� � �� � ���� ��� � ��� ���

自然演繹系 ��による証明木

� � ��

� � �� � � �� � ��

� � �

� � � � �

�� � �� � ���� ��� � �� � ��

��

Page 63: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

� � �

� � � ��������������������� � � �� � ��

�����������

��������������������� � � �

��������������������

� � � � �

�� � �� � ���� ��� � �� � ��

��

Page 64: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

健全性定理

� を �の閉式集合とし,�は �の任意の式とする.� � � � �� �

証明可能な式は妥当である.

��

Page 65: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

演繹定理

�は閉式,�は式とする.

� � ��� � � � � � �

� � を証明するするとき,� を � に付加して を証明すれば � � は定理になる.

�が閉式でなければ演繹定理は成立しない.���� � � � の公理に � � �を付加すれば � � �が代入規則によって証明できるが,� � �� � � �は定理ではない.

��

Page 66: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

整合性

� � ���� ���は整合�とは � �� のときにいう.

� � ���� �ならば,任意の ��閉式�に対して

� ���� � ����か � ���� � �����のどちらかが成りたつ.

��

Page 67: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

完全性定理

� � �はこれまでどおり,� � � � � �� �

���� � � �は模型をもつ.

妥当式は証明可能である.

��

Page 68: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

�第一�不完全性定理 ���� ���

形式理論が整合で算術を含むほど豊かなら,

妥当ではあるがその体系では証明できない

式が存在する.

� � の任意の閉式 � に対して � � か � �� のどちらかが成立するとき

� は完全 &������� といい,そうでないとき不完全 ��&������� という.

��

Page 69: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

参考文献

�������,�� ��������,��������,��������� ������� ������らはみな

������ 賞の受賞者である.ここで参照した論文はぜひ一度読んでいただきたい.

� 荒木啓一郎・張 漢明�プログラム仕様記述論 オーム社� ��

� ! "#��$ ��� % &�'�(���� ���) ������$�� ������ $�'����� ��� ���������

)��� ���� �)� *��$����� ����� !+!,� -� �-..

� / & ���� �� �� � 0���'����� 1�����$$��� +'���$�' 1����� �-�� 野下浩平 ・川合慧・武市正人訳,構造化プログラミング.サイエンス社,�-��

� 2 � �� ������ %� �� �����$��� '��������� ���$*�� !+!, ��� �-.�

� 3 � ������ +�������� $������� �� (�����$� 1��' 0�$( �� +((���� ,���

�-.�

� � � %�������� ��� & 4�� ���$���� 1������� ��� '����� (��5��$ *�� ��

���'�����' '�$(����� ������$��� 3�(��� 60 /�� ��(� �-�� ����� �� +

���5 �� � !����'��� ����� �* & 4�� ���$��� 4�� �� 1����$��� �-.�

� ! + 3 ������ +7��$���' 5���� *�� '�$(���� (�����$$��� !+!,��� �-.-

��

Page 70: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

参考文献

� ! + 3 ������ ��� $����$���'� �* (�����$$��� 0(������� 8�!0 �.� �-��

� 0 3 9����� �� +������� �* ����'����� (�����$� &!00� -��-��

� : ,����� ,����$���'�� ������ �* !�$(������� ,'%��);����� �-��  五十嵐 滋訳,プログラムの理論.日本コンピュータ協会,�-��

�� 1 ����� 1���* �* ��������$� 5� ������� ���(����� "<��. �-..

�� 1 ����� 1�����$$��� 5� �'���� '������� "<��- �-.-

�� 小野寛晰,プログラムの基礎理論.サイエンス社,�-��

�� 小野寛晰,情報科学における論理.日本評論社,�--�

�� � 8 1������ + ��'���=�� *�� ��*�)��� $����� �(�'�>'����� )��� �7�$(���

!+!, ����-��

�� 玉井哲雄� ソフトウエア工学の基礎 岩波書店� ��

�� � ������ 1�����$ ��4���($��� 5� ���()��� ��>�$��� !+!, ��� �-��

Page 71: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

次回までの宿題

つぎの問題をプログラムしてください.

��

��

長さ � の一次元整数配列 � がある.

連続した配列区間の要素の和の最大値 ���

を求めよ.

��

Page 72: プログラミング技術 - ホームページ · 2015. 11. 5. · の3つの型の構造文をもち飛越文は使わなくなった.構造的プログラ ミングは段階的洗練やプログラムの検証などの重要概念を伴った作成

次回までの宿題問題の具体例

/�� D 7, E>, 7, E', ), E= F G <

� 長さ1の区間の和は D 7, E>, 7, E', ), E= F,

� 長さ2のそれらは D E7, E7, ', ?, = F,

� 長さ3のそれらは D *, E=, <, ', 7 F,

� 長さ4のそれらは D E', =, >, F,

� 長さ5のそれらは D ?, * F,

� 長さ6のそれらは D 7 F.

��