これを行うには、おそらくいくつかの良い方法があります。これが1つのアプローチです。
まず、seek/2
各解を 1 つずつ求めるという問い合わせに対して、すべての解を見つけた結果として定義できます。
seek( X, L ) :-
findall( Y, seekone(X, Y), L ).
を定義するseekone/2
には、 "がの最初のリストの先頭にあり、関連するリストのリストに が含まれている場合Y
の結果であると言えます。X
Y
item
X
seekone( X, Y ) :-
item( [Y|_], LL ), % Y is at the head of an item head-list
contains( LL, X ). % LL, the associated list of lists for Y, contains X
したがって、照会すると、有効な結果がなくなるまで、有効な結果がseekone( a, Y ).
一度に 1 つずつ返されます ( )。Y
例えば:
| ?- seekone(a, Y).
Y = sheet ? ;
Y = rule ? ;
no
| ?-
contains/2
リストのリスト (最初の引数) が指定された要素 (2 番目の引数) をそのリスト メンバーの 1 つのヘッドとして含む場合、true になるように定義します。
contains( [[X|_]|_], X ). % X is the head of the 1st list in the list of lists
contains( [_|Tail], X ) :- % X is contained in the list of lists
contains( Tail, X ). % if it is contained in the Tail of list of lists
仕組みの例contains/2
:
| ?- contains([[a,1,4],[b,4,3],[c,1,7]], X).
X = a ? ;
X = b ? ;
X = c ? ;
no
| ?-
または
| ?- contains([[a,1,4],[b,4,3],[c,1,7]], a).
true ? ;
(1 ms) no
| ?-
または
| ?- contains([[a,1,4],[b,4,3],[c,1,7]], d).
no
| ?-
これらすべてを組み合わせると、探している結果が得られます。例:
| ?- seek(a, L).
L = [sheet,rule]
yes
| ?- seek(f, L).
L = [pen]
yes
| ?- seek(b, L).
L = [sheet,pen]
yes
| ?-