Feature support matrix

An honest table of what Logic Studio does, what it partially does, and what it does not do.

Last reviewed: 2026-05-25. Reflects shipped state of logic.solves.ca at that date. Roadmap items (✨) are documented under docs/ but not yet shipping.

This matrix is built from the source code, not from aspirations. Status legends:

Expression language

FeatureStatusNotes
Boolean variables✅ FullCase-sensitive identifiers
Boolean literals (true/false/0/1)✅ Full
NOT, AND, OR, XOR✅ FullSymbol and keyword forms (!, &, |, ^)
Implication (→)✅ Full-> syntax
Biconditional (↔)✅ Full<-> syntax
Named bindings✅ FullSemicolon-terminated; forward references not supported
Don't-cares✅ FullB? suffix or via Inputs panel
Predicate comparisons (<, <=, >, >=, ==, !=)✅ FullNumeric scalars on the right-hand side only
Set membership (in, not-in)✅ FullLiteral value sets: in {CA, US}
Cross-variable arithmetic (a + b > c)❌ Not supportedEach predicate must involve exactly one typed variable
String predicates⚠️ PartialParsed; no runtime evaluation beyond equality/set membership
Comments✅ FullLine comments // and #, plus block comments /* … */. Block comments do not nest; unterminated blocks raise a lex error.

Analysis panels

FeatureStatusNotes
Syntax-highlighted editor✅ FullVariable colour cycling, operator colouring, error underlines
Live parse errors✅ FullRed border + error message below editor
Flow graph (single binding)✅ FullReact Flow DAG, Dagre layout
Flow graph (Show-all DAG)✅ FullAll bindings in one graph; shared sub-expressions shared
Truth table✅ FullUp to 2n rows; truncates for large n
Decision table✅ FullCompact rules view; supports collapse of identical rows
Simplification (QM + Petrick)✅ FullMinimum two-level SOP
Simplification Why? trace✅ FullStep-by-step QM reasoning in prose form
Rewrite transforms (CNF, DNF, NNF, De Morgan, Factor)✅ FullOne-click; before/after preview
Pseudocode rendering✅ FullAlways-on if/else pseudocode block in Rewrite panel
Coverage — Branch✅ Full
Coverage — MC/DC✅ FullEach condition independently affects the decision
Coverage — Pairwise✅ Full
Coverage — Prime Implicant✅ FullBased on QM prime implicants
Karnaugh map renderer✅ FullGray-coded grid for 2–6 variables (2×2, 2×4, 4×4, 4×8, 8×8). Cells show 0/1/don't-care; tooltips show the full per-cell assignment. Outside 2–6 variables the panel directs users to the truth table / Simplify.
Equivalence diff✅ FullChecks two expressions for logical equivalence; returns counterexample on mismatch
Notebook (save/load expressions)✅ FullIndexedDB; browser-local only; not synced
Variable impact chart✅ FullShows fraction of assignments where each variable is decisive
Notebook empty state✅ FullOriented first-time card explains what saved entries are, how to import, and that storage is browser-local
Coverage strategy disclosures✅ FullEach coverage mode (branch, MC/DC, pairwise, prime-implicant, full truth-table) carries an (i) disclosure with the underlying concept; gated by the teaching toggle (default ON)
Equivalence Diff default render✅ FullSide A pre-seeds with the working expression, Side B pre-seeds with the simplified form; the panel opens in the populated/compared state when both exist
Equivalence Diff backend routing✅ FullAuto-picks QM enumeration (≤14 bool vars), SAT (>14 bool vars), or SMT/Z3 (predicate atoms). Shown in the result's “Why this backend?” note.
Equivalence Diff truth-table diff⚠️ PartialFull row-by-row diff only on the QM enumeration path. SAT/SMT paths return verdict + a single counterexample (the truth-table is too large or not pure-boolean).

Predicates

FeatureStatusNotes
Numeric buckets (truth table rows per range)✅ FullSplits real line at boundary values from predicates
Enum buckets✅ FullOne bucket per declared enum value
Contradiction detection✅ FullWithin a single variable; e.g. age < 18 AND age >= 18
Subsumption detection✅ FullWithin a single variable
Cross-variable predicate reasoning⚠️ PartialOnly via Z3 SMT; the QM simplifier treats all predicates as opaque atoms
Type editor UI (set type / range / enum values)✅ FullClick + next to a predicate variable. Type metadata persists to localStorage and rides shared URLs (v2 schema).

Solver

FeatureStatusNotes
SAT solving (pure boolean)✅ Fulllogic-solver backend; fast, no download
SMT solving (Z3 WASM)✅ FullLoads lazily; requires SharedArrayBuffer (COOP/COEP headers)
Tautology / contradiction detection✅ FullBoth backends
Multi-solution enumeration✅ FullBounded by both count (1–1024, default 16) and wall-clock time budget (100–30000 ms, default 2000). Returns the reason it stopped: exhausted, limit, timeout, or free. Available in the Solver panel when the active backend is SAT or SMT.
Optimisation (MaxSAT / MaxSMT)✨ RoadmapNot shipping. Plan and open syntax questions in docs/OPTIMISATION-ROADMAP.md. Z3 Optimize is available in the WASM build; phase-1 will wrap it with soft-clause sugar after the ?-vs-don't-care token collision is decided.
Quantifier reasoning (∀, ∃)✨ RoadmapNot shipping. Plan in docs/QUANTIFIERS-ROADMAP.md. Phase-1 expands quantifiers over finite enums and small integer ranges into and/or at parse time; phase-2 builds Z3 ForAll/Exists directly. Today the existing tautology / contradiction / satisfiability checks already answer the propositional ∀/∃ questions.
Custom Z3 theories❌ Not supportedOnly the theories exposed by the predicate UI are used

Export / import

FeatureStatusNotes
Export to JavaScript✅ Full
Export to Python✅ Full
Export to C✅ Full
Export to SQL (WHERE clause)✅ Full
Export to GitHub Actions condition✅ Full
Export to Lisp S-expression✅ Full
Import from JavaScript / Python⚠️ PartialBest-effort; complex expressions may not parse
Import from SQL / GHA⚠️ PartialBest-effort
PNG graph export✅ Fullhtml-to-image; screen resolution
SVG graph export✅ FullVector; embeds theme colours
Coverage test vectors (JS/Python/C/SQL)✅ Full

Persistence & sharing

FeatureStatusNotes
URL-encoded sharing✅ FullExpression source encoded in URL hash; self-contained
Server-side persistence❌ Not supportedEverything is client-local. No accounts, no server storage.
Notebook (IndexedDB)✅ FullSurvives page reload; lost when browser data is cleared
Variable type annotations in share URL✅ FullShare schema v2 carries {src, names?, types?} where each typed variable round-trips its type, display name, domain (min/max), and enum values. v1 URLs continue to decode.
Display name customisations in share URL✅ FullCarried via the names field of the share schema (both v1 and v2).

UI & UX

FeatureStatusNotes
Dark theme✅ FullDefault; "Schematic Slate" palette
Light theme✅ Full"Schematic Paper" palette
System theme (prefers-color-scheme)✅ FullRespects OS preference unless overridden
Teaching mode ((i) disclosures)✅ FullHeader toggle (default ON). When on, info chips next to each surface vocabulary term reveal a short concept page. Persists to localStorage.
Basic / Advanced UI mode✅ FullHeader toggle. Basic (default) hides specialised vocabulary (CNF/DNF labels, prime implicant phrasing, quantifier symbols) in favour of plain-English alternatives. Components opt in via .ls-jargon and .ls-plain spans. Persists to localStorage.
⌘K command palette✅ FullFilterable command search + shortcut help
Keyboard shortcuts✅ FullSee Editor → Shortcuts
Mobile / narrow layout✅ FullHybrid layout shell: shared Zustand store with separate DesktopLayout / MobileLayout components. Breakpoints <720 mobile, 720–1024 tablet, >1024 desktop. Graph interaction is still pan/zoom-only on touch.
Z3 lazy-load progress UI✅ FullSolver status pill with subtle progress bar; does not push page layout. Prefetch gated behind explicit need (Phase 2.2).
Accessibility (WCAG AA contrast)⚠️ PartialBoth themes target AA contrast; not fully audited for all interactive components
Screen reader support⚠️ PartialARIA roles and labels on major regions; graph nodes are not accessible to screen readers
Offline use⚠️ PartialService worker is registered (Workbox + vite-plugin-pwa); app shell, static assets, and the editor work offline after first load. Z3 WASM (~33 MB) is only fetched when SMT solving is invoked and is not prefetched. Cloudflare CDN helps with repeat visits.
Install as PWA✅ FullManifest + service worker; InstallAppButton surfaces a prompt where the browser supports it (Chromium, Edge, Android Chrome). Safari requires Add-to-Home-Screen from share sheet.

Known gaps summary