13

OK、これは非常に一般的な質問であり、この件に関していくつかの論文が書かれていることは知っていますが、これらの出版物は非常に基本的な資料をカバーしていると感じており、スタイルと効率を改善するより高度なものを探しています. これは私が紙に持っているものです:

  • 「調査レポート AI-1989-08 効率的なプロローグ: 実践ガイド」Michael A. Covington 著、1989 年
  • 「効率的なプロローグ プログラミング」Timo Knuutila 著、1992 年
  • Covington、Bagnara、O'Keefe、Wielemaker、Price、2011 による「Prolog のコーディング ガイドライン」

これらでカバーされる主題の例: 末尾再帰と微分リスト、インデックスの適切な使用、カットの適切な使用、アサートとリトラクトの回避、CONS の回避、コード形式のガイドライン (インデント、if-then-elses など)、命名規則、コードの文書化、引数の順序、テスト。

Prolog でのあなた自身の個人的な経験から、ここに何を追加しますか? CLP プログラミングにのみ適用される特別なスタイル ガイドラインはありますか? 一般的な効率の問題とその対処方法を知っていますか?

アップデート:

いくつかの興味深い (ただし、私にとってはあまりにも基本的で一般的すぎる) ポイントを以下に示します: Lifeware Team の Prolog プログラミング ガイドライン

問題全体を強調するために、「Prolog のコーディング ガイドライン」(Covington et al.) を引用したいと思います。

私たちの知る限り、Prolog のコーディング ガイドラインの首尾一貫した完全なセットは公開されていません。さらに、公開された Prolog プログラムのコーパスを見ると、事実上の標準が出現していません。この明らかな欠落の背後にある最も重要な理由は、包括的な言語標準がないため、小規模な Prolog コミュニティが、個々の Prolog システムを中心とするサブコミュニティにさらに細分化されており、いずれも支配的な地位を占めていないことです。

4

1 に答える 1

13

Prolog でクリーンなインターフェイスを設計するには、Prolog 標準を読むことをお勧めします。 を参照してください。

特に、組み込みの述語がどのように成文化されるかという特定のフォーマットには、特定のスタイルのドキュメンテーションだけでなく、エラーの通知方法も含まれます。8.1 ISO/IEC 13211-1:1995の組み込み述語定義の形式を参照してください。このスタイルの定義は、Cor.2および Prolog prologueでオンラインで見つけることができます。

ISOエラー信号規則に完全に従う(そして標準化されていない)ライブラリの非常に良い例は、library(clpfd)SICStusおよびSWIでの実装です。どちらの実装もアプローチが根本的に異なりますが、エラー規則を最大限に活用しています。

ISOに戻ります。これは、組み込み述語の ISO の形式です。

xyz 名前/アリティ

最初に、任意の短い非公式の発言がある場合があります。

xyz1 説明

後で参照できるように、説明的な変数名を使用して最も一般的な目標から始まる宣言的な記述が与えられます。述語の意味がまったく宣言的でない場合は、「真である」と述べられるか、「統合する」、「組み立てる」などの不要な操作語が使用されます。例を挙げましょう:

8.5.4 copy_term/2

8.5.4.1 説明

copy_term(Term_1, Term_2)の名前が​​変更されたコピー (7.1.6.2) でTerm_2ある用語と統一する場合は真です。TTerm_1

したがって、これは大きな赤い警告サインです。この述語が関係であると考えてはいけません。手続き的にしか理解できません。さらに、2 番目の引数で定義が不変であることを (暗黙のうちに) 述べています。

別の例: sort/2. これは今関係ですか?

8.4.3 並べ替え/2

8.4.3.1 説明

sort(List, Sorted)(7.1.6.5)Sortedのソートされたリストと統合する場合は true です。List

というわけで、やはり関係なし。驚いた?8.4.3.4 の例を見てください:

8.4.3.4 例

...

sort([X, 1], [1, 1]).
   Succeeds, unifying X with 1.

sort([1, 1], [1, 1]).
   Fails.

必要に応じて、「手続き的に」で始まる別の手続きの説明が追加されます。ここでも、エラーはまったくカバーされません。これは、標準記述の大きな利点の 1 つです。エラーはすべて「実行」から分離されているため、プログラマー (= 組み込みのユーザー) がエラーをより体系的に把握するのに役立ちます。公平を期すために、手動でケースバイケースで最適化したい実装者の負担がわずかに増加します。このように最適化されたコードは、いずれにせよ、微妙なエラーが発生しやすいことがよくあります。

xyz2 テンプレートとモード

ここでは、引数のモードと型を 1 行または 2 行で包括的に指定します。この表記法は、1978 年のDECsystem-10 モード宣言に由来する他の表記法と非常によく似ています。

8.5.2.2 テンプレートとモード

arg(+integer, +compound_term, ?term)

ただし、ISO のアプローチと Covington らのガイドラインとの間には大きな違いがあります。Covington らの非公式な性質のものであり、プログラマが述語をどのように使用すべきかを述べているものです。ISO のアプローチは、ビルトインがどのように動作するか、特にどのエラーが予想されるかを説明しています。(上記に続く 4 つのエラーに加えて、上記の仕様からは確認できない 1 つの余分なエラーがあります。以下を参照してください)。

xyz3 エラー

すべてのエラー条件は、アルファベット順に番号が付けられた独自の節に記載されています。7.12 エラーのコーデックス:

複数のエラー条件が満たされた場合、Prolog プロセッサによって報告されるエラーは実装に依存します。

つまり、各エラー条件には、それが適用されるすべての前提条件が記載されている必要があります。それらのすべて。エラー条件は、if-then-elsif-then... のようには読み取られません。

また、適切なエラー条件を見つけるためにコード作成者が特別な努力をしなければならないことも意味します。これはすべて、実際のユーザー プログラマーにとっては有利なことですが、コード作成者と実装者にとっては確かに多少の苦痛です。

多くのエラー条件は、 8.1.3 エラーの注記および7.12.2エラー分類(概要)に従って、 xyz2で指定された仕様に直接従います。組み込みの predicateの場合、エラー a、b、c、d が仕様に続きます。エラー e のみが続きません。arg/3

8.5.2.3 エラー

a)Nは変数
instantiation_errorです。

b)Termは変数
instantiation_errorです。

c)N変数でも整数でもない
type_error(integer, N).

d)Term変数でも複合項でもない
type_error(compound, Term).

e)Nゼロ未満の整数
ですdomain_error(not_less_than_zero, N)

xyz4 の例

(オプション)。

xyz5 ブートストラップされた組み込み述語

(オプション)。非常に似ている他の述語を定義し、「ブートストラップ」することができます。

于 2014-04-26T15:30:39.297 に答える