Использование подхода типа к множествам для определения отношений - PullRequest
1 голос
/ 10 марта 2020

Изабель имеет некоторую автоматизацию для частной аргументации через фактор-пакет. Я хотел бы посмотреть, полезна ли эта автоматизация для моего примера . Соответствующие определения:

definition e_proj where "e_proj = e'_aff_bit // gluing"

Поэтому я пытаюсь написать:

typedef e_aff_t = e'_aff_bit
quotient_type e_proj_t = "e'_aff_bit" / "gluing

Однако я получаю ошибку:

Дополнительные переменные типа в представлении set: "'a" Вышеуказанные ошибки произошли в typedef "e_aff_t"

Поскольку, как Мануэль Эберл объясняет здесь , у нас не может быть определений типов, которые зависят от параметров типа , В прошлом мне предлагалось использовать подход типа «наборы» .

Как этот подход будет работать в моем примере? Приведет ли это к большей автоматизации?

1 Ответ

1 голос
/ 10 марта 2020

В прошлом мне предлагалось использовать подход типа наборов ...

В моем предыдущем ответе предлагалось использовать стандартный набор основанная инфраструктура для рассуждений о факторах. Я только упомянул, что существуют другие варианты для полноты.


Я по-прежнему считаю, что лучше не использовать Types-To-Sets, при условии, что определение фактор-типа является единственной причиной, по которой вы sh будете использовать Types-To-Sets :

  1. Даже с Types-To-Sets, вы сможете имитировать c поведение фактор-типа только в локальном контексте с некоторыми дополнительными допущениями. Выйдя из локального контекста, теоремы, использующие локально определенные фактор-типы, необходимо будет преобразовать в теоремы на основе множеств, которые неизбежно будут опираться на стандартную инфраструктуру на основе множеств для рассуждений о факторах.
  2. Потребуется разработать дополнительную инфраструктуру Изабель / ML, прежде чем можно будет использовать локальное правило определения типа для удобного локального определения фактор-типов. Не должно быть слишком сложно разработать инфраструктуру, которая будет использоваться, но потребуется некоторое время, чтобы разработать что-то, что будет универсально применимо. Лично я не считаю это приложение достаточно важным, чтобы тратить на него свое время.

На мой взгляд, использование Types-To-Sets возможно только для локального определения фактор-типов, если вы уже используете Types-To-Sets по прямому назначению в данной разработке. Затем возможность использования структуры для определения типовых факторов локально можно рассматривать как «добавленную стоимость».


Для полноты изложения приведу пример, который я разработал для ответа на список рассылки некоторое время go. Конечно, это всего лишь демонстрация концепции, а не решение, которое можно использовать для работы, предназначенной для публикации в той или иной форме. Чтобы сделать это полезным, нужно преобразовать эту разработку в команду Isabelle / ML, которая автоматически позаботится обо всех деталях.

theory Scratch
  imports Main
    "HOL-Types_To_Sets.Prerequisites"
    "HOL-Types_To_Sets.Types_To_Sets"
begin


locale local_typedef =
  fixes R :: "['a, 'a] ⇒ bool"
  assumes is_equivalence: "equivp R"
begin

(*The exposition subsumes some of the content of
 HOL/Types_To_Sets/Examples/Prerequisites.thy*)
context
  fixes S and s :: "'s itself"
  defines S: "S ≡ {x. ∃u. x = {v. R u v}}"
  assumes Ex_type_definition_S:
    "∃(Rep::'s ⇒ 'a set) (Abs::'a set ⇒ 's). type_definition Rep Abs S"
begin

definition "rep = fst (SOME (Rep::'s ⇒ 'a set, Abs). type_definition Rep
Abs S)"
definition "Abs = snd (SOME (Rep::'s ⇒ 'a set, Abs). type_definition Rep
Abs S)"

definition "rep' a = (SOME x. a ∈ S ⟶ x ∈ a)"
definition "Abs' x = (SOME a. a ∈ S ∧ a = {v. R x v})"

definition "rep'' = rep' o rep"
definition "Abs'' = Abs o Abs'"

lemma type_definition_S: "type_definition rep Abs S"
  unfolding Abs_def rep_def split_beta'
  by (rule someI_ex) (use Ex_type_definition_S in auto)

lemma rep_in_S[simp]: "rep x ∈ S"
  and rep_inverse[simp]: "Abs (rep x) = x"
  and Abs_inverse[simp]: "y ∈ S ⟹ rep (Abs y) = y"
  using type_definition_S
  unfolding type_definition_def by auto

definition cr_S where "cr_S ≡ λs b. s = rep b"
lemmas Domainp_cr_S = type_definition_Domainp[OF type_definition_S
cr_S_def, transfer_domain_rule]
lemmas right_total_cr_S = typedef_right_total[OF type_definition_S
cr_S_def, transfer_rule]
  and bi_unique_cr_S = typedef_bi_unique[OF type_definition_S cr_S_def,
transfer_rule]
  and left_unique_cr_S = typedef_left_unique[OF type_definition_S cr_S_def,
transfer_rule]
  and right_unique_cr_S = typedef_right_unique[OF type_definition_S
cr_S_def, transfer_rule]

lemma cr_S_rep[intro, simp]: "cr_S (rep a) a" by (simp add: cr_S_def)
lemma cr_S_Abs[intro, simp]: "a∈S ⟹ cr_S a (Abs a)" by (simp add: cr_S_def)

(* this part was sledgehammered - please do not pay attention to the
(absence of) proof style *)
lemma r1: "∀a. Abs'' (rep'' a) = a"
  unfolding Abs''_def rep''_def comp_def
proof-
  {
    fix s'
    note repS = rep_in_S[of s']
    then have "∃x. x ∈ rep s'" using S equivp_reflp is_equivalence by force
    then have "rep' (rep s') ∈ rep s'"
      using repS unfolding rep'_def by (metis verit_sko_ex')
    moreover with is_equivalence repS have "rep s' = {v. R (rep' (rep s'))
v}"
      by (smt CollectD S equivp_def)
    ultimately have arr: "Abs' (rep' (rep s')) = rep s'"
      unfolding Abs'_def by (smt repS some_sym_eq_trivial verit_sko_ex')
    have "Abs (Abs' (rep' (rep s'))) = s'" unfolding arr by (rule
rep_inverse)
  }
  then show "∀a. Abs (Abs' (rep' (rep a))) = a" by auto
qed

lemma r2: "∀a. R (rep'' a) (rep'' a)"
  unfolding rep''_def rep'_def
  using is_equivalence unfolding equivp_def by blast

lemma r3: "∀r s. R r s = (R r r ∧ R s s ∧ Abs'' r = Abs'' s)"
  apply(intro allI)
  apply standard
  subgoal unfolding Abs''_def Abs'_def
    using is_equivalence unfolding equivp_def by auto
  subgoal unfolding Abs''_def Abs'_def
    using is_equivalence unfolding equivp_def
    by (smt Abs''_def Abs'_def CollectD S comp_apply local.Abs_inverse
mem_Collect_eq someI_ex)
  done

definition cr_Q where "cr_Q = (λx y. R x x ∧ Abs'' x = y)"

lemma quotient_Q: "Quotient R Abs'' rep'' cr_Q"
  unfolding Quotient_def
  apply(intro conjI)
  subgoal by (rule r1)
  subgoal by (rule r2)
  subgoal by (rule r3)
  subgoal by (rule cr_Q_def)
  done

(* instantiate the quotient lemmas from the theory Lifting *)
lemmas Q_Quotient_abs_rep = Quotient_abs_rep[OF quotient_Q]
(*...*)

(* prove the statements about the quotient type 's *)
(*...*)

(* transfer the results back to 'a using the capabilities of transfer -
not demonstrated in the example *)
lemma aa: "(a::'a) = (a::'a)"
  by auto

end

thm aa[cancel_type_definition]
(* this shows {x. ∃u. x = {v. R u v}} ≠ {} ⟹ ?a = ?a *)

end

...