Prolog - 功能相同但没有findall

时间:2012-01-09 16:15:22

标签: database prolog visual-prolog prolog-findall

有没有人知道我如何实现我谓词做这个做但没有“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).

1 个答案:

答案 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的一般替换,您可以在其中指定目标以及将包含要累积的实例的变量或术语,那么您将无法使用某种非逻辑性全局变量。找到下一个值后,将其添加到全局变量中存储的值,并导致回溯。如果生成下一个值失败,则检索全局变量的内容并将其返回。