根据prolog中的条件从列表中过滤元素

时间:2011-07-27 19:39:55

标签: list prolog

我有路线列表

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谓词过滤出错误的元素,并获得仅包含与真实条件匹配的元素的元素列表?

1 个答案:

答案 0 :(得分:3)

excludeinclude(您真正想要的)将谓词名称作为第一个参数:

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两个目标的结合作为第二个论点。