ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3972751 Prologに関する質問
質問者:garusu いま, Prologで再帰プログラムなどを組んでるんですが先生に「Prologはアルゴリズムの勉強になるから他の言語になっても無駄が省けますよ」と言われました。私は, 非手続きか手続き言語かの違いしかわからないのですが実際のところこれは事実なのでしょうか?
困り度:
  • すぐに回答を!
質問投稿日時:
08/04/24 16:07
この質問に対する回答は締め切られました。
最新から表示回答順に表示

回答

ANo.4 僕も最近Prologで遊んでました(笑)。んで、まあ、感想等を。

多分「計算量」とは言っても言語が裏で実際に行ってる計算量の事の事なんじゃなくって「計算の為の記述」の量、って事じゃないんでしょうか?僕も触った感じ、そんな気がしました。かなり抽象度が高い言語ですね。
実は、「アルゴリズム"だけを"を書く」事を考えた場合、通常の手続き型言語なんかは「作法」と言うか「そのプログラミング言語特有の」書式が邪魔になると言うか、「余計な記述量が増える」んです。そっち側に手間取る。
例えばC言語だったら#include...みたいな「オマジナイ」とか、ですよね。本質的にはそう言う「お約束」はアルゴリズム自体には何も関係なかったりして。
一方、Prologは、例えば数学的な意味でのアルゴリズム(数式)に殆ど1対1で対応しているような感じです。Haskellもそんな感じですが、Prologはもっと凄いですね(笑)。何せ、数学的に考えられるだけの「条件を列挙していけば良い」って言う愚直な感じなんで。関数型言語も記述能力自体は高いですが、それ以上だよな、とは思いました。「それ以上」が必要か否かは好みの問題になってくるでしょうが。
まあ、いずれにせよ、確かにそう言う意味ではPrologを使うと「アルゴリズム記述だけに」集中出来るのは事実だと思います。バカみたいに直球勝負だよな、って印象です(笑)。

その先生がそう言う意味で仰ってたのかどうかは分かりませんが、一応参考までに。
回答者:cametan_42
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/04/26 00:01
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.3 計算量の無駄ですか…

んー、どうでしょう?一般には、Prologで書くのは計算量的に有利には働かないと思います。なので、他の言語ではPrologより無駄を省いたプログラムが書ける、ってことなのか…?
先生のお話を詳しく聞いてみないと、真意を掴みかねます。
回答者:ken-etsu
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/04/25 15:01
この回答への補足#2の回答者さんを参考にして考えるとPrologでゴリゴリとアルゴリズムを書く→手続き型言語になったときに無駄にfor文を書いたり, 無駄に再帰させたりすることを防げるということだと思います。

劇的に計算量はかわりませんが無駄な行を減らせるという点では有益なのでは?
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.2 まちがってはないし,Prologのような古典的な言語は
アルゴリズムの勉強にはいいのかもしれません.

けど,それをいうなら
Lisp(Common LispとかScheme)もそうだし,
新しいけどHaskellなんかもいいとおもう.
Prologも含めてこいつらは癖があるけども
アルゴリズムを直接ごりごり書くのが比較的容易.
関数型言語というか
「宣言型」のプログラムが容易な言語は
アルゴリズムを書きやすい傾向があると思う.
一個だけじゃなくって,複数の言語で
同じことをさせてみると結構勉強になりますよ.

「無駄な計算量が省けるか否か」は
アルゴリズムそのものの計算量の問題もあるし,
どんな言語だって
「無駄な計算を紛れ込ませてしまう」ことは
よくあることです.
回答者:kabaokaba
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/04/24 22:05
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.1 あなたの先生の言うことは間違ってはいないと思います。

まあ、「無駄が省けますよ」ってのは本意が解りませんが、いろんなタイプの言語に触れるのは、視野が広がりますし、悪いことではありません。
回答者:ken-etsu
種類:回答
どんな人:経験者
自信:自信あり
回答日時:
08/04/24 17:15
この回答への補足補足です

無駄は無駄な計算量だそうです。
この回答へのお礼この回答にお礼をつける(質問者のみ)
最新から表示回答順に表示