7

Prolog (ロジックでのプログラミング) は true と false を返すことがすべてであり、関数はリストから数値、ブール値まで何でも返すものであることを私は知っています。最初は、Prolog には関数の概念がないように見えますが、代わりに統合に依存していますが、次のようなことができます。

?- X is log(42).
X = 3.7376696182833684.

それで、機能が存在するようですか?それとも、これは本当に統一部分を隠しているある種の構文糖衣ですか?

そして、それが本当に単なる構文糖衣である場合、log2 のような数学的「関数」を定義したい場合、どうすればよいでしょうか?

もちろん、統合を使用できます。

log2(X,Result) :- Result is log(X)/log(2).

しかし、「構文糖関数スタイル」を使用したいので、次のように記述できます。

?- X is log2(8).
X = 3.0.

Prologでそれを行うにはどうすればよいですか?

4

2 に答える 2

8

プロローグは、エンティティ間の関係を記述することです。数学関数は特別な種類の関係 (入力を一意に定義された出力に関連付ける) であるため、Prolog を使用してそのような関数を記述することができます。あなたの例では、この関係を実装する述語は と呼ばれis/2(is)/2Prolog では中置演算子としても定義されているため、次のように書くことができます。

?- X is log(42).

接頭辞形式の代わりに (もちろん、これも許容されます):

?- is(X, log(42)).

is/2は式の算術評価を実行し、最初の引数を結果と統合することに注意してください。XこれはProlog 用語との統合とは異なりlog(42)ます。

ただし、これis/2は真の関係ではないことに注意してください。逆方向には使用できないためです。

?- 0 is log(X).
ERROR: is/2: Arguments are not sufficiently instantiated

これに対する解決策は、すべての方向で機能する制約(たとえば、CLP(R) と呼ばれる実数に対して) を使用することです。これらは、多くの最新の Prolog システムでライブラリまたは組み込みとして利用できます。

于 2013-08-24T15:35:32.423 に答える