我有路线列表
path(chicago,milwaukee).
path(milwaukee,detroit).
path(chicago,detroit).
path(detroit, newyork).
path(newyork, boston).
path(atlanta,boston).
我有一个谓词路线,从而给出了所有城市之间的起点和时间。结束。 例如:
?- routefrom(chicago,newyork,X).
X=[chicago,milwaukee,detroit,newyork]
获取我拥有的所有路线
allroutes(Start,End,P) :- findall(X,pathfrom(Start,End,X),P).
示例:
?- allroutes(chicago,neywork,P).
X=[[chicago,milwaukee,detroit,newyork],[chicago,detroit,newyork]].
我有一个谓词规则goodroute(M)
,如果路线不包含密尔沃基并且包含芝加哥或纽约,则返回true。
例如:
?- goodroute([chicago, milwaukee,detroit]).
false
?-goodroute([chicago,detroit,newyork,boston]).
true
现在, 我需要过滤掉拥有密尔沃基的路线,并从allroutes的结果中得到一个包含芝加哥或纽约的列表。 我试过了
filerroute :- exclude(maplist(goodroute(findall(X,pathfrom(Start,End,X),P).
我要做的是将好的路线映射到findall的结果上,以便其中一些是真的&有些会是假的,排除会消除虚假。 我不确定排除是如何工作的。 如何根据goodroute谓词过滤出错误的元素,并获得仅包含与真实条件匹配的元素的元素列表?
答案 0 :(得分:3)
exclude
和include
(您真正想要的)将谓词名称作为第一个参数:
goodroutes(From, To, Routes) :-
allroutes(From, To, All),
include(goodroute, All, Routes).
虽然在调用findall
期间过滤掉不良路由会更有效率,但从那时起你不必首先构建所有路由的集合:
goodroutes(From, To, Routes) :-
findall(Route, (pathfrom(From, To, Route), goodroute(Route)), Routes).
注意( , )
;我们给findall
两个目标的结合作为第二个论点。