有没有人知道我如何实现我谓词做这个做但没有“findall”? 非常感谢你。
domains
oferta = rebaixat ; normal
element = string
list = element*
database
producte (string, integer, oferta)
predicates
nondeterm reduced2(list)
clauses
producte("Enciam",2,rebaixat).
producte("Peix",5,normal).
producte("Llet",1,rebaixat).
producte("Formatge",5,normal).
reduced2(Vals):-
findall(Val, producte(Val,_,rebaixat),Vals).
Goal
write("Amb findall"),nl,
reduced2(List).
答案 0 :(得分:0)
我对Visual Prolog了解不多,但我会尝试给出一般答案。这取决于您是否要为特定案例或一般情况下找到findall/3
替换。
在特定情况下,您可以使用累加器。在您的情况下,这将是一个列表,在您找到它们时将值添加到该列表中。类似的东西:
acc(In, List) :-
... % do something to generate possible next value
... % test if value is already in list In
!,
Out = [Val|In], % adds to the head, but is faster than using append
acc(Out, List).
acc(List, List).
即,如果找不到其他可能的值,则返回找到的值列表。请注意,如果必须累积大量值并且通过回溯生成下一个可能的值,这可能会很慢。此外,这不会让您生成重复项,因此它不能完全替代findall/3
。
如果您想要findall/3
的一般替换,您可以在其中指定目标以及将包含要累积的实例的变量或术语,那么您将无法使用某种非逻辑性全局变量。找到下一个值后,将其添加到全局变量中存储的值,并导致回溯。如果生成下一个值失败,则检索全局变量的内容并将其返回。