Фильтрация элементов из списка по условиям в прологе - PullRequest
2 голосов
/ 27 июля 2011

У меня есть список маршрутов

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

Теперь мне нужно отфильтровать маршруты с Милуоки и получить список с Чикаго или Нью-Йорком из результатов всех маршрутов.Я пытался

filerroute :- exclude(maplist(goodroute(findall(X,pathfrom(Start,End,X),P).

То, что я пытаюсь сделать, это сопоставить Goodroute с результатом findall, чтобы некоторые из них были истинными, а некоторые ложными, а исключение исключало ложные.Я не совсем уверен, как работает исключение.Как отфильтровать элементы, которые являются ложными согласно предикату goodroute, и получить список элементов, имеющих только элементы, соответствующие истинному условию?

1 Ответ

3 голосов
/ 27 июля 2011

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 соединение двух целей в качестве второго аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...