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

可能有几种好方法可以做到这一点。这是一种方法。

第一,seek/2可以定义为逐一求出所有解的查询的结果:

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

要定义seekone/2,我们会说 "YXifY位于 an 中第一个列表的开头的结果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 ).时,它将一次产生每个有效结果(in Y),直到有效结果用尽。例如:

| ?- seekone(a, Y).

Y = sheet ? ;

Y = rule ? ;

no
| ?-

contains/2如果列表列表(第一个参数)包含给定元素(第二个参数)作为其列表成员之一的头部,则定义为 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 回答