将查询结果放在Prolog的列表中

时间:2013-10-19 00:49:54

标签: prolog

我想知道如何制作一个谓词,其中包含从某些查询中获得的所有结果

例如,如果我写

?- 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]]).

由于

1 个答案:

答案 0 :(得分:0)

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

首先,seek/2可以定义为找到逐个寻求每个解决方案的查询的所有解决方案的结果:

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

要定义seekone/2,我们会说“YX的结果,如果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 ).时,它将逐个产生一个有效结果(在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
| ?-