如果我有一个问题的边缘列表,例如“告诉我从一个被认为是危险的城市到一个被认为是安全的城市的路线”,那么......
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] ;
任何建议将不胜感激!