This commit is contained in:
hi 2025-08-15 10:06:31 +00:00
parent bd9b58c405
commit 687b5f1040
6 changed files with 54 additions and 39 deletions

View file

@ -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
{-