Reference ยท conlang

Entailment vs validity

Two implication checks with different scopes. One reads the declared model; the other searches all non-empty finite models up to a bound.

CallScopeResult
entails(model, premises, conclusion)One declared interpretationEntailment(holds, premise_values, conclusion)
valid_entails(premises, conclusion, max_domain=3)Every non-empty model, sizes 1..NValidity(status, max_domain, models_checked, countermodel)
evaluate(model, formula)One formula in one declared interpretationbool
valid(formula, max_domain=3)Every non-empty model, sizes 1..NValidity

Declared model (level 3)

Domain: ana, bo
lex:sun:  ana
lex:moon: bo
lex:see:  ana, bo

Same inference, two answers

# Declared model: holds, because ana is the only sun.
entails(model, ["exists x (lex:sun(x))"], "lex:sun(ana)")
-> holds=True

# All models up to size 2: invalid, because the sun can be elsewhere.
valid_entails(["exists x (lex:sun(x))"], "lex:sun(ana)", max_domain=2)
-> countermodel: domain d0,d1; ana=d0; lex:sun={d1}

Vacuous truth: entails returns holds=True when a premise is false, because material implication is true. That is not evidence for the conclusion. Check premise_values before reading a verdict.

What the verdicts mean

StatusMeaning
validNo countermodel exists up to the domain bound and the budget was not exhausted.
invalidA countermodel exists; the Countermodel records domain, extensions, constants, and premise values.
unknownThe model budget ran out before the search finished. Never read this as valid.

CLI

conlang valid --premise "exists x (lex:sun(x))" \
  --conclusion "lex:sun(ana)" --max-domain 2

Exit codes: 0 valid, 1 invalid or unknown, 2 usage or parse error.

Primary source: feature guide and glossary.

Lesson: Entailment is not validity.