基于在序言条件列表过滤元件

我有路由列表

path(chicago,milwaukee). path(milwaukee,detroit). path(chicago,detroit). path(detroit, newyork). path(newyork, boston). path(atlanta,boston).

我有一个谓语routefrom这给所有的开始与结束之间的城市。 例如:

?- 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的结果国禹使一些,这将是真有人会是假的,并排除将消除假的。 我不完全知道如何排除工作。 我如何根据国禹谓词筛选出哪些是错误的元素,并得到其只有符合真实状况元素的元素的列表?

--------------解决方案-------------

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的两个目标作为其第二个参数一起使用。

分类:名单 时间:2012-09-27 人气:0
本文关键词: 列表中,序言
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.136 (s). 9 q(s)