TL;DR
This article examines the widespread coding errors in Prolog, such as using impure features and global state, which can lead to incorrect or incomplete solutions. It emphasizes the importance of adhering to declarative programming principles.
Recent discussions on Hacker News have highlighted significant issues in Prolog programming, emphasizing that many common coding practices can lead to defective, unreliable programs.
The critique identifies key problems such as the use of impure constructs like !/0, (->)/2, and var/1, which can cause programs to report wrong answers or miss solutions. It also warns against modifying global state with assertz/1 and retract/1, which introduces implicit dependencies and unpredictable behavior.
Another major concern is output handling—using print statements instead of returning results as Prolog terms—hindering testing and relation purity. The discussion further criticizes reliance on low-level language constructs like arithmetic predicates (is/2, =:=/2), which complicate learning and understanding.
The article provides examples, such as the ‘horror factorial,’ illustrating how these issues manifest in real code, leading to errors and limited generality. A recommended solution is to adopt declarative, monotonic constructs like CLP(FD) constraints, which improve program correctness and flexibility.
Why It Matters
This matters because many Prolog programmers inadvertently introduce bugs and limitations into their code by using outdated or impure practices. Emphasizing declarative programming enhances program correctness, testability, and maintainability, which are crucial in logic programming and applications relying on Prolog.

Competitive Programming 4 – Book 1: The Lower Bound of Programming Contests in the 2020s
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
Background
Prolog, a logic programming language, has evolved over the past two decades, with newer features like CLP(FD) constraints becoming standard. Despite this, many programmers still rely on low-level predicates and impure constructs, often due to familiarity or lack of awareness. This discussion reflects ongoing debates about best practices and the importance of embracing declarative paradigms for robust code.
“Breaking these rules results in programs that are defective in one or more ways, such as reporting wrong answers or failing to report solutions.”
— Anonymous Hacker News user
“Using declarative constructs like constraints and pure relations makes programs more general, correct, and easier to maintain.”
— Prolog expert

Versatility Debugging and Programming Tool for STLINK-V3MINIE STLINKV3 Developers in Computer and Hardware Programmer
The Debugger and Programmer a compact yet powerful for efficient debugging and programming, for developers seeking reliability
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
What Remains Unclear
It is not yet clear how widespread the adoption of these best practices is among the broader Prolog community or how quickly these issues will be addressed in ongoing education and development.

CONSTRAINT BASED PROGRAMMING MODELS: Declarative Problem Solving Rule Systems and Optimization Logic
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
What’s Next
Next steps include increased awareness through community discussions, tutorials emphasizing declarative programming, and updates to Prolog teaching materials. Monitoring the adoption of modern features like CLP(FD) will indicate progress.
Prolog code testing frameworks
As an affiliate, we earn on qualifying purchases.
As an affiliate, we earn on qualifying purchases.
Key Questions
What are the main dangers of using impure constructs in Prolog?
Impure constructs can cause programs to produce incorrect solutions, fail to find all solutions, or behave unpredictably due to hidden dependencies and side effects.
Why is global state problematic in Prolog programs?
Modifying global state with assertz/1 or retract/1 introduces implicit dependencies, making programs harder to reason about, test, and debug.
What are the benefits of using declarative constraints in Prolog?
Constraints improve program correctness, generality, and readability, and they facilitate declarative debugging and testing by avoiding side effects and hidden dependencies.
Is it too late to change legacy Prolog code to follow best practices?
It is possible to refactor legacy code gradually, replacing impure and low-level constructs with declarative alternatives to enhance correctness and maintainability.