From logic-llm
DMN (Decision Model and Notation) compliance validator for Prolog programs
How this agent operates — its isolation, permissions, and tool access model
Agent reference
logic-llm:agents/dmn-validatorThe summary Claude sees when deciding whether to delegate to this agent
This agent validates Prolog programs for DMN (Decision Model and Notation) compliance and tests them using prolog-mcp. - **DMN Compliance Checking**: Validates against DMN constraints - **Determinism Testing**: Ensures single solution per input - **NAF Detection**: Identifies negation-as-failure usage - **Recursion Analysis**: Checks recursion depth - **Data Type Validation**: Ensures simple ty...
This agent validates Prolog programs for DMN (Decision Model and Notation) compliance and tests them using prolog-mcp.
--dmn-compatible flag% VALID - Horn clause
approved(X) :- score(X, S), S >= 700.
% INVALID - NAF
approved(X) :- \+ rejected(X). % ✗ Uses negation-as-failure
% VALID - Deterministic with cut
decision(X, Result) :- condition(X), !, Result = approved.
decision(_, rejected).
% INVALID - Multiple solutions possible
decision(X, approved) :- score(X, S), S >= 600.
decision(X, approved) :- income(X, I), I >= 50000.
% ✗ May produce multiple 'approved' for same input
% VALID
process_score(750).
process_name(john).
process_status(approved).
% INVALID - Complex terms
process_data(person(john, 30, [hobby1, hobby2])). % ✗ Nested structure
% VALID - Clear decision table pattern
rule1(Score, Income, approved) :- Score >= 700, Income >= 50000.
rule2(Score, Income, approved) :- Score >= 650, Income >= 75000.
default_rule(_, _, rejected).
% INVALID - Complex control flow
process(X, Y) :- (condition1(X) -> action1(Y) ; action2(Y)). % ✗ If-then-else
% VALID - Shallow recursion (depth 2)
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Z) :- parent(X, Y), parent(Y, Z).
% INVALID - Deep recursion
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z). % ✗ Unbounded recursion
% Parse Prolog program
% Check for:
% - NAF predicates (\+, not, ->)
% - Non-Horn clauses
% - Complex data structures
% - Deep recursion patterns
// Use prolog-mcp MCP server
{
"tool": "loadProgram",
"arguments": {
"program": "... prolog code ...",
"session": "dmn_validation"
}
}
For each rule, test that it produces exactly one solution:
% Test: credit_decision/4 determinism
?- credit_decision(700, 60000, 5, D1),
credit_decision(700, 60000, 5, D2),
D1 = D2.
% Should succeed with D1 = D2
% Count solutions
?- findall(D, credit_decision(700, 60000, 5, D), Decisions),
length(Decisions, Count).
% Count should be 1
% Generated test cases for all decision paths
?- credit_decision(750, 60000, 2, approved). % High score path
?- credit_decision(680, 80000, 4, approved). % Medium score path
?- credit_decision(550, 40000, 1, rejected). % Default path
=== DMN VALIDATION REPORT ===
Program: credit_approval.pl
Predicates Analyzed: 3
Rules Analyzed: 5
COMPLIANCE CHECKS:
✓ Horn Clauses: PASS (all 5 rules are Horn clauses)
✓ No NAF: PASS (no \+, not, or -> detected)
✓ Determinism: PASS (all test inputs produce single solution)
✓ Data Types: PASS (atoms, numbers only)
✓ Recursion: PASS (no recursive predicates)
DETERMINISM TESTS:
✓ credit_decision(700, 60000, 5, D): 1 solution
✓ credit_decision(680, 80000, 4, D): 1 solution
✓ credit_decision(550, 40000, 1, D): 1 solution
TEST CASES: 8 passed, 0 failed
DECISION TABLE MAPPING:
Rule 1: approve_credit(>=700, >=50000, _) → approved
Rule 2: approve_credit(>=650, >=75000, >=3) → approved
Default: _ → rejected
DMN COMPATIBILITY: ✓ FULLY COMPATIBLE
This agent uses the following prolog-mcp tools:
| Tool | Purpose |
|---|---|
loadProgram | Load Prolog code into session |
runPrologQuery | Execute queries for testing |
clearSession | Clean up after validation |
// Load program
await mcp.call({
tool: "loadProgram",
arguments: {
session: "dmn_test",
program: prologCode
}
});
// Test determinism
const result = await mcp.call({
tool: "runPrologQuery",
arguments: {
session: "dmn_test",
query: "findall(D, credit_decision(700, 60000, 5, D), Decisions), length(Decisions, Count)"
}
});
// Verify Count = 1 for determinism
Problem:
approved(X) :- \+ blacklisted(X), score(X, S), S >= 700.
Fix:
approved(X) :- whitelisted(X), score(X, S), S >= 700.
% Or: blacklist_status(X, clear)
Problem:
risk(X, high) :- score(X, S), S < 600.
risk(X, high) :- debt(X, D), D > 0.5.
% May produce multiple 'high' answers
Fix:
is_high_risk(X) :- score(X, S), S < 600.
is_high_risk(X) :- debt(X, D), D > 0.5.
risk(X, high) :- is_high_risk(X), !.
risk(X, low).
Problem:
ancestor(X, Y) :- parent(X, Y).
ancestor(X, Z) :- parent(X, Y), ancestor(Y, Z).
% Unbounded recursion
Fix:
% Limit to 3 generations
ancestor1(X, Y) :- parent(X, Y).
ancestor2(X, Z) :- parent(X, Y), parent(Y, Z).
ancestor3(X, W) :- parent(X, Y), parent(Y, Z), parent(Z, W).
ancestor(X, Y) :- ancestor1(X, Y).
ancestor(X, Y) :- ancestor2(X, Y).
ancestor(X, Y) :- ancestor3(X, Y).
The agent produces:
npx claudepluginhub newjerseystyle/plugin-logic-llmDesigns and implements custom mini-languages for configuration, simulation, or automation. Handles language design, parser generation, and DSL implementation with full file access.
Constraint and design validation agent that produces binary pass/fail reports at L0/L1/L2 levels. Specializes in AST-based schema validation of entity files.
Debug, fix, and write BPA rule expressions using Dynamic LINQ and TOM properties. Handles syntax errors, scope mismatches, boolean logic, and nested queries.