Help us improve
Share bugs, ideas, or general feedback.
From logic-llm
DMN (Decision Model and Notation) compliance validator for Prolog programs
npx claudepluginhub newjerseystyle/plugin-logic-llmHow 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...
Constraint and design validation agent for Jerry framework that performs binary pass/fail verification using AST schema checks and traceability matrices, producing L0/ELI5, L1/engineer, L2/architect reports.
Debugs, improves, and explains BPA rule expressions using Dynamic LINQ and TOM properties. Delegate for fixing rules, debugging logic issues, or writing complex expressions.
Audits decision quality by enforcing known/unknown/assumptions/disconfirmation checks before implementation or promotion. Outputs pass/fail notes, unresolved unknowns, and minimal disconfirmation plans.
Share bugs, ideas, or general feedback.
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: