Если у меня есть список ребер для такой задачи, как «Покажите мне маршруты из города, который считается опасным, в тот, который считается безопасным», так что...
dangerous(oakland).
safe(portland).
move(rome,plane,portland).
move(portland,plane,rome).
move(halifax,train,gatwick).
move(gatwick,car,rome).
move(portland,plane,newyork).
move(oakland,plane,rome).
move(oakland,plane,gatwick).
move(halifax,train,gatwick).
move(gatwick,plane,rome).
move(oakland,train,newyork).
Я могу получить список путей, ведущих к безопасному городу, используя следующий поиск в глубину (найденный на SO)...
dfs_start(Start, Goal, Path) :- phrase(dfs(Start, [], Goal), Path).
dfs(Node, _, Goal) --> [Node], { call(Goal, Node) }.
dfs(Node0, Es, Goal) --> [Node0],
{ move(Node0,_,Node1), \+ member(Node1, Es) },
dfs(Node1, [Node0|Es], Goal).
Однако проблема, которую я пытаюсь решить, состоит в том, чтобы найти все Пути из опасных городов, которые НЕ ведут в безопасный город (в данном случае это будет только один Окленд -> Нью-Йорк). Если я вызову вышеуказанную функцию с помощью. ..
dfs_start(oakland,safe,Path).
...Я получил
Path = [oakland, rome, portland] ;
Path = [oakland, gatwick, rome, portland] ;
Path = [oakland, gatwick, rome, portland] ;
... но то, что я хочу сделать, это вызвать что-то вроде...
dfs_start(oakland,unsafe,Path).
...и получить...
Path = [oakland, newyork] ;
Любой совет будет принят с благодарностью!
oakland->newyork
? Что не так сoakland->rome
? Чемrome
отличается отnewyork
? - person Will Ness   schedule 10.06.2012