28

私は私が初めてであるいくつかのプロローグに取り組んでいます。

「または」演算子を探しています

registered(X, Y), Y=ct101, Y=ct102, Y=ct103.

これが私の質問です。私が書きたいのは、次のようなコードです。

「Yが値ZOR値QOR値Pに等しい場合、Xを返します」

ただし、Yが3つすべてに等しい場合は、Xを返すように求めています。ここのor演算子は何ですか?ありますか?

4

2 に答える 2

36

ちょうど別の視点。Prolog で「or」を実行するには、「分離」演算子またはセミコロンを使用することもできます。

registered(X, Y) :-
    X = ct101; X = ct102; X = ct103.

より完全な説明については:

Prolog での述語制御

于 2012-11-23T08:16:56.543 に答える
20

Yこの方法で代替バインディングを「呼び出す」ことができます。

...registered(X, Y), (Y=ct101; Y=ct102; Y=ct103).

正しい実行制御フローを維持するには、括弧が必要であることに注意してください。/2は;一般or演算子です。使用が制限されている場合は、より慣用的なものを選択することもできます

...registered(X, Y), member(Y, [ct101,ct102,ct103]).

バックトラックすると、 Y がリストのメンバーにバインドされます。

編集私はあなたの最後の要件を遅れて理解しました。Y を 3 つの値すべてに一致させたい場合は、 or が不適切であり、代わりに使用します

...registered(X, ct101), registered(X, ct102), registered(X, ct103).

またはよりコンパクト

...findall(Y, registered(X, Y), L), sort(L, [ct101,ct102,ct103]).

findall/3 は、registered/2 が成功したのとまったく同じ順序でリストを作成します。次に、並べ替えを使用して一致を確認します。

...setof(Y, registered(X, Y), [ct101,ct102,ct103]).

setof/3 も結果リストをソートします

于 2012-11-22T06:12:40.923 に答える