プログラマをやっています
プログラミング言語を見ていくと
・アセンブラ→C言語→Javaの流れ
チューリングマシンから、よく使うものを文法として括り出してきた
・Lisp
ラムダ算法をプログラミング言語に落とし込んだ
・Prlog
述語論理をプログラミング言語に落としこんさ
という風に、それぞれ元になっているモデルが違いますが
それぞれが万能な記述形態で、どんな計算でも出来る記述携帯になっています
それで疑問に思ったのですが
他にも万能な記述形態として知られている算法というのは他に何種類あるのでしょうか?
大学の初等数学までしか知らない人間レベルで分かる解説サイトなどもあれば教えて下さい
No.2ベストアンサー
- 回答日時:
「プログラムの意味論(semantics)」という(ちょっと難しい)分野の話です.というのは,万能性を証明するとは「あるプログラムがチューリングマシンのシミュレータになっていること」あるいは「任意の帰納的関数を表現できるプログラムが存在すること」を証明することに他ならない.だから,プログラムの意味を記述する必要があるわけです.
プログラミング言語との関連で言えば,計算機のハードウエアなんてものは忘れて,計算を,ある抽象的な数学的システムの上でのプロセスと考える.(なのでハードウエアのアーキテクチャをムキダシで扱うアセンブラやCのような低級言語はちょっと脇に置いときます.)その「抽象的な数学的システム」の捉え方がいろいろある,という話かと思います.
ご質問で例に挙げられたのは,計算(プログラムの実行)を,変換の手順(手続き)の遂行と見るか,写像の不動点へ近づく過程と見るか,論理式が恒偽式であることの証明を自動生成することと見るか,ということでしょう.
●手続き:メモリやレジスタの中身を書き換えていくという操作,および,ある計算システムの出力を別の計算システムに入力として与える,という結合.
●証明:一階述語論理は証明が可能.導出原理を使えば機械的に行えますが,場合分けが猛烈に沢山発生して遅い.そこでprologでは導出原理を線形導出の一種に限定して,計算を「反例を探すプロセス」とみなす.(万能性の観点からは,カット演算は本質的ではありません.)
●不動点: 関数の引数に値を代入(λ計算)する,という操作を繰り返すことで,その関数の不動点に到達する.ループを使わずrecursionで計算を行うという場合だけでなく,ループを一つの関数と捉える方法(たとえばHoare論理におけるinvariant assertion)もあります.
いずれも「状態」を1ステップずつ変化させていくプロセスであることには違いがありません.そしていずれも,個別の1ステップにばかり注目するのではなくて,一連のステップ全体がどういう性質を持つかをまとめて扱うための仕掛けを持っている.
ただ,そのまとめ方にバリエーションがあるということですね.効率(計算量)の話は無視して万能性についてだけ見ますと:
●手続き: 「ある計算システム(subprogram)の入出力の関係」さえ分かれば,その内部はどうでもいい.
●証明: ある論理式が真か偽かということが分かれば,以後,その証明のプロセスの詳細はどうでもいい.
●不動点:ある関数の,不動点という行き着く先が分かっていれば,そこにどういう経路で到達するはどうでもいい.
こうした仕組みを使うことで,細部をブラックボックス化し,プログラム全体の意味をひとまとめにした論理式を機械的に構築できるようになる.
なお,個別のプログラムについて具体的にこの構築をやるのは「プログラムの正当性の検証(verification)」という分野の話です.これを言語に組み込んだのはEuclidなど.Javaにもその一部(assertion文)が入っていますね.
ようやくご質問の「他に何種類」という話ですが,いや,分かりません.てか,何かテキトーな数学の概念、あるいはゲームなどにこじつけてプログラミング言語(と、その意味論)を作れば,バリエーションはいろいろ出来る気がします.で,なんでそんな気がするのかは,以上の話でナントナク感じ取れていただけたのではないかと.
なお,現実のプログラミングでは万能性なんかより性能が問題になるわけで,「計算量の理論」は(かなり難しいけれど)勉強してみる値打ちがあります.具体的な性能の話では「計算幾何学(計算機科学じゃないです)」が大いに参考になるでしょう.あるいは逆に,計算というものを,万能性に拘らずにもっと緩やかに捉えることができるアプローチとして,たとえば(めっちゃ難しいけれど)「情報幾何学」なんてのもあります.
どうもです、数学レベルで考えると、最初に論理的なモデルありき!という感じなのは分かりますのが
いざ自分で論理モデルを作った後「これって万能な記述形態に出来るんだろうか?」と疑問に感じると、それを確定させられるまでが私のオツムでは難しい!
ただ、万能な記述形態の可能性は案外広いのですね。
あとは何をするのに一番完結かを考えればいいだけの様に見えます
正直、Prolog以上に計算機のパワーの無駄遣いできるモデルってそうそう思いつかないので、普通に考えれば結構遊べそうですね。
ただ、先人の考えた万能な記述形態って他にあればよかったかなぁ…
No.3
- 回答日時:
自分もプログラマーやってます。
答えではありません・・・感想のような、コメントのような・・・。じっさいにApplication開発をやっていると、言語モデルより開発モデルの方へ目が行ってしまって、言語モデルなんか余り意識していません。まぁ~、ふだん使ってる言語はどれも、通常の要求に対しては普遍解法があるものだと信じて、プログラムを書いてる訳です(そうでないと書く気にならない(^^))。
それで思ったのですが、この質問の動機はどういったものなのでしょう?。緊急度「緑」なので、たんなる興味かも知れませんが、同じ職業をやってる方が、自分がふだん意識しないところに興味を持たれたという事で、逆にその理由にとても惹かれました。よければ教えて下さい。
で、これだけではルール違反なので、関連ありそうな書籍を上げます。
(1)知の限界,G・J・チャイティン,(株)エスアイピーアクセス,2001年.
チューリングマシン→ラムダ計算→不完全性定理、という流れの本です。まぁ、この手の本としては普通の値段で薄いです。中に上記の流れに関する、Lispコードが随所に現れ、Lispに慣れてない自分は「頭痛かった」ですが、Lispに慣れてるなら、すらすら読める気がします。
(2)コンピュータプログラミングの概念・技法・モデル,ピーター・ヴァン・ロイ他,(株)エスアイピーアクセス,2007年.
お高いです。分厚いです。大学の図書館なんかで探すべき本です。実用とかコード書き訓練ではなく、学問としてのプログラミング学を記述した、本邦初公開の成書と思われます。記述の基礎は、チューリングマシンにあるようですが、話はグラフィカル・インターフェイスの範疇にまで及びます。高くて分厚いので、自分は当然読んでません。
以下、余談です。
自分の常備品は、VB(Rapidなので),VC(VBのパワー補完),VF(Visual Fortran,計算腕力)なのですが、公理的集合論を読んだ時に、次のような事を思いました。集合論の前段には、第1階述語論理(命題理論含む)を一通りやります。
・命題理論の組み込み型→関係式と対象式.
・命題理論の補助仮定の方法→サブルーティン・コール.
・命題理論の補助定数の方法→サブルーティンのLocal変数(スタック上).
・命題理論における定義→整数型,文字列型とかの組込型の定義、またはClass定義の型定義と同じ.
・述語理論の量化子「∃」→領域(メモリ)確保=変数宣言→集合の存在.
・述語理論の量化子「∀」→プログラミング言語にはないので、手続き処理する→じつは「∃」による「∀」の定義と同じ.
・超限帰納法→メモリ制限なしの再帰手続き.
・・・などなどです。自分はいちおう公理的集合論を理解してると(勝手に)思ってますが、そのとき役に立った(と思える)のが、上記のようなプログラミング言語の構造との対応付けでした。
・・・という訳で、あくまで、感想のような・・・コメントのような・・・(^^;)。
この回答への補足
ドウモ、ご回答ありがとうございます
ひとことで言うと、プログラミング言語が好き♪
だからでしょうね…。
Rubyのように文学性の高い言語や、haskellの様に論理性の高い言語など
言語を取り替えながら理解を深めていくと、自分の頭の引き出しが拡張されていく感覚がしたり、これらの本当の共通項はなんなのだろう…
と感じたりするのが楽しいからですね
問題は、それを実業務に持ち込むとコードが黒魔術化することですが…
あ、すいません回答になっていなかったですね
全く新しいパラダイムの言語を触ると、自分の考え方の引き出しが広がる感覚があるので、まだあるならそれを自分でまた体験したいから
ですかね…
No.1
- 回答日時:
とりあえず C や Java はチューリングマシンからもっていくより RAM からもっていったほうが簡単だと思うし, Prolog はもともと 1階述語論理でしかもホーン節しか使えないので「カットがすべて」のような気がする.
あと, D∞ とか組み合わせ論理は思いつく. ほかにもありそうだけど....
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アナログコンピューターとデジ...
-
コンピューター世界ランキング
-
0.5時間などの時間計算の方法
-
付き合った日を1日から数える...
-
1000分の3は何%ですか
-
1000円の3割の計算教えて下さい
-
logeの計算
-
126円の1.4倍はなんですか? 計...
-
1/2÷1/2はなぜ1になるのか?
-
【Excel】 SUMPRODUCT関数の高速化
-
10の0.3乗って??
-
中学理科の計算問題についてで...
-
1000分の10の計算の仕方を教え...
-
土嚢1体で何m3入りますか?
-
小数第一位までのときは、第二...
-
化学です。 ある問題で無理数√3...
-
1日目に1円 二日目に2円 三日目...
-
1÷0の答えを教えて下さい
-
【高校化学】有効数字の指定が...
-
WEBのようにスクロールすると付...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
量子コンピュータとか、量子コ...
-
計算方法について:人数の違うチ...
-
チューリングマシンとオートマ...
-
パソコンをつなげて高性能化?
-
サーバーのアクセス数と負荷に...
-
類似度 ユークリッド距離とコサ...
-
アナログコンピューターとデジ...
-
NPC概念の意義の問題点について
-
mathematicaに関する質問 Sumに...
-
計算機科学は具体的に何を研究...
-
次期指導要領でも役に立つ数学...
-
6-7高校数学
-
物理乱数と真性乱数の違いは何...
-
コンピューター世界ランキング
-
二位じゃダメなんですかのコン...
-
スーパーコンピュータの性能に...
-
最近富岳が運用開始されました...
-
すばやく素因数分解する方法は?
-
チューリングマシンについて
-
量子コンピューター
おすすめ情報