1

いくつかのクエリから得られたすべての結果を入れる述語を作成する方法を知りたいです

たとえば、私が書くと

?- seek(a, L). 

これらすべての結果をリストに取得したい

L = [sheet, rule]

次のナレッジ ベースを使用します。

item([sheet,3,4],[[a,1,4],[b,4,3],[c,1,7]]).

item([pen,5,4],[[f,1,4],[t,2,3],[g,4,4],[b,4,3]]).

item([rule,1,8],[[c,1,4],[a,2,3]]).

ありがとう

4

1 に答える 1

0

これを行うには、おそらくいくつかの良い方法があります。これが1つのアプローチです。

まず、seek/2各解を 1 つずつ求めるという問い合わせに対して、すべての解を見つけた結果として定義できます。

seek( X, L ) :-
    findall( Y, seekone(X, Y), L ).

を定義するseekone/2には、 "がの最初のリストの先頭にあり、関連するリストのリストに が含まれている場合Yの結果であると言えます。XYitemX

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
| ?-
于 2013-10-19T01:07:24.783 に答える