web-dev-qa-db-ja.com

プロローグ「または」演算子、クエリ

私は初めてのプロローグに取り組んでいます。

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

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

これが私のクエリです。私が書きたいのは次のようなコードです:

「Yが値Z OR value Q OR value P」に等しい場合、Xを返す

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

22
Eogcloud

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

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

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

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

バックトラッキングで、Yをリストのeachメンバーにバインドします。

編集あなたの最後の要件を少し遅れて理解しました。 Yが一致するall3つの値または不適切な場合は、代わりに使用します

...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は結果リストもソートします

14
CapelliC

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

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

より詳細な説明:

プロローグの述語制御

27
Robert Oschler