Powered by AppSignal & Oban Pro

Evaluation: A Structured Set of Higher-order Problems

examples/structured_hol_problems.livemd

Evaluation: A Structured Set of Higher-order Problems

Mix.install([
  {:shot_tx, path: Path.join(__DIR__, "..")},
  {:kino, "~> 0.19.0"},
  {:kino_atp_client, "~> 0.1.3"},
  {:kino_shot_ds, "~> 0.1.1"}
])

Setup

import ShotTx.Prover
import ShotDs.Hol.Sigils
defmodule Util do
  def render res do
    case res do
      {:thm, proof} ->
        frame = Kino.Frame.new()
        Kino.render(frame)
        diagram = proof |> ShotTx.Proof.to_mermaid |> Kino.Mermaid.new
        Kino.Frame.render frame, diagram
      other -> other
    end
  end
end
import Util
leibniz1 = """
thf(leibniz_t, type, l: A > A > $o).
thf(leibniz_def, definition,
  l = ^[X, Y]: ![P]: P @ X => P @ Y
).
"""
leibniz2 = """
thf(leibniz_t, type, l: A > A > $o).
thf(leibniz_def, definition,
  l = ^[X, Y]: ![P]: P @ X <= P @ Y
).
"""
leibniz3 = """
thf(leibniz_t, type, l: A > A > $o).
thf(leibniz_def, definition,
  l = ^[X, Y]: ![P]: P @ X <=> P @ Y
).
"""
andrews = """
thf(andrews_t, type, a: A > A > $o).
thf(andrews_def, definition,
  a = ^[X, Y]: ![Q]: ((![Z]: Q @ Z @ Z) => Q @ X @ Y)
).
"""
extensional = """
thf(extensional_t, type, e: (A>B) > (A>B) > $o).
thf(extensional_def, definition,
  e = ^[X, Y]: ![Z]: X @ Z = Y @ Z
).
"""
set_theory_types = """
thf(elem_t, type, elem: $i>($i>$o)>$o).
thf(set_t, type, set: $i>$i>$o).
thf(set_l1_t, type, set_l1: $i>$i>$o).
thf(set_l2_t, type, set_l2: $i>$i>$o).
thf(set_l3_t, type, set_l3: $i>$i>$o).
thf(set_a_t, type, set_a: $i>$i>$o).
thf(set_set_t, type, set_set: ($i>$o)>($i>$o)>$o).
thf(set_set_l1_t, type, set_set_l1: ($i>$o)>($i>$o)>$o).
thf(set_set_l2_t, type, set_set_l2: ($i>$o)>($i>$o)>$o).
thf(set_set_l3_t, type, set_set_l3: ($i>$o)>($i>$o)>$o).
thf(set_set_a_t, type, set_set_a: ($i>$o)>($i>$o)>$o).
thf(set_set_e_t, type, set_set_e: ($i>$o)>($i>$o)>$o).
thf(null_t, type, null: $i>$o).
thf(inter_t, type, inter: ($i>$o)>($i>$o)>$i>$o).
thf(union_t, type, union: ($i>$o)>($i>$o)>$i>$o).
thf(subset_t, type, subset: ($i>$o)>($i>$o)>$o).
thf(powerset_t, type, powerset: ($i>$o)>($i>$o)>$o).
"""

set_theory_defs = """
thf(elem_def, definition,
  elem = ^[X:$i, S:$i>$o]: S @ X
).
thf(set_def, definition,
  set = ^[X:$i, Y:$i]: X = Y
).
thf(set_l1_def, definition,
  set_l1 = ^[X:$i, Y:$i]: ![P:$i>$o]: P @ X => P @ Y
).
thf(set_l2_def, definition,
  set_l1 = ^[X:$i, Y:$i]: ![P:$i>$o]: P @ X <= P @ Y
).
thf(set_l3_def, definition,
  set_l1 = ^[X:$i, Y:$i]: ![P:$i>$o]: P @ X <=> P @ Y
).
thf(set_a_def, definition,
  set_a = ^[X:$i, Y:$i]: ![Q:$i>$i>$o]: ((![Z:$i]: Q @ Z @ Z) => Q @ X @ Y)
).
thf(set_set_def, definition,
  set_set = ^[X:$i>$o, Y:$i>$o]: X = Y
).
thf(set_set_l1_def, definition,
  set_set_l1 = ^[X:$i>$o, Y:$i>$o]: ![P:($i>$o)>$o]: P @ X => P @ Y
).
thf(set_set_l2_def, definition,
  set_set_l1 = ^[X:$i>$o, Y:$i>$o]: ![P:($i>$o)>$o]: P @ X <= P @ Y
).
thf(set_set_l3_def, definition,
  set_set_l1 = ^[X:$i>$o, Y:$i>$o]: ![P:($i>$o)>$o]: P @ X <=> P @ Y
).
thf(set_set_a_def, definition,
  set_set_a = ^[X:$i>$o, Y:$i>$o]: ![Q:($i>$o)>($i>$o)>$o]: ((![Z:$i>$o]: Q @ Z @ Z) => Q @ X @ Y)
).
thf(set_set_e_def, definition,
  set_set_e = ^[X:$i>$o, Y:$i>$o]: ![Z:$i]: X @ Z = Y @ Z
).
thf(null_def, definition,
  null = ^[Z:$i]: $false
).
thf(inter_def, definition,
  inter = ^[X:$i>$o, Y:$i>$o, Z:$i]: elem @ Z @ X & elem @ Z @ Y
).
thf(union_def, definition,
  union = ^[X:$i>$o, Y:$i>$o, Z:$i]: elem @ Z @ X | elem @ Z @ Y
).
thf(subset_def, definition,
  subset = ^[X:$i>$o, Y:$i>$o]: ![Z:$i]: elem @ Z @ X => elem @ Z @ Y
).
thf(powerset_def, definition,
  powerset = ^[X:$i>$o, Y:$i>$o]: subset @ Y @ X
).
"""

set_theory = set_theory_types <> set_theory_defs

Non-Theorems

res = prove ~p"""
thf(q_type, type, q : $i>$i>$o).
thf(conj,conjecture,
  (?[X:$i]: ![Y: $i]: q @ X @ Y) | (?[U:$i]: ![V:$i]: ~ (q @ V @ U))
).
"""

format_result res
# Timeout
res = prove ~p"""
thf(q_type, type, q: $i>$i>$o).
thf(conj,conjecture,
  ?[Y:$i]: ![X:$i]: ( (![Z:$i]: q @ X @ Z) | ~(q @ X @ Y) )
).
"""

format_result res
# Timeout
res = prove ~p"""
thf(conj, conjecture,
  ![F:$i>$i]: ?[X:$i]: F @ X = X
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![F:$i>$i]: ?[X:$i]: l @ (F @ X) @ X
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![F:$i>$i]: ?[X:$i]: l @ (F @ X) @ X
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![F:$i>$i]: ?[X:$i]: l @ (F @ X) @ X
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![F:$i>$i]: ?[X:$i]: a @ (F @ X) @ X
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![F:($i>$i)>$i>$i]: ?[X:$i>$i]: e @ (F @ X) @ X
).
"""

format_result res
# Timeout

Examples 4 & 5 (Choice)

res = prove ~f"""
(![X:$i]: ?[Y:$i]: r @ X @ Y) => (?[F:$i>$i]: ![X:$i]: r @ X @ (F @ X))
"""

format_result res
# THM
res = prove ~f"""
?[E:($i>$o)>$i]: ![P:$i>$o]: ( (![Y:$i]: P @ Y) => P @ (E @ P) )
"""

format_result res
# THM

Example 6 (Reflexivity, Commutativity, Transitivity)

a) Reflexivity

res = prove ~p"""
thf(conj, conjecture,
  ![X:$i]: X = X
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![X:$i]: l @ X @ X
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![X:$i]: l @ X @ X
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![X:$i]: l @ X @ X
).
"""

format_result res
# THM
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![X:$i]: a @ X @ X
).
"""

format_result res
# THM
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![X:$i>$i]: e @ X @ X
).
"""

format_result res
# THM

b) Commutativity

res = ~p"""
thf(conj, conjecture,
  ![X:$i, Y:$i]: ( (X = Y) => (Y = X) )
).
""" |> prove

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![X:$i, Y:$i]: ( (l @ X @ Y) => (l @ Y @ X) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![X:$i, Y:$i]: ( (l @ X @ Y) => (l @ Y @ X) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![X:$i, Y:$i]: ( (l @ X @ Y) => (l @ Y @ X) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![X:$i, Y:$i]: ( (a @ X @ Y) => (a @ Y @ X) )
).
"""

format_result res
# THM
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![X:$i>$i, Y:$i>$i]: ( (e @ X @ Y) => (e @ Y @ X) )
).
"""

format_result res
# Timeout

c) Transitivity

res = prove ~p"""
thf(conj, conjecture,
  ![X:$i, Y:$i, Z:$i]: ( ((X = Y) & (Y = Z)) => (X = Z) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![X:$i, Y:$i, Z:$i]: ( ((l @ X @ Y) & (l @ Y @ Z)) => (l @ X @ Z) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![X:$i, Y:$i, Z:$i]: ( ((l @ X @ Y) & (l @ Y @ Z)) => (l @ X @ Z) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![X:$i, Y:$i, Z:$i]: ( ((l @ X @ Y) & (l @ Y @ Z)) => (l @ X @ Z) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![X:$i, Y:$i, Z:$i]: ( ((a @ X @ Y) & (a @ Y @ Z)) => (a @ X @ Z) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![X:$i>$i, Y:$i>$i, Z:$i>$i]: ( ((e @ X @ Y) & (e @ Y @ Z)) => (e @ X @ Z) )
).
"""

format_result res
# Timeout

Example 7 (Congruence)

a) Congruence under endomorphisms

res = prove ~p"""
thf(conj, conjecture,
  ![X:$i, Y:$i, F:$i>$i]: (
    (X = Y) => (F @ X = F @ Y)
  )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![X:$i, Y:$i, F:$i>$i]: (
    (l @ X @ Y) => (l @ (F @ X) @ (F @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![X:$i, Y:$i, F:$i>$i]: (
    (l @ X @ Y) => (l @ (F @ X) @ (F @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![X:$i, Y:$i, F:$i>$i]: (
    (l @ X @ Y) => (l @ (F @ X) @ (F @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![X:$i, Y:$i, F:$i>$i]: (
    (a @ X @ Y) => (a @ (F @ X) @ (F @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![X:$i>$i, Y:$i>$i, F:($i>$i)>$i>$i]: (
    (e @ X @ Y) => (e @ (F @ X) @ (F @ Y))
  )
).
"""

format_result res
# Timeout

b) Congruence under predicates

res = prove ~p"""
thf(conj, conjecture,
  ![X:$i, Y:$i, P:$i>$o]: (
    (X = Y) => (P @ X => P @ Y)
  )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![X:$i, Y:$i, P:$i>$o]: (
    (l @ X @ Y) => ((P @ X) => (P @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![X:$i, Y:$i, P:$i>$o]: (
    (l @ X @ Y) => ((P @ X) => (P @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![X:$i, Y:$i, P:$i>$o]: (
    (l @ X @ Y) => ((P @ X) => (P @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![X:$i, Y:$i, P:$i>$o]: (
    (a @ X @ Y) => ((P @ X) => (P @ Y))
  )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![X:$i>$i, Y:$i>$i, P:($i>$i)>$o]: (
    (e @ X @ Y) => ((P @ X) => (P @ Y))
  )
).
"""

format_result res
# Timeout

Example 8 (Leibniz and Primitive Equality)

res = prove ~p"""
#{leibniz1}
thf(a_type, type, a: $i).
thf(b_type, type, b: $i).
thf(conj, conjecture,
  (l @ a @ b) => (a = b)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(a_type, type, a: $i).
thf(b_type, type, b: $i).
thf(conj, conjecture,
  (l @ a @ b) => (a = b)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(a_type, type, a: $i).
thf(b_type, type, b: $i).
thf(conj, conjecture,
  (l @ a @ b) => (a = b)
).
"""

format_result res
# Timeout

Example 9 (Trivial Directions of Extensionality)

a) Functional Extensionality

res = prove ~p"""
thf(conj, conjecture,
  ![F:$i>$i, G:$i>$i]: ( (F = G) => (![X:$i]: F @ X = G @ X) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![F:$i>$i, G:$i>$i]: ( (l @ F @ G) => (![X:$i]: (l @ (F @ X) @ (G @ X))) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![F:$i>$i, G:$i>$i]: ( (l @ F @ G) => (![X:$i]: l @ (F @ X) @ (G @ X)) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![F:$i>$i, G:$i>$i]: ( (l @ F @ G) => (![X:$i]: l @ (F @ X) @ (G @ X)) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![F:$i>$i, G:$i>$i]: ( (a @ F @ G) => (![X:$i]: a @ (F @ X) @ (G @ X)) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![F:$i>($i>$i), G:$i>($i>$i)]: ( (e @ F @ G) => (![X:$i]: e @ (F @ X) @ (G @ X)) )
).
"""

format_result res
# Timeout

b) Boolean Extensionality

res = prove ~p"""
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (A = B) => (A <=> B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (l @ A @ B) => (A <=> B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (l @ A @ B) => (A <=> B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (l @ A @ B) => (A <=> B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (a @ A @ B) => (A <=> B) )
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![A:$o>$o, B:$o>$o]: (
    (e @ A @ B) =>
    ((A @ $true <=> B @ $true) & (A @ $false <=> B @ $false))
  )
).
"""

format_result res
# THM

Example 10 (Non-trivial Direction of Boolean Extensionality)

res = prove ~p"""
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (A <=> B) => (A = B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (A <=> B) => (l @ A @ B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (A <=> B) => (l @ A @ B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (A <=> B) => (l @ A @ B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![A:$o, B:$o]: ( (A <=> B) => (a @ A @ B) )
).
"""

format_result res
# THM
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  ![A:$o>$o, B:$o>$o]: (
    ((A @ $true <=> B @ $true) & (A @ $false <=> B @ $false)) =>
    (e @ A @ B)
  )
).
"""

format_result res
# THM

Example 12 (Eta-expanded Extension)

res = prove with_context ~e[p:($i>$i)>$o, f:$i>$i], fn ->
  ~f"""
  p @ (^[X:$i]: f @ X) => p @ f
  """
end

format_result res
# THM

Example 13 (Extension with Identity)

res = prove ~p"""
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: f @ X = X) & p @ (^[X:$i]: X) => p @ (^[X:$i]: f @ X)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz1}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: l @ (f @ X) @ X) & p @ (^[X:$i]: X) => p @ (^[X:$i]: f @ X)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: l @ (f @ X) @ X) & p @ (^[X:$i]: X) => p @ (^[X:$i]: f @ X)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: l @ (f @ X) @ X) & p @ (^[X:$i]: X) => p @ (^[X:$i]: f @ X)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: a @ (f @ X) @ X) & p @ (^[X:$i]: X) => p @ (^[X:$i]: f @ X)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(f_type, type, f: ($i>$i)>$i>$i).
thf(p_type, type, p: (($i>$i)>$i>$i)>$o).
thf(conj, conjecture,
  (![X:$i>$i]: e @ (f @ X) @ X) & p @ (^[X:$i>$i]: X) => p @ (^[X:$i>$i]: f @ X)
).
"""

format_result res
# Timeout

Example 14 (Extension of Identity)

res = prove ~p"""
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: f @ X = X) & (p @ (^[X:$i]: X)) => p @ f
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz1}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: l @ (f @ X) @ X) & (p @ (^[X:$i]: X)) => p @ f
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: l @ (f @ X) @ X) & (p @ (^[X:$i]: X)) => p @ f
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: l @ (f @ X) @ X) & (p @ (^[X:$i]: X)) => p @ f
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(f_type, type, f: $i>$i).
thf(p_type, type, p: ($i>$i)>$o).
thf(conj, conjecture,
  (![X:$i]: a @ (f @ X) @ X) & (p @ (^[X:$i]: X)) => p @ f
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(f_type, type, f: ($i>$i)>$i>$i).
thf(p_type, type, p: (($i>$i)>$i>$i)>$o).
thf(conj, conjecture,
  (![X:$i>$i]: e @ (f @ X) @ X) & (p @ (^[X:$i>$i]: X)) => p @ f
).
"""

format_result res
# Timeout

Example 15 (Extensionality under Commutativity)

res = prove ~f"p @ (a & b) => p @ (b & a)"

format_result res
# THM
res = prove ~f"a & b & (p @ a) => (p @ b)"

format_result res
# THM

Example 16 (Extensionality for Conjunctions)

res = prove ~f"(p @ a) & (p @ b) => (p @ (a & b))"

format_result res
# THM

Example 17 (Unequality of Self-negation)

res = prove ~f"~ (a = (~a))"

format_result res
# THM

Example 18

res = prove ~p"""
thf(h_type, type, h:$o>$i).
thf(conj, conjecture,
  (h @ (h @ $true = h @ $false)) = h @ $false
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(h_type, type, h:$o>$i).
thf(conj, conjecture,
  l @ (h @ (l @ (h @ $true) @ (h @ $false))) @ (h @ $false)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(h_type, type, h:$o>$i).
thf(conj, conjecture,
  l @ (h @ (l @ (h @ $true) @ (h @ $false))) @ (h @ $false)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(h_type, type, h:$o>$i).
thf(conj, conjecture,
  l @ (h @ (l @ (h @ $true) @ (h @ $false))) @ (h @ $false)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(h_type, type, h:$o>$i).
thf(conj, conjecture,
  a @ (h @ (a @ (h @ $true) @ (h @ $false))) @ (h @ $false)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(h_type, type, h:$o>($i>$i)).
thf(conj, conjecture,
  e @ (h @ (e @ (h @ $true) @ (h @ $false))) @ (h @ $false)
).
"""

format_result res
# Timeout

Example 19

res = prove with_context ~e[p:($i>$i)>$o, f:$o>$i>$i, a:($i>$i)>$o, b:$o], fn ->
  ~f"p @ (^[X:$i]: f @ (a @ (^[X:$i]: f @ b @ X) & b) @ X) => p @ (f @ (b & a @ (f @ b)))"
end

format_result res
# THM

Example 20a) (DeMorgan)

res = prove ~f"X & Y <=> ~(~X | ~Y)"

format_result res
# THM

Example 20b) (DeMorgan)

res = prove ~p"""
thf(conj, conjecture,
  ![X:$o, Y:$o]: ( (X & Y) = (~(~X | ~Y)) )
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ![X:$o, Y:$o]: (l @ (X & Y) @ (~(~X | ~Y)))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ![X:$o, Y:$o]: (l @ (X & Y) @ (~(~X | ~Y)))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ![X:$o, Y:$o]: (l @ (X & Y) @ (~(~X | ~Y)))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ![X:$o, Y:$o]: (a @ (X & Y) @ (~(~X | ~Y)))
).
"""

format_result res
# Timeout

Example 20c) (DeMorgan)

res = prove ~p"""
thf(conj, conjecture,
  (^[U, V]: U & V) = (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  l @ (^[U, V]: U & V) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  l @ (^[U, V]: U & V) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  l @ (^[U, V]: U & V) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  a @ (^[U, V]: U & V) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  e @ (^[U, V]: U & V) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout

Example 20d) (DeMorgan)

res = prove ~p"""
thf(conj, conjecture,
  (&) = (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  l @ (&) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  l @ (&) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  l @ (&) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  a @ (&) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
thf(conj, conjecture,
  e @ (&) @ (^[X, Y]: ~(~X | ~Y))
).
"""

format_result res
# Timeout

Example 21 (Finite Domain of o→o)

res = prove ~f"""
(
  (p @ (^[X:$o]: X)) &
  (p @ (^[X:$o]: ~X)) &
  (p @ (^[X:$o]: $false)) &
  (p @ (^[X:$o]: $true))
) => ![Y:$o>$o]: p @ Y
"""

format_result res
# THM

Example 22 (Set Theory)

res = prove ~p"""
#{set_theory}
thf(conj, conjecture,
  (union @ a @ (inter @ b @ c)) = (inter @ (union @ a @ b) @ (union @ a @ c))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{set_theory}
#{leibniz1}
thf(conj, conjecture,
  l @ (union @ a @ (inter @ b @ c)) @ (inter @ (union @ a @ b) @ (union @ a @ c))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{set_theory}
#{leibniz2}
thf(conj, conjecture,
  l @ (union @ a @ (inter @ b @ c)) @ (inter @ (union @ a @ b) @ (union @ a @ c))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{set_theory}
#{leibniz3}
thf(conj, conjecture,
  l @ (union @ a @ (inter @ b @ c)) @ (inter @ (union @ a @ b) @ (union @ a @ c))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{set_theory}
#{andrews}
thf(conj, conjecture,
  a @ (union @ sa @ (inter @ b @ c)) @ (inter @ (union @ sa @ b) @ (union @ sa @ c))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{set_theory}
#{extensional}
thf(conj, conjecture,
  e @ (union @ a @ (inter @ b @ c)) @ (inter @ (union @ a @ b) @ (union @ a @ c))
).
"""

format_result res
# Timeout
res = prove ~p"""
#{set_theory}
thf(conj, conjecture,
  powerset @ null = set_set @ null
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz1}
#{set_theory}
thf(conj, conjecture,
  l @ (powerset @ null) @ (set_set_l1 @ null)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz2}
#{set_theory}
thf(conj, conjecture,
  l @ (powerset @ null) @ (set_set_l2 @ null)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{leibniz3}
#{set_theory}
thf(conj, conjecture,
  l @ (powerset @ null) @ (set_set_l3 @ null)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{andrews}
#{set_theory}
thf(conj, conjecture,
  a @ (powerset @ null) @ (set_set_a @ null)
).
"""

format_result res
# Timeout
res = prove ~p"""
#{extensional}
#{set_theory}
thf(conj, conjecture,
  e @ (powerset @ null) @ (set_set_e @ null)
).
"""

format_result res
# Timeout

Example 23

res = prove ~f"?[P:$o]: P"

format_result res
# THM

Example 24

res = prove ~f"~![P:$o]: P"

format_result res
# THM

Example 25

res = prove ~f"?[N:$o>$o]: ![P:$o]: N @ P <=> ~P"

format_result res
# THM

Example 26

res = prove ~p"""
thf(conj, conjecture,
  ~![F:$o>$o]: ?[X:$o]: F @ X = X
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz1}
thf(conj, conjecture,
  ~![F:$o>$o]: ?[X]: l @ (F @ X) @ X
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz2}
thf(conj, conjecture,
  ~![F:$o>$o]: ?[X]: l @ (F @ X) @ X
).
"""

format_result res
# THM
res = prove ~p"""
#{leibniz3}
thf(conj, conjecture,
  ~![F:$o>$o]: ?[X]: l @ (F @ X) @ X
).
"""

format_result res
# THM
res = prove ~p"""
#{andrews}
thf(conj, conjecture,
  ~![F:$o>$o]: ?[X]: a @ (F @ X) @ X
).
"""

format_result res
# Timeout

Example 27

res = prove ~f"?[D:$o>$o>$o]: ![P:$o, Q:$o]: D @ P @ Q <=> (P | Q)"

format_result res
# Timeout

Example 28

res = prove ~f"?[Q:($i>$o)>$o]: ![P:$i>$o]: Q @ P <=> ![X:$i]: P @ X"

format_result res
# Timeout

Example 29

res = prove ~f"?[N:$o>$o]: ![P:$o]: N @ P <=> P"

format_result res
# THM

Example 20: Surjective Cantor Theorem

res = prove ~f"~?[G:$i>$i>$o]: ![F:$i>$o]: ?[J:$i]: G @ J = F"

format_result res
# THM

Example 21: Injective Cantor Theorem

res = prove ~f"~?[H:($i>$o)>$i]: ![P:$i>$o, Q:$i>$o]: H @ P = H @ Q => P = Q"

format_result res
# Timeout