Skip to content

Add Apalache wrappers and configurations for example specifications#209

Open
lemmy wants to merge 5 commits intomasterfrom
mku-Apalache
Open

Add Apalache wrappers and configurations for example specifications#209
lemmy wants to merge 5 commits intomasterfrom
mku-Apalache

Conversation

@lemmy
Copy link
Copy Markdown
Member

@lemmy lemmy commented Apr 22, 2026

AI has made substantial progress over the past few years, and that progress is starting to have very practical implications for tooling like Apalache.

Around 2–3 years ago, I experimented with using AI to synthesize Apalache-style type annotations. At the time, even frontier models struggled to consistently produce syntactically correct annotations, which made the approach impractical.

Revisiting this recently with Claude Opus 4.7 shows a clear shift. When provided with the type annotation guide from the Apalache repository and given CLI access to Apalache (no Skills, MCPs, ...), the model was able to synthesize type annotations for a large portion of the existing TLA+ examples. The total wall-clock time for this process was on the order of a few hours.

That said, a meaningful portion of the remaining specs will require deeper changes. A key challenge is that Apalache's type system distinguishes between sequences, records, and functions, whereas in TLA+ these are all represented uniformly as functions. Bridging that conceptual gap will require structural refactoring rather than straightforward annotation, and Apalache's Variant type will likely be relevant.

@lemmy lemmy self-assigned this Apr 22, 2026
For each spec where it was feasible, add:

  * AP<Spec>.tla -- a non-invasive wrapper module that INSTANCEs the
    untyped original specification with typed CONSTANTS and VARIABLES,
    so that `apalache-mc typecheck` accepts the spec without modifying
    the source. A few wrappers also shadow polymorphic helpers (`Sum`,
    `Range`, ToSet`, ...) with monomorphic versions, or define
    `<Const>Val` operators used by the .cfg below to fill in
    uninterpreted-type constants.

  * AP<Spec>.cfg -- a TLC-style model configuration adapted for
    Apalache. Each .cfg drives `apalache-mc check` for the spec's
    safety properties (TLC `PROPERTIES` are intentionally dropped).
    Constants are either inlined (Int/Bool/Str) or substituted via
    `Const <- ConstVal` to attach the right uninterpreted type.

Co-authored-by: Claude Code 4.7 <claude@anthropic.com>
Signed-off-by: Markus Alexander Kuppe <github.com@lemmster.de>
lemmy added 2 commits April 22, 2026 10:22
…s for Apalache

Temporarily disable various checks in the CI workflow related to Unicode and manifest validation, as Apalache cannot model-check Unicode-translated specifications. Adjust the model checks to focus solely on Apalache-compatible configurations, specifically restricting checks to AP*.cfg files. This change is part of ongoing efforts to integrate Apalache into the CI process.

Signed-off-by: Markus Alexander Kuppe <github.com@lemmster.de>
`tla_utils.check_model` hard-coded `bin/apalache-mc`, but on Windows
the launcher is `bin/apalache-mc.bat` and `subprocess.run` cannot
spawn `.bat` files via CreateProcess directly. Pick the launcher per
platform and route the Windows batch file through `cmd.exe /c`.

This was latent because the only symbolic-mode model in CI
(EinsteinRiddle) was always being skipped: `[ ${{ matrix.unicode }} ]`
in CI.yml is truthy for both "true" and "false", so the SKIP entry
was added unconditionally rather than only on the Unicode variant.

Signed-off-by: Markus Alexander Kuppe <github.com@lemmster.de>
@ahelwer
Copy link
Copy Markdown
Collaborator

ahelwer commented Apr 22, 2026

Good idea!

@lemmy lemmy requested a review from konnov April 22, 2026 23:24
@lemmy lemmy marked this pull request as ready for review April 22, 2026 23:25
@lemmy lemmy requested a review from ahelwer April 22, 2026 23:27
@lemmy
Copy link
Copy Markdown
Member Author

lemmy commented Apr 22, 2026

@ahelwer Please advise on f332e9d, b0fe6f7, and f07be26

lemmy added 2 commits April 23, 2026 06:01
Translate`CHECK_DEADLOCK FALSE` into Apalache's `--no-deadlock` CLI flag.

Signed-off-by: Markus Alexander Kuppe <github.com@lemmster.de>
Always pass `--length=5` to `apalache-mc check` from the CI driver,
instead of opting individual model .cfg files in via a per-model marker
comment. Apalache's own default of 10 is just as arbitrary; 5 keeps the
suite within CI timeouts while still exercising each spec.

Signed-off-by: Markus Alexander Kuppe <github.com@lemmster.de>
Copy link
Copy Markdown
Collaborator

@konnov konnov left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks nice! I really like the trick with introducing an additional instance to deal with type annotations. I noticed a few temporary fixes in the yml files. You probably want to fix those first

Comment thread .github/scripts/tla_utils.py Outdated
Comment on lines +152 to +153
line. Used to translate the directive to Apalache's `--no-deadlock` CLI
flag, since Apalache silently ignores it in the config file.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's worth opening an issue in Apalache on that

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it feasible for this PR to wait on this feature to appear in Apalache?

Comment thread .github/workflows/CI.yml
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

3 participants