「危険と見なされる都市から安全と見なされる都市へのルートを表示してください」などの問題のエッジのリストがある場合は...
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).
しかし、私が解決しようとしている問題は、安全な都市(この場合は1つのオークランド->ニューヨークのみ)につながらない危険な都市からのすべてのパスを見つけることです。上記の関数をで呼び出すと、 ..
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] ;
アドバイスをいただければ幸いです。