有人知道我是如何实现I谓词的吗?非常感谢。
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).
我对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
的通用替换,其中您可以指定目标和包含要累积的实例的变量或术语,那么您将无法使用某种非逻辑全局变量。找到下一个值后,将其添加到全局变量中存储的值中,并导致回溯。如果生成下一个值失败,则检索全局变量的内容并返回它。