2

私が理解している限り、述語setof/3とbagof/3を使用して、問題の解決策のリストを生成できます。(gprologマニュアルへのリンク)

予想どおり、次のクエリの解決策はa、b、cです。

?- nth(_, [a,b,c], X).                 
X = a ? ;
X = b ? ;
X = c ? ;
yes

そして今、私はこれを試します:

?- setof(X, nth(_, [a,b,c], X), ListOfSolutions).
ListOfSolutions = [a] ? ;
ListOfSolutions = [b] ? ;
ListOfSolutions = [c]
yes

私の意見では、解決策は[a、b、c]でなければなりませんでした。私は何が間違っているのですか?

MacOS用にgprolog1.4.0を使用しています。


編集:解決策

本当に必要だったのは(^)/ 2演算子でしたが、ここでの答えは完全に正しかったので、よろしくお願いします。誰かが同様の問題を抱えている場合は、3次元グリッドからセルを選択するための現在のコードがここにあります。

% selectFLR(?Grid, ?ClassId, ?TDayIdD, ?HourId, -ListOfFLR)
% ---------------------------------------------------------
selectFLR(Grid, ClassId, DayId, HourId, ListOfFLR) :-
    bagof(FLR, ClassId^DayId^HourId^selectSingleFLR(Grid, ClassId, DayId, HourId, FLR), ListOfFLR).

selectSingleFLR(Grid, ClassId, DayId, HourId, FLR) :-
    nth(ClassId, Grid, Class),
    nth(DayId, Class, Day),
    nth(HourId, Day, FLR).
4

2 に答える 2

2

いいえ、すべきではありません。nth(_、[a、b、c]、X)は、毎回Xに対して1つの解を与えます。setof(およびbagof)は次のように機能します:

setof(Things, GoalCondition, Bag)

ThingsをXとして指定し、nth / 3からのXが(上記の例で示すように)毎回単一の変数である場合、setofはその単一の変数のリストを作成するだけです。他の可能な統一も可能ですが、それは毎回モノにある1つのアイテムのバッグを作るだけです。

正式:ゴール内の自由変数の個々のバインディングの述語bagofおよびsetofyieldコレクション。setofは、重複のないソートされたバージョンのコレクションを生成します... findallは、すべての自由変数が自動的に存在記号で定量化されたbagofのように機能します。さらに、findallは空のリストを返します[]目標の満足度はありませんが、bagofは失敗します。

長い話を短くするには:findall:Pを使用します

于 2011-06-10T17:12:14.103 に答える
1

このように書いてみてください:

findall((A,B,C,D,E), coursemeetings(A,B,C,D,E),L)
于 2012-04-21T22:26:13.267 に答える