ATP Development with Elixir
Mix.install([
{:shot_tx, github: "jcschuster/ShotTx"},
{:kino_atp_client, "~> 0.1.4"}
])
Setup
defmodule Util do
def render res do
case res do
{:thm, proof} -> do_render proof
{:csa, _model, proof} -> do_render proof
{:timeout, partial_proof} -> do_render partial_proof
other -> other
end
end
defp do_render proof do
frame = Kino.Frame.new
Kino.render(frame)
diagram = proof |> ShotTx.Proof.to_mermaid |> Kino.Mermaid.new
Kino.Frame.render frame, diagram
end
end
import Util
import ShotDs.Hol.Sigils
import ShotDs.Parser
import ShotDs.Util.Formatter
import ShotTx.Prover
default_to_debug = false
form =
Kino.Control.form(
[
name: Kino.Input.checkbox("Print debug logs", default: default_to_debug)
],
report_changes: true
)
set_logger_debug = fn
true -> Logger.configure(level: :debug)
false -> Logger.configure(level: :error)
end
Kino.listen(form, fn event -> set_logger_debug.(event.data.name) end)
set_logger_debug.(default_to_debug)
form
Custom DSLs: Parsing Input via Sigils
# TPTP encoding for ∀ x, y. ∃ p. (p x) ⊃ (p y)
~f"![X: $i, Y: $i]: ?[P: $i>$o]: P @ X => P @ Y"
|> format! |> IO.puts
# Parsing TPTP problems
~p"""
thf(p_type, type, p: $i>$o).
thf(c_type, type, c: $i).
thf(ax1, axiom, p @ c).
thf(conj, conjecture,
?[X: $i]: P @ X
).
""" |> format! |> IO.puts
Proof Tree Rendering with Kino and Mermaid
res = prove ~f"![P, Q]: P & Q => Q & P", simplification: :none
IO.puts format_result res
render res
res = prove ~f"![P: $i>$o]: P @ a | P @ b => P @ b", simplification: :none
IO.puts format_result res
render res
Truth Grounding: ATPClient with SmartCell
# Generated by SystemOnTPTP Smart Cell
problem = "thf(test, conjecture,\r\n ![P: $o, Q: $o]: ((P & Q) => (Q & P))\r\n)."
system_name = "Leo-III---1.7.20"
time_limit = 5
case AtpClient.SystemOnTptp.query_system(problem, system_name, time_limit_sec: time_limit, raw: true) do
{:ok, result} ->
IO.puts(result)
result
{:error, reason} ->
raise "Error: #{inspect(reason)}"
end