0

2 つの値を比較し、結果を参照可能な変数として返す述語 (明らかに不必要ですが、例です) を書きたいとします。次のようになります。

compare(Value1, Value2, Result) :- 
    Result is Value1 > Value2.

しかし、Swishではエラーが発生します。

src:2: Syntax error: Operator priority clash
compare/3: Domain error: `order' expected, found `'5''

Result取得した後、その値を別の述語でどのように使用しますか? 次のように言えますか?

compare(5, 2, Result),
Result.

それとも、Prolog の哲学を完全に誤解していますか?

4

1 に答える 1

0

表面的には、これは演算子の優先順位の問題です: これはコンパイルされます

compare(Value1, Value2, R) :- R is (Value1 > Value2).

しかし、それは実行されません:

?- compare(1,3,X).
ERROR: compare/3: Type error: `atom' expected, found `1' (an integer)

ビルトインと衝突します。compare /3 を参照してください。SWI-Prolog では redefine_system_predicate / 1 ディレクティブが役立つ可能性がありますが、回避することをお勧めします。

is /2 は小さな (?) 関数サブ言語を実装する述語で、右側の算術式を評価しますが、> /2 は両側を評価した後に比較を実装します。私が意味したのは:

..., A > B, ...

それは真か偽かのどちらかであり、数値は得られません...

多分あなたがしたい

my_compare(A,B,C) :- A > B -> C = 1 ; A < B -> C = -1 ; C = 0.

編集

比較値を格納する方法を説明する必要があると思います。結果をインスタンス化して後で呼び出すだけです。

my_compare(A,B,C) :- A > B -> C = true ; C = false.

それから

?- my_compare(1,3,R), (R -> writeln('comparison succeeded') ; writeln('comparison failed')).
于 2015-09-16T03:50:59.850 に答える