If code is represented as a database (Code as Database), Datalog (or logical) programming can be used to represent algorithm on code. Benefits are better incrementality and traceability.
However, for typechecking, it is hard to provide good type errors when type checking is implemented in Prolog.
Also, rust is about to use prolog dialect for type checking with traits.
Also, many code analysis tools use datalog dialects. (e.g., Souffle)