Current section
Files
Jump to
Current section
Files
lib/atp_client.ex
defmodule AtpClient do
@moduledoc """
Elixir client for external automated theorem provers.
Four backends are supported:
* **SystemOnTPTP** — public tptp.org HTTP form API; see
`AtpClient.SystemOnTptp`.
* **StarExec** — self-hosted StarExec instances; see `AtpClient.StarExec`.
* **Isabelle** — `isabelle server` instances via `isabelle_elixir`; see
`AtpClient.Isabelle`.
* **LocalExec** — a locally installed TPTP-compliant prover binary
(e.g. E, Vampire) invoked via `System.cmd/3`; see `AtpClient.LocalExec`.
Run `scripts/build_eprover.sh` to install E into `priv/bin/`.
Each backend reads its settings through `AtpClient.Config`, which layers
`config/config.exs` on top of the library defaults and lets per-call options
override everything. See the `AtpClient.Config` module docs for details.
## Configuration
Settings are resolved from three sources, in increasing precedence:
1. Library defaults (declared in `AtpClient`'s `mix.exs`).
2. Application environment (typically `config/config.exs`).
3. Per-call keyword options passed to the relevant function.
Only the settings required by the backends you actually use need to be set.
# config/config.exs
import Config
config :atp_client, :sotptp,
# The default points at tptp.org; override for a mirror or internal
# deployment:
url: "https://tptp.org/cgi-bin/SystemOnTPTPFormReply",
default_time_limit_sec: 10
config :atp_client, :starexec,
base_url: "https://starexec.example.org/starexec",
username: System.get_env("STAREXEC_USER"),
password: System.get_env("STAREXEC_PASS")
config :atp_client, :isabelle,
host: "isabelle.example.org",
port: 9999,
password: System.get_env("ISABELLE_PASSWORD"),
session: "HOL"
# Same-host setups need nothing more — `:local_dir` defaults to a
# subdirectory of `System.tmp_dir!/0`. Only set `:local_dir` and
# `:isabelle_dir` when the two sides see the directory under different
# paths (containers, Cygwin).
config :atp_client, :local_exec,
binary: "eprover",
args: ["--auto", "--tstp-format", "--cpu-limit=10"],
cpu_timeout_s: 10
Any setting may be overridden for a single call:
AtpClient.Isabelle.query(theory, "Example", session: "Main", raw: true)
"""
@backends [
AtpClient.SystemOnTptp,
AtpClient.StarExec,
AtpClient.Isabelle,
AtpClient.LocalExec
]
@doc """
Returns the modules implementing `AtpClient.Backend`. Iterate this in a
configuration UI to discover what's wireable without hard-coding the list.
"""
@spec backends() :: [module()]
def backends, do: @backends
end