Редактирование: МФСП, 05 семинар (от 29 сентября)
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
- | + | лгебраические спецификации в rsl. | |
- | + | Чстный случай аксиом. спецификации. Имеет след. собенности: | |
- | # На первом шаге | + | # На первом шаге фрм. абстрактные типы, с ктрым мы хтим рабтть, и целевй тип, кторый мделир. специфиц. систему. |
- | # | + | # писываются сигнатуры функций. Тольк сигнтуры. |
- | # | + | # Фрмулируются аксиомы специальнго вида: _i(f_i(x), ..., f_n(x)) == expr. Это требуется для выявления свйств, не пр. их. |
Пример: | Пример: | ||
Строка 19: | Строка 19: | ||
Мы прошли первых два этапа. | Мы прошли первых два этапа. | ||
- | Для удобства принято | + | Для удобства принято выд. дв типа перций: генератор (операция, прим. ктрой позв. плучить любое знач. целевого типа). Тут их два: insert, empty. Генертры и среди перндов имеет целевй тип, и знач — цеевой тип. Операции, к-рые называются observer, не меняют целевй тип, а возвр. инф., связнную с ним. И модификторы. Частный случай генератора, но с пмощью них нельзя плучить любое знач. целевого типа. Но при этм они меняют цел. тип. |
- | Для | + | Для чег нужна эта классиф? Чтобы неким разумным обр. сформ. правила, по которым форм. аксимы нашей системы. бычно, дст. сфрм. аксиому для каждй пары observer-generator, observer-modificator. Иногда также бывает делть пльзено аксимы для связи modiicator-generator, они избыточны бычн, но нглядны. |
- | Теперь будем | + | Теперь будем выпис. аксиомы, удовл. нашей операции: |
* defined_empty | * defined_empty | ||
* defined_insert | * defined_insert | ||
Строка 31: | Строка 31: | ||
lookup_empty — не имеет смысла, опущена. | lookup_empty — не имеет смысла, опущена. | ||
- | Далее | + | Далее выпис. все аксимы, используя в кач. арг. раз. переменные, кторые потм змык. квантором всеобщности. Правя чсть аксиом пишется сотв. семнтике. Если функ. част. спец., т небх. опр. предусловия. |
'''axiom''' | '''axiom''' | ||
- | ∀ k : Key & | + | ∀ k : Key ˙ defined(k, empty) == false |
- | ∀ k_1, k_2 : Key & | + | ∀ k_1, k_2 : Key ˙ ∀ r : Record ˙ ∀ db : Database ˙ defined(k_1, insert(k_2, r, db)) == (k_1 = k_2) ∨ defined(k_1, db) |
- | ∀ k_1, k_2 : Key & | + | ∀ k_1, k_2 : Key ˙ ∀ db : Database ˙ defined(k_1, remove(k_2, db)) == (k_1 ≠ k_2) ∧ defined(k_1, db) |
- | ∀ k_1, k_2 : Key & | + | ∀ k_1, k_2 : Key ˙ ∀ r : Record ˙ ∀ db : Database ˙ lookup(k_1, insert(k_2, r, db)) == if k_1 = k_2 then r else lookup(k_1, db) |
'''pre''' (k_1 = k_2) ∨ defined(k_1, db) | '''pre''' (k_1 = k_2) ∨ defined(k_1, db) | ||
- | ∀ k_1, k_2 : Key & | + | ∀ k_1, k_2 : Key ˙ ∀ db : Database ˙ lookup(k_1, remove(k_2, db)) == lookup(k_1, db) |
'''pre''' (k_1 ≠ k_2) ∧ defined(k_1, db) | '''pre''' (k_1 ≠ k_2) ∧ defined(k_1, db) | ||
- | Почему эт | + | Почему эт нз. алг. спец? |
- | Потому что этот | + | Потому что этот пдх из функ. пргр. Мы этими ксимми задаём алгебр. отношения. |
- | Сам | + | Сам прцесс пректирвния программы в технологии RAISE. |
- | # | + | # Фрмулировка типов. Выбр целевого типа |
# Написание сигнатур. (Как в ООП: выбираем классы, и пишем методы) | # Написание сигнатур. (Как в ООП: выбираем классы, и пишем методы) | ||
- | # | + | # Фрмулируем акиомы, связ. функции, исп. алг. пдхд. В рез-те получается алг. спецификция. |
- | # | + | # Псле чег итерцинно идёт пшаговая реализация. |
#* Уточнить тип | #* Уточнить тип | ||
- | #* | + | #* Спецификция функции |
- | #* При этом | + | #* При этом небходимо соблюдать непротиврчеивость исх. аксиом алг. спецификации. |
- | Прверять каждую | + | Прверять каждую акс. и дказывать руками тяжело, есть авт. средства, но на практикуме оно не потребуется. |
- | Пример (из примера пр БД): допустим, мы на | + | Пример (из примера пр БД): допустим, мы на некем шаге релиз. решили, что |
'''type''' | '''type''' | ||
Database = Key × Record-set | Database = Key × Record-set | ||
Строка 62: | Строка 62: | ||
empty : Database = {} | empty : Database = {} | ||
- | defined(k,db) = ∃r : Record & | + | defined(k,db) = ∃r : Record ˙ (k, r) ∈ db |
- | Теперь | + | Теперь прверим, что специф. не пртивор. аксиоме: |
[define_empty] | [define_empty] | ||
- | ∀ k : Key & | + | ∀ k : Key ˙ defined(k, empty) == false |
- | &fora;; k : Key & | + | &fora;; k : Key ˙ ∃r : Record ˙ (k, r) ∈ {} == false |
- | У нас | + | У нас матлг был, метды резолюции знаем, всё очевидно. Левая часть тжд. равна false, false==false, аксиома выполняется. |
- | На практикуме | + | На практикуме форм. док. треб. не будет, но если бн. противоречие, то плх, надо переделать. |
- | Задача: | + | Задача: пострить алг. спец. стека со след. функциями: поместить в стек, удалить верх элемент, прверить на пустоту, прверить вкерх. значение без. удаления. |
'''type''' | '''type''' | ||
Строка 83: | Строка 83: | ||
peek : Stack → с влной Item; /*obs*/ | peek : Stack → с влной Item; /*obs*/ | ||
- | Аксиомы (для | + | Аксиомы (для кждой пары obs_gen, obs_mod): |
* is_empty_push | * is_empty_push | ||
- | * is_empty_pop — аксиому | + | * is_empty_pop — аксиому сфрмулировать не можем |
* peek_push | * peek_push | ||
* peek_pop | * peek_pop | ||
'''axiom''' | '''axiom''' | ||
- | ∀ i : Item & | + | ∀ i : Item ˙ ∀ st : Stack ˙ is_empty(push(i, st)) == false; |
- | ∀ i : Item & | + | ∀ i : Item ˙ ∀ st : Stack ˙ peek(push(i, st)) == i; |
- | В результате получилось две | + | В результате получилось две аксимы, для описания тсек этого мало. Поэтому нм необх. рассм. аксимы для случая ген_модиф. |
'''axiom''' | '''axiom''' | ||
- | ∀ i : Item & | + | ∀ i : Item ˙ ∀ st : Stack ˙ pop(push(i, st)) == st |
- | Достаточно ли это для | + | Достаточно ли это для пис. стека? Наверное, нет, пэтому введём константу empty: |
'''value''' | '''value''' | ||
empty : Stack /*gen*/ | empty : Stack /*gen*/ | ||
'''axiom''' | '''axiom''' | ||
- | is_empty(empty) | + | is_empty(empty) == true |
- | peek(empty) | + | peek(empty) == chaos |
- | Этого вполне | + | Этого вполне дост. для написания реализации на алг. языке. |
- | + | Пстр. алг. спец. очыереди: add, remove, is_empty, peek, size | |
'''type''' | '''type''' | ||
Строка 131: | Строка 131: | ||
'''axiom''' | '''axiom''' | ||
- | is_empty(empty) | + | is_empty(empty) == true; |
- | ∀ i : Item & | + | ∀ i : Item ˙ ∀ q : Queue ˙ is_empty(add(i, q)) == false |
- | ∀ q : Queue & | + | ∀ q : Queue ˙ is_empty(remove(q)) == (size(q) = 1) |
'''pre''' size(q) > 0 | '''pre''' size(q) > 0 | ||
- | peek(empty) | + | peek(empty) == chaos; |
- | ∀ i : Item & | + | ∀ i : Item ˙ ∀ q : Queue ˙ peek(add(i, q)) == if is_empty(q) then i else peek(q) end; |
- | size(empty) | + | size(empty) == 0; |
- | ∀ i : Item & | + | ∀ i : Item ˙ ∀ q : Queue ˙ size(add(i, q)) == size(q) + 1 |
- | ∀ i : Item & | + | ∀ i : Item ˙ ∀ q : Queue ˙ size(remove(q)) == size(q) - 1 |
'''pre''' size(q) > 0 | '''pre''' size(q) > 0 | ||
- | Далее, | + | Далее, исп. эту спец., предл. релиз. чередь на базе списков, и проверить непротивречивость. |
'''type''' | '''type''' | ||
Строка 150: | Строка 150: | ||
'''value''' | '''value''' | ||
empty : Queue = <>; | empty : Queue = <>; | ||
- | add(i, q) | + | add(i, q) == q^<i> |
- | remove(q) | + | remove(q) == tl q |
- | is_empty(q) | + | is_empty(q) == q = empty |
peek(q) = q(1) | peek(q) = q(1) | ||
size(q) = len q | size(q) = len q | ||
- | + | Доказтельство аксиомы peek(add) | |
- | peek(add(i, q)) | + | peek(add(i, q)) == if is_empty(q) then i else peek(q) end; |
- | (q^ | + | (q^<i>)(1) == if q = empty then i else q(1) end; |
- | + | Доказтельство size(add) | |
- | size(add(i, q)) | + | size(add(i, q)) == size(q) + 1 |
- | len(q ^ | + | len(q ^ <i>) == len(q) + 1 |
{{МФСП}} | {{МФСП}} | ||
{{Lection-stub}} | {{Lection-stub}} |