No project description provided
Project description
prop-logic-kernel
This repo contains:
Main.lean: a tiny proposition-logic tactic kernel wrapped in aREPL.runlooppy_prop_logic_kernel/: the Python package you publish; it parses the kernel output into structured steps such asgoals_remaining
Lean code spec
The Lean kernel is defined primarily by:
PropLogicKernel/Basic.lean: proposition syntax, tactics, goals, and statePropLogicKernel/Parser.lean: string parser for propositions and tacticsPropLogicKernel/Resolver.lean: operational semantics for each tacticPropLogicKernel/REPL.lean: REPL transition function built on top of the resolverMain.lean: executable entrypoint
Core data model
- A proposition
Pis one of:⊥, atom, conjunctionA ∧ B, disjunctionA ∨ B, implicationA → B. - A goal is a pair of:
- a hypothesis map from natural-number names to propositions
- a target proposition
- A state is a stack of goals plus a counter used to assign fresh hypothesis names.
Tactic resolution rules
These are the actual rules implemented in PropLogicKernel/Resolver.lean.
intro:- If the goal is
A → B, add a fresh hypothesisAand replace the goal withB.
- If the goal is
apply n:- If hypothesis
nisA → Band the current goal isB, replace the goal withA.
- If hypothesis
exact n:- If hypothesis
nis exactly the current goalA, solve the goal.
- If hypothesis
constructor:- If the goal is
A ∧ B, split it into two goals:AandB.
- If the goal is
left:- If the goal is
A ∨ B, replace it withA.
- If the goal is
right:- If the goal is
A ∨ B, replace it withB.
- If the goal is
cases n:- If hypothesis
nisA ∨ B, branch into two goals: one with fresh hypothesisA, one with fresh hypothesisB. - If hypothesis
nisA ∧ B, add fresh hypothesesAandBto the current goal. - If hypothesis
nis⊥, solve the goal immediately.
- If hypothesis
lem P:- Available only in classical mode.
- Adds a fresh hypothesis
(P → ⊥) ∨ P.
refine n:- Available only in classical mode.
- If hypothesis
nisA1 → B1and the current goal isB, replace the current goal with two goals:B1 → BA1
sorry:- Solves the current goal unconditionally.
new P:- Pushes a fresh goal
Ponto the state, with an empty hypothesis map.
- Pushes a fresh goal
Failure behavior
- If a tactic does not match the current goal or referenced hypothesis shape, resolution fails with an error message.
lemandrefinefail if classical logic is disabled.- Any tactic other than
newfails on an empty goal stack.
REPL protocol spec (REPL.run)
The executable produced by lake build (see .lake/build/bin/Main-lean) implements a simple line-based protocol driven by REPL.run in REPL/REPL.lean.
Each step:
- stderr (error/status stream): write zero or more lines of status/errors.
- In this repo, status lines are prefixed with
--and include counters, for example:-- new_count 1 sorry_count 0 goals_remaining 2-- all goals accomplished!
- In this repo, status lines are prefixed with
- stdout (output stream): write zero or more lines of “main output” (e.g. the rendered goal state).
- stderr (prompt): write the prompt string (default
>) without a trailing newline. - stdin (input): read exactly one line (newline-terminated). That line is passed to the transition function.
Then the next step repeats forever.
Exit code policy
At EOF (stdin.getLine returns empty), REPL.run returns the previous step's code.
In this repo, PropLogicKernel/REPL.lean sets code = 0 iff all of the following hold:
newCount ≥ 1(at least one goal was successfully introduced vianew)sorrCount = 0(nosorrywas used)- goal stack is empty (all goals solved)
Otherwise code = 1.
Important nuance: parse/resolve errors do not directly force code 1; they keep the previous state. So if all goals were already solved and a later command fails, final code can still be 0.
Notes for clients
- Do not assume stdout and stderr are synchronized; a robust client should read both streams until it observes the prompt on stderr.
- Flush matters:
REPL/REPL.leanflushes stdout/stderr after writes so subprocess-driven clients do not hang on buffered output.
Python package spec
py_prop_logic_kernel is a Python-only wrapper around the built Lean binary.
py_prop_logic_kernel.Client:- starts
.lake/build/bin/Main-lean - sends lines to the REPL
- validates tactic surface syntax in Python before sending (including strict proposition parsing for
newandlem) - parses stderr status lines like
-- new_count N sorry_count M goals_remaining K - returns structured
Step(out, err, new_count, sorry_count, goals_remaining)
- starts
Client.send(line):- sends any supported REPL command, including
newandsorry
- sends any supported REPL command, including
Client.send_honest(line):- like
send, but ifneworsorryappears in the input line, it does not send the command and returns aStepwith the policy message inerr
- like
Client.finish():- closes stdin (EOF), allowing the Lean process to return its final
code - returns graceful exit code (
int) when graceful shutdown succeeds, elseNoneon timeout fallback
- closes stdin (EOF), allowing the Lean process to return its final
Client.init_prompt():- returns a human/AI-oriented summary of usage and tactic semantics
AI-generated code disclaimer
The following files were written by Cursor AI:
README.md- All Python code in this repo (for example:
py_prop_logic_kernel/) PropLogicKernel/Parser.lean
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file py_prop_logic_kernel-0.0.4.tar.gz.
File metadata
- Download URL: py_prop_logic_kernel-0.0.4.tar.gz
- Upload date:
- Size: 17.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48a24c27e80870179d908a2f7f1f4a638ee38232f6ffe948355fe53ea1be0730
|
|
| MD5 |
5c615c92b8adfe1cf829e66c8fbf7972
|
|
| BLAKE2b-256 |
b308f332599c2bfd14fd261ab9a6f0cf5c50676b1e72a000d5e9f1d72b547646
|
File details
Details for the file py_prop_logic_kernel-0.0.4-py3-none-any.whl.
File metadata
- Download URL: py_prop_logic_kernel-0.0.4-py3-none-any.whl
- Upload date:
- Size: 11.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0a88d8db09560cffdc164b130fe6d16c4c7a35d94a7542272e5ab8e97088e4d9
|
|
| MD5 |
b56b36181075a7b9c6d938689f736ef9
|
|
| BLAKE2b-256 |
3a328cad897d44fb1e7a1467011eea58dce911450ba9f138940e9845ee2b8007
|