我有一个谓词“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).
这些都可以吗?如果模式写得正确。或者是否有适当的切割?
任何最感谢的帮助...
答案 0 :(得分:1)
你想要迭代的并不清楚。 Prolog使用回溯来检查所有替代方案,如果您正在使用替代,或者使用all solutions系列,则应该开始回溯。
现在我想你只想声明可能会有更多find_options(Restaurant,Town,Menu)
。然后尝试将头部匹配[H|T]
替换为:
find_options(Restaurant,Town,Menu) :-
lookupOptions(Restaurant,H,Menu),
list_places(Town, Places),
member(H, Places).
BTW T
是原始规则中的单身人士。这可能暗示需要对其进行概括。