2014-08-27 2 views

ответ

1

Чтобы получить представление о том, как это работает, вы должны в первую очередь думать о том, как вы бы это доказать на бумаге. Как вы видите на

term "Id" 

Id представляет собой набор пар (типа ('a * 'a) set). Таким образом, вам нужно показать равенство двух множеств. Канонический способ сделать это - показать, что каждый набор является подмножеством другого.

Давайте начнем с Id^* ⊆ Id. Как показать, что набор является подмножеством другого? Точно, показывают, что каждый элемент из «меньше» устанавливается также элемент «больше» один, то есть,

fix x y 
assume "(x, y) ∈ Id^*" 
then show "(x, y) ∈ Id" 

Поскольку транзитивное замыкание определяется индуктивно, мы можем сделать это по индукции следующим

by (induct) simp_all 

То есть использовать правило индукции по умолчанию для предпосылки формы (_, _) ∈ _^* (что бывает rtrancl_induct), а затем упростить базовый регистр, а также индуктивный футляр.

Еще раз, полное доказательство

lemma 
    "Id^* ⊆ Id" 
proof (rule subrelI) 
    fix x y 
    assume "(x, y) ∈ Id^*" 
    then show "(x, y) ∈ Id" 
    by (induct rule: rtrancl_induct) simp_all 
qed 

Другое направление остается в качестве упражнения.

1

Если вы просто вызовите кувалды (через панель или через try), то вы сразу же получите доказательство:

by (metis rtrancl_empty rtrancl_idemp) 
0

Я до сих пор новичок в этом. Я полагаю, что все доказательство Isar - это что-то вроде:

lemma "Id^* = Id" 
proof (rule equalityI) 
    show "Id^* ⊆ Id" 
    proof (rule subrelI) 
    fix x y 
    assume "(x, y) ∈ Id^*" 
    then show "(x, y) ∈ Id" 
    by (induct) simp_all 
    qed 
next 
    show "Id ⊆ Id^*" 
    proof (rule subrelI) 
    fix x y 
    assume "(x, y) ∈ Id" 
    then show "(x, y) ∈ Id^*" 
    by (auto) 
    qed 
qed 
+0

Нечего угадывать, когда Изабель принимает доказательство, это прекрасно;) – chris