我想知道如何制作一个谓词,其中包含从某些查询中获得的所有结果
例如,如果我写
?- 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]]).
由于
答案 0 :(得分:0)
可能有几种很好的方法可以做到这一点。这是一种方法。
首先,seek/2
可以定义为找到逐个寻求每个解决方案的查询的所有解决方案的结果:
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 ).
时,它将逐个产生一个有效结果(在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
| ?-