2013-03-29 11 views
5

良いプロローグを書くために習得しなければならない設計ヒューリスティックは何ですか?私はPrologに熟達するには2年ほど経験豊富なプログラマーが必要だと聞きました。効果的に再帰を使用することもできますが、それは比較的小さなハードルのようです。プログラマーに大きなトラブルを与えるのはどういうことでしょうか?品質を判断するためにサンプルコードで何を探していますか?良いPrologコードの特徴は?

+6

2年間(この勧告を参照)(http://norvig.com/21-days.html) - それはPrologについてさえありません! – false

答えて

18

良いPrologコードを書く上での大きな困難は、理解だけでなく、プログラムの意図や目的を適切に伝達することにあります。他のプログラミング言語とは対照的に、同じプログラム内には、いくつかの全く異なるPrologコードが存在することがよくあります。このようなレベルを混乱させると、バグや問題が発生します。

純粋な単調なコード。 このコードはPrologの中心にあります。そのようなコードでは、多くの代数的性質が成立し、実際の問題はPrologがしばしば宣伝する純粋で理想的な方法で記述されます。しかし、そのような部分でさえ、ある種の手続き的性質(例えば、非終了)が現れ得る。例として、共通のcommutativityを取る。純粋な単調なコードでは、(A, B)(B, A)は同じ関係を表します。唯一の違いは、異なる終了動作と、回答の出現順序にある​​場合があります。理想的には、純粋な述語の名前は述語が関係であることを伝えます。必須事項は間違いなく良い選択です。

副作用コード。 もう1つの極端な点は、機械または心のどちらかで効果的に実行することによってのみ理解できるコードです。プログラムには単純な不変量はありません。しかし、そのような部分でさえ、不変の堅牢性のような一定の特性が観察されることがあります。効果的にそのようなコードは他のプログラミング言語とあまり変わりません。

多くの場合、副作用部分は純粋な側面を「食いつぶす」ため、プログラマは命令的なコマンド指向の習慣に慣れています。他の方向に傾けるには、あなたが失うか、得るべき財産を考えてください。あなたのプログラムをテストすることがどれほど簡単かを考えてください:より純粋なプログラムほど、余分なサンドボックスなしでテストするのが簡単です。シンプルなトップレベルクエリで十分です。

それとも単にthese answers:純粋側は一見必要な副作用を犠牲にして拡張することができますか

いくつかの例では、。

編集:あなたのコメントで、あなたは「学習のアドバイス」を求めます。したがって、ここにいくつかあります:

  1. 純粋な単調なコードだけを書いてください。もしあなたが両方を知っていれば、あなたはどちらか一方の側を選択すると判断できます。私はいくつかのコマンド指向言語で副作用を起こしていた経験があると思いますが、純粋なコードはありません。結果として、これは本質的に単調でないコードを書かないようにすることを意味します。

  2. トップレベルでプレイします。あなたのプログラムにアクセスするにはトップレベルが唯一の方法だと想像してください。どのようにこの形式に適合するような問題を定式化しますか? SWIトップレベルは、そのような軽量の相互作用を可能にするように特別に設計されています。

  3. を演算処理に使用してください。 (is)/2を使用しないと、コードがあまりにも改造されてしまいます。

  4. 純粋な単調なコードの代数的性質をお楽しみください。考えてみましょう:どこにいても目標を追加しても、この目標がプログラムを特化すると予測できます(せいぜいそのまま)。あなたは盲目的に目標を取り除くことができますが、その効果はまだ分かります。

  5. ノンターミネーションをマスターするためのという概念を検討してください。

  6. 多くのプロローグで提供されているため、ステップバイステップのトレーサ/デバッガは使用しないでください。それは、Prologが取る正確なステップだけを示しています。プログラムの意味に直接関係するものは表示されません。それは、ステップバイステップの考え方を強化します。

  7. あなたの言語を見てください。あなたがプログラムについて話す方法は、あなたがそれについて考える方法に影響を与えます。したがって、多くの操作言語(例:これはこれなど)を使用すると、コマンド指向のビューを強化する可能性があります。物事について話すきれいな方法がありますが、それを見つける必要があります。これはおそらく最も難しい部分です。

+0

主な難しさは、特定のサブ問題に対してPrologを命令的または宣言的に使用する時期を知っていることですか?私は、その知識が特定のシステムや特定の問題に関する多くの経験から来ることを期待しています。だから、あなたは学習のための一般的なアドバイスをあげることができなかったと思います。 – user287424

+2

@ user287424:私は、どのくらいの財産を失うか、得るかという質問を提案しました。どのようにコードをテストするのが簡単ですか?それもあなたのために答えることは可能ですが、詳細に検討するには時間がかかるでしょう。経験はこれを確かに簡単かつ迅速にしますが、これで始めることができます。 – false

+0

@ j4nbur53単調性と不変性は必ずしも関連していません。例として 'append/3'の第一引数を取ってみましょう。これは不動ではありませんが、定義は単調です。 – false

関連する問題