big tidy
This commit is contained in:
parent
bd9b58c405
commit
687b5f1040
6 changed files with 54 additions and 39 deletions
|
@ -2,23 +2,31 @@ module Logic.Graph where
|
|||
|
||||
import Data.Set (Set, insert)
|
||||
|
||||
bfs :: (Eq a, Ord a) => a -> a -> (a -> [(edge, a)]) -> Maybe [edge]
|
||||
bfs goal start getEdges = reverse <$> aux [([], start)] mempty
|
||||
type GetEdges vertex edge = vertex -> [(vertex, edge)]
|
||||
type GetEdgesCosts vertex edge cost = vertex -> [((vertex, edge), cost)]
|
||||
|
||||
bfs
|
||||
:: (Eq vertex, Ord vertex)
|
||||
=> GetEdges vertex edge
|
||||
-> vertex
|
||||
-> vertex
|
||||
-> Maybe [edge]
|
||||
bfs getEdges goal start = reverse <$> aux [(start, [])] mempty
|
||||
where
|
||||
aux [] _ = Nothing
|
||||
aux ((path, vertex):queue) visited
|
||||
aux ((vertex, path):queue) visited
|
||||
| vertex == goal = Just path
|
||||
| otherwise =
|
||||
let new = getUnvisitedAdjacent vertex visited
|
||||
in
|
||||
case filter (\(_, v) -> v == goal) new of
|
||||
case filter (\(v, _) -> v == goal) new of
|
||||
[] ->
|
||||
let queue' = queue ++ map (\(edge, next) -> (edge:path, next)) new
|
||||
let queue' = queue ++ map (\(next, edge) -> (next, edge:path)) new
|
||||
in aux queue' $ insert vertex visited
|
||||
((edge, _):_) -> Just (edge:path)
|
||||
((_, edge):_) -> Just (edge:path)
|
||||
|
||||
getUnvisitedAdjacent vertex visited =
|
||||
filter (\(edge, next) -> not $ next `elem` visited) $
|
||||
filter (\(next, edge) -> not $ next `elem` visited) $
|
||||
getEdges vertex
|
||||
|
||||
{-
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue