我想知道如何制作一个谓词来放置从某个查询中获得的所有结果
例如,如果我写
?- 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]]).
谢谢
我想知道如何制作一个谓词来放置从某个查询中获得的所有结果
例如,如果我写
?- 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]]).
谢谢
可能有几种好方法可以做到这一点。这是一种方法。
第一,seek/2
可以定义为逐一求出所有解的查询的结果:
seek( X, L ) :-
findall( Y, seekone(X, Y), L ).
要定义seekone/2
,我们会说 "Y
是X
ifY
位于 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
| ?-