0

我有一个谓词“lookupOptions”,它一一返回一些列表(菜单)。

我试图让它满足多个输入的情况。通过阅读“list_places”列表的头部,我可以返回一组选项,如下所示。

find_options(Restaurant,Town,Menu) :- lookupOptions(Restaurant,H,Menu), list_places(Town,[H|T])

但是,我无法让它迭代。

我已经尝试了很多东西,这些都是我迄今为止所做的最大努力。

a)标准足够的迭代,但它不会解决......

doStuff(X,[],_).
doStuff(Restaurant,[H|T],_):-  lookupOptions(Resturant,H,_), doStuff(Restaurant,T,_).
find_options(Restaurant,Town,Menu) :- doStuff(Restaurant,[H|T],Menu), list_places(Town,[H|T]).

b) 扩展目标谓词 ...

find_options(_,Town,[H|T],_)
find_options(Restaurant,Town,Menu) :- find_options(Restaurant,Town,[],Menu).
find_options(Restaurant,Town,X,Menu) :- list_places(Town,X).
find_options(Restaurant,Town,[H|T],Menu) :- lookupOptions(Restaurant,[H],Menu), find_options(Restaurant,Town,T,Menu).

这些中的任何一个都可以吗?如果模式写得正确。或者是否有适当的切口?

任何帮助最受赞赏...

4

1 回答 1

1

目前尚不清楚想要迭代什么。Prolog 使用回溯来检查所有替代方案,如果您在寻找替代方案,则应该开始回溯,或者使用所有解决方案系列。

现在我想你只想简单地声明可能有更多find_options(Restaurant,Town,Menu)。然后尝试用这个替换头部匹配[H|T]

find_options(Restaurant,Town,Menu) :-
   lookupOptions(Restaurant,H,Menu),
   list_places(Town, Places),
   member(H, Places).

BTWT是您原始规则中的单身人士。这可能暗示需要对其进行概括。

于 2012-11-04T08:02:13.743 回答