「表示的意味論」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
(会話 | 投稿記録)
m →‎完全抽象化: 閉じタグの不備を修正
参考文献を追加
(3人の利用者による、間の88版が非表示)
1行目: 1行目:
[[計算機科学]]における'''表示的意味論'''(ひょうじてきいみろん、denotational semantics)とは、[[プログラミング言語]]に代表される形式言語の意味付け理論の一つである。意味付けを行いたい文言や構文の世界とその意味の世界を用意し、意味関数で対応付けを行うという典型的な意味付け理論の形態を取るが、再帰的定義された構文についてはその集積点にあたるものを対応付けることで意味付けを行うというところに特徴がある。
'''表示的意味論'''(ひょうじてきいみろん、Denotational Semantics)とは、[[計算機科学]]([[理論計算機科学]])の一分野で、[[プログラミング言語]]の[[形式意味論]]([[プログラム意味論]])の手法のひとつである。初期には「数理的意味論」(mathematical semantics)、「スコット-ストレイチー意味論」(Scott–Strachey semantics)のようにも呼ばれた。プログラムの意味をあらわす数学的オブジェクト(これを「表示」(denotation)と呼ぶ)を構築することで、プログラミング言語の意味論を形式化する手法である。<!--表示的意味論は本来単一の[[プログラム (コンピュータ)|プログラム]]で定義されるシステムだけを扱うよう開発された。後に複数のプログラムから成るシステムにも拡張され、[[コンピュータネットワーク]]や[[並行性|並行システム]]も扱うようになった。-->


== 概要 ==
表示的意味論の起源は、[[1960年代]]の[[クリストファー・ストレイチー]]や[[デイナ・スコット]]の研究である。ストレイチーやスコットが開発した本来の表示的意味論は、プログラムの表示(意味)を入力を出力にマッピングする[[関数 (数学)|関数]]に変換するものである。後にこれはプログラムの表示(意味)を定義するには非力であることが証明され、例えば[[再帰呼び出し|再帰定義]]関数・データ構造を表現できないことが判明した。これを解決するため、スコットはより汎用的な[[領域理論]]に基づいた表示的意味論を提案した<ref name=abramsky1994>S. Abramsky and A. Jung: [http://www.cs.bham.ac.uk/~axj/pub/papers/handy1.pdf ''Domain theory'']. In S. Abramsky, D. M. Gabbay, T. S. E. Maibaum, editors, Handbook of Logic in Computer Science, vol. III. Oxford University Press, 1994. (ISBN 0-19-853762-X)</ref>。その後、研究者らは[[:en:Power domains|Power Domains]]に基づいた手法を提案し、[[並行性|並行システム]]の意味論の困難さを克服する努力をしている<ref name=Plotkin1976>Gordon Plotkin. ''A powerdomain construction'' SIAM Journal of Computing. September 1976.</ref>。
=== 導入:無理数(実数)の発見 ===
古代ギリシャの学者ピタゴラス(Pythagoras)は正方形の対角線の長さ d とその辺の長さ s の間の比 r = d/s は方程式
:d<sup>2</sup> = (rs)<sup>2</sup> = s<sup>2</sup> + s<sup>2</sup> (ピタゴラスの定理)
を満たさねばならないことを知っていた。そのためピタゴラスは r<sup>2</sup> = 1<sup>2</sup> + 1<sup>2</sup> = 2 を満たす”数”<ref>大袈裟に表現すれば数学的オブジェクト(mathematical object)</ref> r があると考えた。

現代においてはよく知られているように r は無理数(実数体の元)である<ref>
現代的には r は以下のように算出できる
:r<sup>2</sup> = 1 + 1 から r<sup>2</sup> - 1 = 1
:すなわち (r - 1)(r + 1) = 1
:r -1 = 1/( r + 1 )
:r = 1 + 1/( r + 1 )
:となり、ここで関数 f(x) を
:f(x) = 1 + 1/(x + 1)
:と定義する。適当な数(ここでは 0 )に作用させてゆくと
:f( 0 ) = 2
:f( f( 0 ) ) = 1.333...
:f( f( f( 0 ) ) ) = 1.428...
:...
:と f を作用させるごとに精度が良くなる列
:0 &#x2291; f( 0 ) &#x2291; f( f( 0 ) ) &#x2291; f( f( f( 0 ) ) ) &#x2291; ... f<sup>n</sup>( 0 ) &#x2291; ...(ここで x &#x2291; y は x よりも y の方が精度が良い事を意味する)
:が作れる。r はこの数列における最も精度の良いものとなる。
</ref>
<math> \sqrt{2} </math> = 1.412... であるが、”数”とは整数の比で表されるもの(有理数)であると信じていたピタゴラスにとって、整数の比で書き表す事ができない無限の小数点展開が必要な r は”数”を意味しなかった(認識されなかった)。他方、現代においては実数体(無理数の属する領域)の概念はほとんど最初からあたえられているものであり、整数、有理数と同列に認識されているため、ピタゴラスが直面したような困難にぶつかることはほとんどないが、数の実際の計算という観点からは実数体の元(特に無理数)とは非常に観念的な性質を持つものである。

=== 非可述的プログラムの発見 ===

== 歴史 ==
表示的意味論の起源は、[[1960年代]]の[[クリストファー・ストレイチー]]や[[デイナ・スコット]]の研究である。ストレイチーやスコットが開発した本来の表示的意味論は、プログラムの表示(意味)を、入力を出力にマッピングする[[関数 (数学)|関数]]に変換するものである。後にこれはプログラムの表示(意味)を定義するには非力であることが証明され、例えば[[再帰呼び出し|再帰定義]]関数・データ構造を表現できないことが判明した。これを解決するため、スコットはより汎用的な[[領域理論]]に基づいた表示的意味論を提案した<ref name=abramsky1994>S. Abramsky and A. Jung: [http://www.cs.bham.ac.uk/~axj/pub/papers/handy1.pdf ''Domain theory'']. In S. Abramsky, D. M. Gabbay, T. S. E. Maibaum, editors, Handbook of Logic in Computer Science, vol. III. Oxford University Press, 1994. (ISBN 0-19-853762-X)</ref>。その後、研究者らは[[:en:Power domains|Power Domains]]に基づいた手法を提案し、[[並行性|並行システム]]の意味論の困難さを克服する努力をしている<ref name=Plotkin1976>Gordon Plotkin. ''A powerdomain construction'' SIAM Journal of Computing. September 1976.</ref>。


== 不動点意味論 ==
== 不動点意味論 ==
52行目: 80行目:


また、<tt>'''progression'''<sub>factorial</sub></tt> は、ω-連続である。
また、<tt>'''progression'''<sub>factorial</sub></tt> は、ω-連続である。
<!--
=== アクター意味論からのスコット連続性の導出 ===
[[アクターモデル]]は、[[カール・ヒューイット]]と Henry Baker が 1977年に提案した理論であり、[[デイナ・スコット]]の関数の表示的意味論の基盤ともなっている。


アクター <tt>f</tt> が数学的関数のように振舞うとき、<tt>'''progression'''<sub>f</sub></tt> を[[スコット連続]]関数と呼び、その極小不動点は次の通りである。

{{Indent|<tt>'''graph'''(f) <nowiki>=</nowiki> ∪<sub>i∈ω</sub> '''progression'''<sub>f</sub><sup>i</sup>({})</tt></tt>}}

ここで

:|<tt>'''progression'''<sub>f</sub>(G)≡{<x, y>|<x, y>∈'''graph'''(f) ''and'' '''immediate-descendants'''<sub>f</sub>(<x, y>)⊆G}</tt>

ヒューイットと Baker の論文には <tt>'''immediate-descendants'''<sub>f</sub></tt> の定義に小さな誤りがあったが、Will Clinger [1981] によって修正された。
-->
== 完全抽象化 ==
== 完全抽象化 ==
プログラムの表示的意味論と操作的意味論が合致するかどうかを論じる際に、完全抽象化の概念が関わってくる。完全抽象化の特徴は次の通りである。
プログラムの表示的意味論と操作的意味論が合致するかどうかを論じる際に、完全抽象化の概念が関わってくる。完全抽象化の特徴は次の通りである。
81行目: 96行目:
== 合成性 ==
== 合成性 ==
プログラミング言語の表示的意味論の重要な観点として、合成性(Compositionality)がある。合成性とは、プログラムの表示が、各部分の表示の組み合わせで構築されることを意味する。例えば、式 "<tt><expression<sub>1</sub>> + <expression<sub>2</sub>></tt>" を考えて見よう。この場合の合成性は、<tt><expression<sub>1</sub>></tt> の意味と <tt><expression<sub>2</sub>></tt> の意味から "<tt><expression<sub>1</sub>> + <expression<sub>2</sub>></tt>" の意味が導かれることを意味する。
プログラミング言語の表示的意味論の重要な観点として、合成性(Compositionality)がある。合成性とは、プログラムの表示が、各部分の表示の組み合わせで構築されることを意味する。例えば、式 "<tt><expression<sub>1</sub>> + <expression<sub>2</sub>></tt>" を考えて見よう。この場合の合成性は、<tt><expression<sub>1</sub>></tt> の意味と <tt><expression<sub>2</sub>></tt> の意味から "<tt><expression<sub>1</sub>> + <expression<sub>2</sub>></tt>" の意味が導かれることを意味する。
<!--
=== 環境 ===
[[アクターモデル]]は、プログラムの合成性を解析する汎用的な手法を提供する。その場合、各プログラムがアクターとなり、環境アクターのアドレスと共に <tt>Eval</tt> メッセージを送られる。そのため、プログラムはアクターモデルの表示的意味論を継承する([Hewitt 2006a])。環境は識別子の[[名前束縛|束縛]]を保持するものである。環境に識別子 '''x''' のアドレスと共に <tt>Lookup</tt> メッセージを送ると、語彙的に最近の '''x''' の束縛を返す。

例として、[[木構造 (データ構造)|木構造]]のデータを実装したラムダ式 <tt><L></tt> を以下に示す。このラムダ式は下位の木構造 <tt>leftSubTree</tt> と <tt>rightSubTree</tt> を引数として木構造を構築する。また、引数 message として <tt>"getLeft"</tt> が与えられると <tt>leftSubTree</tt> を返し、<tt>"getRight"</tt> が与えられると <tt>rightSubTree</tt> を返す。

λ(leftSubTree, rightSubTree)
λ(message)
''if'' (message == "getLeft") ''then'' leftSubTree
''else if'' (message == "getRight") ''then'' rightSubTree

<tt>"(<L> 1 2)"</tt> という式に対して、環境 '''E''' に <tt>Eval</tt> メッセージを送る場合を考える。この場合の意味は次のようになる。<tt><L>, 1, 2</tt> それぞれに、環境 '''E''' と共に <tt>Eval</tt> メッセージが送られる。整数 <tt>1</tt> と <tt>2</tt> は <tt>Eval</tt> メッセージに対して即座に応答し、自分自身を返す。

しかし、<tt><L><tt> に <tt>Eval</tt> メッセージを送ると[[クロージャ]]アクター(プロセス)'''C''' を生成する。'''C'''は、<tt><L></tt>のアドレス(これを「ボディ」と呼ぶ)と '''E'''(環境)のアドレスから構成される。アクター <tt>"(<L> 1 2)"</tt> は、'''C''' にメッセージ '''[1 2]'''を送る。

'''C''' はメッセージ '''[1 2]''' を受け取ると、以下のような動作をする新たな環境アクター '''F''' を生成する:
# 識別子 <tt>lefSubTree</tt> に対応する識別子に対する <tt>Lookup</tt> メッセージを受け取ると、<tt>1</tt> を返す。
# 識別子 <tt>rightSubTree</tt> に対応する識別子に対する <tt>Lookup</tt> メッセージを受け取ると、<tt>2</tt> を返す。
# 他の識別子に対応する <tt>Lookup</tt> メッセージを受け取ると、<tt>Lookup</tt> メッセージを '''E''' に転送する。

アクター(プロセス) '''C''' は、環境 '''F''' と共に <tt>Eval</tt> メッセージを以下のアクター(プロセス)に送る:

λ(message)
''if'' (message == "getLeft") ''then'' leftSubTree
''else if'' (message == "getRight") ''then'' rightSubTree

=== 算術式 ===
別のアクターの例として、式 "<tt><expression<sub>1</sub>> + <expression<sub>2</sub>></tt>" を考える。このアクターは2つのアクター(プロセス) <tt><expression<sub>1</sub>></tt> と <tt><expression<sub>2</sub>></tt> のアドレスを持つ。この複合式アクター(プロセス)が環境アクター '''E''' とカスタマー '''C''' のアドレスを伴った <tt>Eval</tt> メッセージを受け取ると、<tt>expression<sub>1</sub></tt> と <tt><expression<sub>2</sub></tt> に対して環境アクター '''E''' と新たなカスタマーアクター(プロセス) '''C<sub>0</sub>''' のアドレスを伴った <tt>Eval</tt> メッセージを送る。'''C<sub>0</sub>''' が2つの式の値 '''N<sub>1</sub>''' と '''N<sub>2</sub>''' を受け取ると、'''C''' に値 '''N<sub>1</sub>''' <tt>+</tt> '''N<sub>2</sub>''' を送る。このようにして、[[プロセス代数]]と[[アクターモデル]]は、<tt><expression<sub>1</sub>></tt> と <tt><expression<sub>2</sub>></tt> の意味から "<tt><expression<sub>1</sub>> + <expression<sub>2</sub>></tt>" の表示的意味を提供する。

=== 遅延評価 ===
遅延評価に表示的合成的意味論を提供することは、表示的意味論にとっては1つの課題である。従来からの手法では、<tt>"''delay'' <Expression>"</tt> の表示(意味)を問うことは <tt><Expression></tt> を評価することを意味論的に形式化することに他ならなかった。

[[プロセス代数]]や[[アクターモデル]]の表示的意味論は、これに以下のように完全な説明をすることができる。

*''delay''式は環境 '''E''' を伴った <Eval> メッセージに対して、ボディ <tt><Expression></tt> のアドレスと環境 '''E''' のアドレスを持つ[[クロージャ]]アクター '''C''' を生成する。
*'''C'''が '''Customer<sub>0</sub>''' を伴ったメッセージ '''M''' を受け取ると、新たなアクター(プロセス) '''Customer<sub>1</sub>''' を生成し、<tt><Expression></tt> に対して環境 '''E''' と '''Customer<sub>1</sub>''' のアドレスを伴った </tt>Eval</tt> メッセージを送る。
*'''Customer<sub>1</sub>''' が値 '''V''' を受け取ると、'''V''' に '''Customer<sub>0</sub>''' を伴ったメッセージ '''M''' を送る。

他のプログラミング言語の構成要素についても同様の方法で合成的意味論を提供することができる。

以上解説した表示的合成的意味論は汎用的であり、[[関数型言語]]、[[命令型言語]]、[[並行計算|並行型言語]]、[[論理プログラミング|論理型言語]]などに適用可能である。
-->
== 並行性の表示的意味論 ==
並行性に関する表示的意味論としては、[[プロセス代数]]に基づくものなどがある。表示的意味論の並行性への拡張は困難であることが証明されている([[無制限の非決定性]]参照)。

== 計算機科学の他の領域との関連 ==
表示的意味論は[[領域理論]]を使って型を領域と解釈する。領域理論は[[計算模型|モデル理論]]からの派生と見ることもでき、そこから[[型理論]]や[[圏論]]とも関連付けられる。計算機科学では、[[抽象解釈]]、[[形式的検証|プログラム検証]]、[[関数型言語|関数プログラミング]]と関係が深く、「モナド; Monads」の概念などとも関連がある。また、[[継続]]の概念は、歴史的には手続き型プログラムの制御フロー(goto文)の意味論を与えるために見出された<ref name="Reynolds1993">{{cite journal|first=John C.|last=Reynolds|year=1993|url=ftp://ftp.cs.cmu.edu/user/jcr/histcont.pdf|title=The discoveries of continuations|journal=[[Lisp and Symbolic Computation]]|volume=6|issue=3/4|pages=233&ndash;248|ref=harv}}</ref>。


== 脚注 ==
<references />
== 参考文献 ==
== 参考文献 ==
* {{cite book | 和書 | title=計算論理に基づく推論ソフトウェア論 | author=山崎 進 | year=2000 | publisher=コロナ社 | ref=山崎(2000) }}
<references />
* {{cite book | 和書 | author=横内寛文 | title=プログラム意味論 | year=1994 }}
* Irene Greif. ''Semantics of Communicating Parallel Professes'' MIT EECS Doctoral Dissertation. August 1975.
* {{citation | author=Dana Scott | title=Data types as lattices | year=1976 | url=http://www.cs.ox.ac.uk/files/3287/PRG05.pdf}}
* Joseph E. Stoy, ''Denotational Semantics: The Scott-Strachey Approach to Programming Language Semantics''. MIT Press, Cambridge, Massachusetts, 1977. (A classic if dated textbook.)
* {{citation | author=Dana Scott | title=Outline of a Mathematical Theory of Computation | year=1970 | url=http://port70.net/~nsz/articles/classic/scott_theory_of_computation_1970.pdf}}
<!--
* {{citation | author=Christopher Strachey | title=Fundamental Concepts in Programming Languages | year=1967 | url=http://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf}}
* Gordon Plotkin. ''A powerdomain construction'' SIAM Journal of Computing September 1976.
* {{citation | author=Dana Scott , Christopher Strachey | title=Toward a mathematical semantics for computer languages | year=1971 | url=http://ecee.colorado.edu/ecen5533/fall11/reading/PRG06.pdf}}
-->
* {{citation | author=Alfred Tarski | title=A lattice-theoretical fixpoint theorem and its applications | year=1955 | url=http://projecteuclid.org/DPubS/Repository/1.0/Disseminate?view=body&id=pdf_1&handle=euclid.pjm/1103044538 }}
* [[エドガー・ダイクストラ|Edsger Dijkstra]]. ''A Discipline of Programming'' Prentice Hall. 1976.
* {{cite book| author=Joseph E. Stoy| title=Denotational Semantics: The Scott-Strachey Approach to Programming Language Semantics|publisher=MIT Press | year=1977| }}
* Krzysztof R. Apt, J. W. de Bakker. ''Exercises in Denotational Semantics'' MFCS 1976: 1-11
* {{cite book|和書| author=ガーレット・バーコフ, ソンダース・マクレーン | title=現代代数学概論 改訂第3版 | year=1967 | publisher=白水社 }} 第IV章、XI章
* J. W. de Bakker. ''Least Fixed Points Revisited'' Theor. Comput. Sci. 2(2): 155-181 (1976)
* {{Cite book | 和書 | author=前田 周一郎 | title=束論と量子論理 | year=1980 | publisher=槙書店}}
<!--
* {{cite book | title=Lattice Theory | author=Garrett Birkhoff | year=1979 | edition=3rd }}
* [[カール・ヒューイット|Carl Hewitt]] and Henry Baker ''Actors and Continuous Functionals'' Proceeding of IFIP Working Conference on Formal Description of Programming Concepts. August 1&ndash;5, 1977.
* {{cite book | title=Universal Algebra | year=1979 | author=George Grätzer | edition=2nd }}
* Henry Baker. ''Actor Systems for Real-Time Computation'' MIT EECS Doctoral Dissertation. January 1978.
* {{cite book | title=General Lattice Theory | year=2003 | author=George Grätzer | edition=2nd }}
-->
* {{cite book | title=Lattice Theory: Foundation | year=2011 | author=George Grätzer }}
* Michael Smyth. ''Power domains'' Journal of Computer and System Sciences. 1978.
* {{cite book|和書| author=吉永 悦男 | year=1994 | title=初等解析学―実数+イプシロン・デルタ+積分 | isbn=4563002305 }}
* [[アントニー・ホーア|C.A.R. Hoare]]. ''[[Communicating Sequential Processes]]'' Communications of the ACM. August, 1978.
* {{citation| title=プログラムの表示的意味論 | author=上村 務 | year=1989 | url=http://ci.nii.ac.jp/naid/110002762191}}
* George Milne and [[ロビン・ミルナー|Robin Milner]]. ''Concurrent processes and their syntax'' JACM. April, 1979.
* {{citation | author=Bertland Russell | year=1905 | title=On Denoting | url=http://revueltaredaccion.files.wordpress.com/2012/08/russell_on_denoting.pdf }}
* Nissim Francez, [[アントニー・ホーア|C.A.R. Hoare]], Daniel Lehmann, and Willem-Paul de Roever. ''Semantics of nondeterminism, concurrency, and communication'' Journal of Computer and System Sciences. December 1979.
* {{citation | author=G. Markowsky | title=A motivation and generalization of Scott's notion of a continuous lattice | year=1981 | issue=Continuous lattices , Lect. notes in math. , 871 | publisher=Springer | pages=298–307 | url=http://www.laptop.maine.edu/ContinuousLattices.pdf}} CPO導入の経緯、[http://ci.nii.ac.jp/naid/110002719855 その解説]
* Nancy Lynch and Michael Fischer. ''On describing the behavior of distributed systems'' in Semantics of Concurrent Computation. Springer-Verlag. 1979.
* Jerald Schwartz ''Denotational semantics of parallelism'' in Semantics of Concurrent Computation. Springer-Verlag. 1979.
* William Wadge. ''An extensional treatment of dataflow deadlock'' Semantics of Concurrent Computation. Springer-Verlag. 1979.
* Ralph-Johan Back. ''Semantics of Unbounded Nondeterminism'' ICALP 1980.
* David Park. ''On the semantics of fair parallelism'' Proceedings of the Winter School on Formal Software Specification. Springer-Verlag. 1980.
* Lloyd Allison, ''A Practical Introduction to Denotational Semantics'' Cambridge University Press. 1987.
* P. America, J. de Bakker, J. N. Kok and J. Rutten. ''Denotational semantics of a parallel object-oriented language'' Information and Computation, 83(2): 152 - 205 (1989)
* David A. Schmidt, ''The Structure of Typed Programming Languages''. MIT Press, Cambridge, Massachusetts, 1994. ISBN 0-262-69171-X.
<!--
* M. Korff ''True concurrency semantics for single pushout graph transformations with applications to actor systems'' Working papers of the Int. Workshop on Information Systems - Correctness and Reusability. World Scientific. 1995.
-->
* M. Korff and L. Ribeiro ''Concurrent derivations as single pushout graph grammar processes'' Proceedings of the Joint COMPUGRAPH/SEMAGRAPH Workshop on Graph Rewriting and Computation. ENTCS Vol 2, Elsevier. 1995.
* Thati, Prasanna, Carolyn Talcott, and Gul Agha. ''Techniques for Executing and Reasoning About Specification Diagrams'' International Conference on Algebraic Methodology and Software Technology (AMAST), 2004.
* J. C. M. Baeten. [http://www.win.tue.nl/fm/0402history.pdf ''A brief history of process algebra''] Theoretical Computer Science. 2005.
* J.C.M. Baeten, T. Basten, and M.A. Reniers. ''Algebra of Communicating Processes'' Cambridge University Press. 2005.
* He Jifeng and C.A.R. Hoare. ''Linking Theories of Concurrency'' United Nations University International Institute for Software Technology UNU-IIST Report No. 328. July, 2005.
* Luca Aceto and Andrew D. Gordon (editors). ''Algebraic Process Calculi: The First Twenty Five Years and Beyond'' Process Algebra. Bertinoro, Forl`ı, Italy, August 1–5, 2005.
* Bill Roscoe. ''The Theory and Practice of Concurrency'' Prentice-Hall. 2005.
<!--
* Carl Hewitt (2006a). ''The repeated demise of logic programming and why it will be reincarnated'' What Went Wrong and Why: Lessons from AI Research and Applications. Technical Report SS-06-08. AAAI Press. March 2006.
* Carl Hewitt (2006b) [http://www.pcs.usp.br/~coin-aamas06/10_commitment-43_16pages.pdf ''What is Commitment? Physical, Organizational, and Social''] COIN@AAMAS. 2006.
-->


== 外部リンク ==
== 関連項目 ==
{{col-begin}}
* [http://www.csse.monash.edu.au/~lloyd/tilde/Semantics/ ''Denotational Semantics''] by Lloyd Allison
{{col-break}}
* [http://www.risc.uni-linz.ac.at/people/schreine/courses/densem/densem.html ''Structure of Programming Languages I: Denotational Semantics''] by Wolfgang Schreiner
* [[ピタゴラス]]
* [http://www.cis.ksu.edu/~schmidt/text/densem.html ''Denotational Semantics: A Methodology for Language Development''] by David Schmidt
* [[有理数]]
* [http://www.honors.montana.edu/~jjc/presentation/contents.xhtml Presentation] by Josh Cogliati
* [[実数]]
* [http://www.hhm.com.ar/hql.htm HQL] by H. Hernan Moraldo &ndash; 小型言語の完全な表示的意味論
* [[集積点]]
* [[コーシー列]]
* [[デデキント切断]]
{{col-break}}
* [[束 (代数学)]]
* [[順序集合]]
* [[図式スキーム]]
* [[普遍性]]
* [[モナド (プログラミング)]]
{{col-end}}


{{DEFAULTSORT:ひようしてきいみろん}}
{{DEFAULTSORT:ひようしてきいみろん}}
184行目: 143行目:
[[Category:数学に関する記事]]
[[Category:数学に関する記事]]


[[de:Denotationelle Semantik]]
[[el:Δηλωτική σημασιολογία]]
[[en:Denotational semantics]]
[[es:Semántica denotacional]]
[[es:Semántica denotacional]]
[[fr:Sémantique dénotationnelle]]
[[hr:Denotacijska semantika]]
[[it:Semantica denotazionale]]
[[pt:Semântica denotacional]]
[[zh:指称语义]]

2013年11月10日 (日) 16:07時点における版

計算機科学における表示的意味論(ひょうじてきいみろん、denotational semantics)とは、プログラミング言語に代表される形式言語の意味付け理論の一つである。意味付けを行いたい文言や構文の世界とその意味の世界を用意し、意味関数で対応付けを行うという典型的な意味付け理論の形態を取るが、再帰的定義された構文についてはその集積点にあたるものを対応付けることで意味付けを行うというところに特徴がある。

概要

導入:無理数(実数)の発見

古代ギリシャの学者ピタゴラス(Pythagoras)は正方形の対角線の長さ d とその辺の長さ s の間の比 r = d/s は方程式

d2 = (rs)2 = s2 + s2 (ピタゴラスの定理)

を満たさねばならないことを知っていた。そのためピタゴラスは r2 = 12 + 12 = 2 を満たす”数”[1] r があると考えた。

現代においてはよく知られているように r は無理数(実数体の元)である[2] = 1.412... であるが、”数”とは整数の比で表されるもの(有理数)であると信じていたピタゴラスにとって、整数の比で書き表す事ができない無限の小数点展開が必要な r は”数”を意味しなかった(認識されなかった)。他方、現代においては実数体(無理数の属する領域)の概念はほとんど最初からあたえられているものであり、整数、有理数と同列に認識されているため、ピタゴラスが直面したような困難にぶつかることはほとんどないが、数の実際の計算という観点からは実数体の元(特に無理数)とは非常に観念的な性質を持つものである。

非可述的プログラムの発見

歴史

表示的意味論の起源は、1960年代クリストファー・ストレイチーデイナ・スコットの研究である。ストレイチーやスコットが開発した本来の表示的意味論は、プログラムの表示(意味)を、入力を出力にマッピングする関数に変換するものである。後にこれはプログラムの表示(意味)を定義するには非力であることが証明され、例えば再帰定義関数・データ構造を表現できないことが判明した。これを解決するため、スコットはより汎用的な領域理論に基づいた表示的意味論を提案した[3]。その後、研究者らはPower Domainsに基づいた手法を提案し、並行システムの意味論の困難さを克服する努力をしている[4]

不動点意味論

表示的意味は、システムが行うことを表現する数学的オブジェクトを探すことに関心がある。この理論は計算の数学的領域(ドメイン)を利用する。そのような領域の例として完備半順序集合などがある。

関係 x≤y は、xy に計算的に発展する可能性があることを意味する。表示が完備半順序集合の要素ならば、例えば f≤gf が定義されている全ての値について g と等しいことを意味する。

計算領域は次のような特徴を持つ:

  1. 下限の存在: 領域には必ず で表される要素が含まれ、領域内の任意の要素 x について ⊥≤x が成り立つ。
  2. 上限の存在: 計算を続けると表示は洗練されるが、限界を持つべきである。そのため、 としたとき、上限 が存在する。これを -完全と呼ぶ。
  3. 有限要素は可算: 有向集合 A について ∨A が存在し であるとき、 であるような が存在する。そのとき、要素 x は有限であるという(領域理論的に言えば、isolated)。換言すれば、x に到達あるいは x を超えるのに有限のプロセスで可能であるなら、x は有限である。
  4. 全ての要素は有限要素の順序列の上限である: 任意の要素に有限の計算手順で到達することを意味している。
  5. 領域は downward closed である

システム S に関する数学的表示は、初期の空の表示 S から始めて、表示近似関数 progressionS を使って S の表示(意味)を構築していくことでよりよい近似を作っていくことで構築される。これは以下のように表される:

DenoteS ≡ ∨i∈ω progressionSi(⊥S).

ここで、progressionS は「単調」であるべきで、x≤y であるとき progressionS(x)≤progressionS(y) である。さらに一般化すると次のように表される。

もし ∀i∈ω xi≤xi+1 ならば progressionS(∨i∈ω xi) = ∨i∈ω progressionS(xi)

このような progressionS の特徴を ω-連続と呼ぶ。

表示的意味論では、DenoteS の方程式に従って表示(意味)を作成可能かどうかを主題とする。計算領域理論の基本的定理は、progressionS が ω-連続ならば、DenoteS が存在するというものである。

そこで、progressionS が ω-連続であることから以下が成り立つ:

progressionS(DenoteS) = DenoteS

これはつまり、DenoteSprogressionS の「不動点; fixed point」であることを意味する。

さらに、この不動点は progressionS の不動点の中で極小である。

関数型言語の表示的意味論の実例を次節に示す。

階乗関数の例

関数 factorial が以下のように定義されているとする:

factorial ≡ λ(n)if (n==0)then 1 else n*factorial(n-1)

factorialgraph とは、引数と値のペアの順序集合であり、以下のようになる:

graph(factorial) = {<n, factorial(n)>|n∈ω} = {<0,1>,<1,1>,<2,2>,<3,6>,<4,24>…}

factorial プログラムの表示(意味) Denotefactorial は、以下のように構築される:

Denotefactorial = graph(factorial) = ∪i∈ω progressionfactoriali({})

ここで

progressionfactorial(g) ≡ λ(n)if (n==0)then 1 else n*g(n-1)

ただし、progressionfactorial は不動点演算子であり、極小不動点 Denotefactorial は次のようになる:

Denotefactorial = progressionfactorial(Denotefactorial)

また、progressionfactorial は、ω-連続である。

完全抽象化

プログラムの表示的意味論と操作的意味論が合致するかどうかを論じる際に、完全抽象化の概念が関わってくる。完全抽象化の特徴は次の通りである。

  1. 抽象性: 表示的意味論は数学的構造によって形式化され、それはプログラミング言語の操作的意味論や表現とは独立している。
  2. 正当性: 観測される動作が異なるプログラムは表示も異なる。
  3. 完全性: 表示が異なるプログラムは観測される動作も異ならなければならない。

その他に表示的意味論と操作的意味論について保持するのが望ましい特徴は以下の通りである。

  1. 構築可能性: 意味モデルは、直観的に構成可能な要素のみから構築可能であるべきである。形式的に表現すれば、全要素は有限要素の有向集合の上限でなければならない。
  2. 進歩性: 各システム S について、その意味論には progressionS 関数が存在する。システム S の表示(意味)は、i∈ωprogressionSi(⊥S) であり、Ss の初期構成である。
  3. 完全抽象性: 意味モデルのあらゆる射はプログラムの表示であるべきである。

表示的意味論での長年の懸案は、再帰データ型のある場合の完全抽象化であった。特に再帰に利用可能な自然数型である。この問題は従来、PCF(Programming language for Computable Functions)システムの意味論の構築の問題として捉えられてきた。1990年代ゲーム意味論によって PCF の完全抽象モデルが構築され、表示的意味論の手法に根本的な変化をもたらした。

合成性

プログラミング言語の表示的意味論の重要な観点として、合成性(Compositionality)がある。合成性とは、プログラムの表示が、各部分の表示の組み合わせで構築されることを意味する。例えば、式 "<expression1> + <expression2>" を考えて見よう。この場合の合成性は、<expression1> の意味と <expression2> の意味から "<expression1> + <expression2>" の意味が導かれることを意味する。

脚注

  1. ^ 大袈裟に表現すれば数学的オブジェクト(mathematical object)
  2. ^ 現代的には r は以下のように算出できる
    r2 = 1 + 1 から r2 - 1 = 1
    すなわち (r - 1)(r + 1) = 1
    r -1 = 1/( r + 1 )
    r = 1 + 1/( r + 1 )
    となり、ここで関数 f(x) を
    f(x) = 1 + 1/(x + 1)
    と定義する。適当な数(ここでは 0 )に作用させてゆくと
    f( 0 ) = 2
    f( f( 0 ) ) = 1.333...
    f( f( f( 0 ) ) ) = 1.428...
    ...
    と f を作用させるごとに精度が良くなる列
    0 ⊑ f( 0 ) ⊑ f( f( 0 ) ) ⊑ f( f( f( 0 ) ) ) ⊑ ... fn( 0 ) ⊑ ...(ここで x ⊑ y は x よりも y の方が精度が良い事を意味する)
    が作れる。r はこの数列における最も精度の良いものとなる。
  3. ^ S. Abramsky and A. Jung: Domain theory. In S. Abramsky, D. M. Gabbay, T. S. E. Maibaum, editors, Handbook of Logic in Computer Science, vol. III. Oxford University Press, 1994. (ISBN 0-19-853762-X)
  4. ^ Gordon Plotkin. A powerdomain construction SIAM Journal of Computing. September 1976.

参考文献

関連項目