Prolog-功能相同,但没有findall



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

相关内容

  • 没有找到相关文章

最新更新