Изабель: Как я могу определить две локали предка с одинаковыми, но не идентичными параметрами? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть структура локали, в которой определенная локаль появляется два раза как предок другой локали, один раз через наследование, а другой через последовательность из нескольких sublocale интерпретаций.Параметры двух экземпляров локали этого предка равны, но не идентичны (их равенство должно быть и может быть установлено с помощью доказательства).Как я могу заставить Изабель свернуть эти два экземпляра локали предка в один, как это было бы, когда параметры были идентичны?

Следующий минимальный пример демонстрирует мою ситуацию:

theory Diamond
  imports Main
begin

typedecl a
typedecl b
typedecl c

consts a_from_b :: "b ⇒ a"
consts b_from_a_and_c :: "[a, c] ⇒ b"

lemma equality: "a_from_b (b_from_a_and_c a c) = a"
  sorry

locale a =
  fixes a :: a

locale b =
  fixes b :: b
begin

sublocale a "a_from_b b" .

end

locale c = a +
  fixes c :: c
begin

sublocale b "b_from_a_and_c a c" .

end

end

Команда print_dependencies! c дает следующий вывод:

dependencies:
  a "a"
  a "a_from_b (b_from_a_and_c a c)"
  b "b_from_a_and_c a c"
  c "a" "c"

Очевидно, есть два экземпляра a.Как я могу использовать лемму, упомянутую в приведенном выше фрагменте кода, чтобы превратить эти два экземпляра локали в один экземпляр a "a"?Я пытался добиться этого, изменив интерпретацию sublocale в объявлении locale c следующим образом:

sublocale b "b_from_a_and_c a c" rewrites "a = a_from_b (b_from_a_and_c a c)"
  by (simp add: equality)

Однако это приводит к зависанию Изабель.

1 Ответ

0 голосов
/ 14 декабря 2018

Идея, упомянутая в самом конце вопроса, почти работает.Просто стороны уравнения rewrite необходимо поменять местами:

sublocale b "b_from_a_and_c a c" rewrites "a_from_b (b_from_a_and_c a c) = a"
  by (fact equality)

С этим изменением на месте print_dependencies! c дает следующий вывод:

dependencies:
  a "a"
  b "b_from_a_and_c a c"
  c "a" "c"
...