18 hours ago
- No standardized strings – ISO only defines atoms or lists of character codes, leading to incompatibility across implementations.
- No functions – code is expressed only in predicates that return true/false; simple operations like adding 1 to a length require multiple steps.
- Limited collection types – only linked lists and compound terms; no built-in maps or structs, and custom solutions lack cross-compatibility.
- Boolean values absent – true/false are control flow, not data values, making it inconvenient to store and combine intermediate results.
- Cuts (!) are confusing – they prevent backtracking but can lead to invalid programs; conditionals rely on cuts, causing unexpected behavior.
- Negation as failure (\+) is confusing – its behavior depends on instantiation order, and it is not purely declarative.
- Querying is interactive by default – obtaining all results at once requires bagof/setof with existential quantifiers (^), which is non‑intuitive.
- Symbol terms have no official conventions – e.g., a-b is used for pairs but not enforced, leading to potential inconsistency.
- sort/2 removes duplicates – it returns a sorted set, not a sorted list, requiring cumbersome workarounds to preserve duplicates.
- Rule termination with a period – trailing commas are not allowed, making reordering lines cause syntax errors.