- 上記の述語は/ 3は本当に純粋ですか?
これは幾分奇妙な動作をします:時には算術式を受け入れることがあります。
?- plus(3,5-3,5).
true ...
?- plus(3,2,3+2).
false.
?- plus(3,2,3+b).
ERROR: </2: Arithmetic: `b/0' is not a function
?- plus(3,2,3+Z).
ERROR: </2: Arguments are not sufficiently instantiated
私はむしろのような場合のためnat/1
の非効率性を懸念し、次のようになります:全ての引数が評価されているが、これはそう
?- time((nat(X), X > 9999)).
% 50,025,002 inferences, 27.004 CPU in 27.107 seconds (100% CPU, 1852480 Lips)
X = 10000 ;
% 10,006 inferences, 0.015 CPU in 0.015 seconds (99% CPU, 650837 Lips)
X = 10001 ;
% 10,005 inferences, 0.016 CPU in 0.016 seconds (99% CPU, 631190 Lips)
X = 10002 ...
、それはあなたの定義が純粋であるように私には見えます。しかし、このようなプログラミングスタイルは、このプロパティを保証することを非常に困難にしています。最小限の変更は悲惨な影響を与えます。
一般に
<オール=「2」を起動>、どのように特定の関係が論理的純度を有することを証明することができますか?
最も簡単な方法は建設によるものです。つまり、純粋な単調なビルディングブロックのみを使用します。つまり、Prologは組み込み関数がなく、通常の目的との結合と不一致のみを使用します。この方法で構築されたプログラムは純粋で単調なものになります。 次に、またはerror
に設定されたPrologフラグの発生チェックでこのプログラムを実行します。
(=)/2
とdif/2
のような純粋なビルトインに追加します。
純粋なリレーションをエミュレートしようとするこの組み込み関数に追加し、純粋なリレーションをエミュレートできないときにインスタンス化エラーを生成します。 (is)/2
と算術比較述語を考えてみましょう。これらのうちのいくつかは、call/N
のような境界線上にあり、いくつかの不潔な述語を呼び出すことがあります。
はtrue
に設定されたフラグclpfd_monotonic
とlibrary(clpfd)
を追加します。
多くの構成要素は、ある用途では純粋で純粋ですが、他の構成要素には不都合です。算術比較のために完璧であるされたif-then-elseを考える:
..., (X > Y -> ... ; ...), ...
が、使用することができます
..., (X = Y -> ... ; ...), ... % impure
遺骨が不純されているどのような組み込み関数のような純粋な目的と一緒に動作しません。純粋な振る舞いをする述語を構成する。しかしそのような定義はもはや純粋ではない。
例として、本当に緑色のカットを考えてみましょう。これらは非常にまれであり、ここではまれです。 thisおよびthatを参照してください。
純粋な関係を提供するために、他の一般的なパターンのような条件文です:
..., (var(V) -> something with var ; the equivalent with nonvar), ...
そしてきれいにカバーされていない場合を防ぐために、エラーがスローされることがあります。
勇敢な質問 - > +1! – mat
[赤と緑のカットの違い](http://stackoverflow.com/a/26483422/801553)は何らかの形でこれに関連しています。 –
グリーンカットはプログラムの出力を変更しません。彼らは行方不明になる可能性があり、解決策は同じになります。私は赤いカット(質問のようなもの)を使用するプログラムについて話しています。 –