从 forall exists 事实中获取函数

Getting a function from a forall exists fact

我的目标是从 ∀ x 形式的事实中得到一个函数常量 f 。 ∃ y 。 P x y 使得∀ x 。 P×(f×)。这是我手动执行的方法:

theory Choose
imports
Main
begin

lemma
  fixes P :: "nat ⇒ nat ⇒ nat ⇒ nat ⇒ nat ⇒ bool"
  shows True
proof -

  (* Somehow obtained this fact *)
  have I: "∀ n m :: nat . ∃ i j k . P n m i j k"
    by sorry

  (* Have to do the rest by hand *)
  define F
    where "F ≡ λ n m . SOME (i, j, k) . P n m i j k"
  define i
    where "i ≡ λ n m . fst (F n m)"
  define j
    where "j ≡ λ n m . fst (snd (F n m))"
  define k
    where "k ≡ λ n m . snd (snd (F n m))"

  have "∀ n m . P n m (i n m) (j n m) (k n m)"
    (* prove manually (luckily sledgehammer finds a proof)*)

(*...*)

qed

(* or alternatively: *)

lemma
  fixes P :: "nat ⇒ nat ⇒ nat ⇒ nat ⇒ nat ⇒ bool"
  shows True
proof -

  (* Somehow obtained this fact *)
  have I: "∀ n m :: nat . ∃ i j k . P n m i j k"
    by sorry

  obtain i j k where "∀ n m . P n m (i n m) (j n m) (k n m)"
    (* sledgehammer gives up (due to problem being too higher order?) *)
    (* prove by hand :-( *)

(*...*)

qed

如何更符合人体工学?伊莎贝尔有类似的东西吗 精益选择策略(https://leanprover-community.github.io/mathlib_docs/tactics.html#choose) ? (Isabelles 规范命令仅适用于顶层 :-( ).

(很抱歉,如果有人问过这个问题,我真的没有找到一个好的流行语来搜索这个问题)

我认为没有任何东西可以使这个用例自动化。您可以直接使用 choice 规则来避免摆弄 SOME;它可以让你把一个‘∀∃’变成一个‘∃∀’。但是,您仍然必须首先将 P 从具有 5 个参数的柯里化 属性 转换为具有两个参数的元组,然后再次解包结果。我没有办法解决这个问题。我会这样做:

let ?P' = "λ(n,m). λ(i,j,k). P n m i j k" 
have I: "∀n m. ∃i j k. P n m i j k"
  sorry
hence "∀nm. ∃ijk. ?P' nm ijk"
  by blast
hence "∃f. ∀nm. ?P' nm (f nm)"
  by (rule choice) (* "by metis" also works *)
then obtain f where f: "?P' (n, m) (f (n, m))" for n m
  by auto

define i where "i = (λn m. case f (n, m) of (i, j, k) ⇒ i)"
define j where "j = (λn m. case f (n, m) of (i, j, k) ⇒ j)"
define k where "k = (λn m. case f (n, m) of (i, j, k) ⇒ k)"
have ijk: "P n m (i n m) (j n m) (k n m)" for n m
  using f[of n m] by (auto simp: i_def j_def k_def split: prod.splits)

原则上,我确信这可以自动化。我不认为 specification 命令应该只在顶层工作而不是在本地上下文或什至 Isar 证明中工作的任何理由,除了它是旧的并且没有人愿意这样做。也就是说,这当然意味着相当多的实施工作,我个人遇到这样的情况相对较少,而且如上所述手动应用选择的样板还不错。

但是如果能实现自动化当然更好!