Редактирование: МФСП, 05 семинар (от 29 сентября)
Материал из eSyr's wiki.
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия | Ваш текст | ||
Строка 1: | Строка 1: | ||
== Алгебраические спецификации в RSL == | == Алгебраические спецификации в RSL == | ||
- | + | Чстный случай аксиом. спецификации. Имеет след. собенности: | |
- | # На первом шаге | + | # На первом шаге фрм. абстрактные типы, с ктрым мы хтим рабтть, и целевй тип, кторый мделир. специфиц. систему. |
- | # | + | # писываются сигнатуры функций. Тольк сигнтуры. |
- | # | + | # Фрмулируются аксиомы специальнго вида: _i(f_i(x), ..., f_n(x)) &equal; 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 • defined(k, empty) &equal; false | ∀ k : Key • defined(k, empty) &equal; false | ||
Строка 41: | Строка 41: | ||
'''pre''' (k_1 ≠ k_2) ∧ defined(k_1, db) | '''pre''' (k_1 ≠ k_2) ∧ defined(k_1, db) | ||
- | Почему эт | + | Почему эт нз. алг. спец? |
- | Потому что этот | + | Потому что этот пдх из функ. пргр. Мы этими ксимми задаём алгебр. отношения. |
Сам процесс проектирования программы в технологии RAISE. | Сам процесс проектирования программы в технологии RAISE. | ||
# Формулировка типов. Выбор целевого типа | # Формулировка типов. Выбор целевого типа | ||
# Написание сигнатур. (Как в ООП: выбираем классы, и пишем методы) | # Написание сигнатур. (Как в ООП: выбираем классы, и пишем методы) | ||
- | # Формулируем аксиомы, | + | # Формулируем аксиомы, связ. функции, исп. алг. подход. В рез-те получается алг. спецификация. |
# После чего итерационно идёт пошаговая реализация. | # После чего итерационно идёт пошаговая реализация. | ||
#* Уточнить тип | #* Уточнить тип | ||
#* Спецификация функции | #* Спецификация функции | ||
- | #* При этом необходимо соблюдать непротиворечивость | + | #* При этом необходимо соблюдать непротиворечивость исх. аксиом алг. спецификации. |
- | Прверять каждую | + | Прверять каждую акс. и дказывать руками тяжело, есть авт. средства, но на практикуме оно не потребуется. |
- | Пример (из примера пр БД): допустим, мы на | + | Пример (из примера пр БД): допустим, мы на некем шаге релиз. решили, что |
'''type''' | '''type''' | ||
Database = Key × Record-set | Database = Key × Record-set | ||
Строка 64: | Строка 64: | ||
defined(k,db) = ∃r : Record • (k, r) ∈ db | defined(k,db) = ∃r : Record • (k, r) ∈ db | ||
- | Теперь | + | Теперь прверим, что специф. не пртивор. аксиоме: |
[define_empty] | [define_empty] | ||
∀ k : Key • defined(k, empty) &equal; false | ∀ k : Key • defined(k, empty) &equal; false | ||
&fora;; k : Key • ∃r : Record • (k, r) ∈ {} &equal; false | &fora;; k : Key • ∃r : Record • (k, r) ∈ {} &equal; false | ||
- | У нас | + | У нас матлг был, метды резолюции знаем, всё очевидно. Левая часть тжд. равна false, false&equal;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 | ||
Строка 93: | Строка 93: | ||
∀ i : Item • ∀ st : Stack • peek(push(i, st)) &equal; i; | ∀ i : Item • ∀ st : Stack • peek(push(i, st)) &equal; i; | ||
- | В результате получилось две | + | В результате получилось две аксимы, для описания тсек этого мало. Поэтому нм необх. рассм. аксимы для случая ген_модиф. |
'''axiom''' | '''axiom''' | ||
∀ i : Item • ∀ st : Stack • pop(push(i, st)) &equal; st | ∀ i : Item • ∀ st : Stack • pop(push(i, st)) &equal; st | ||
- | Достаточно ли это для | + | Достаточно ли это для пис. стека? Наверное, нет, пэтому введём константу empty: |
'''value''' | '''value''' | ||
empty : Stack /*gen*/ | empty : Stack /*gen*/ | ||
Строка 105: | Строка 105: | ||
peek(empty) &equal; chaos | peek(empty) &equal; chaos | ||
- | Этого вполне | + | Этого вполне дост. для написания реализации на алг. языке. |
- | + | Пстр. алг. спец. очыереди: add, remove, is_empty, peek, size | |
'''type''' | '''type''' | ||
Строка 144: | Строка 144: | ||
'''pre''' size(q) > 0 | '''pre''' size(q) > 0 | ||
- | Далее, | + | Далее, исп. эту спец., предл. релиз. чередь на базе списков, и проверить непротивречивость. |
'''type''' | '''type''' | ||
Строка 156: | Строка 156: | ||
size(q) = len q | size(q) = len q | ||
- | + | Доказтельство аксиомы peek(add) | |
peek(add(i, q)) &equal; if is_empty(q) then i else peek(q) end; | peek(add(i, q)) &equal; if is_empty(q) then i else peek(q) end; | ||
(q^<i>)(1) &equal; if q = empty then i else q(1) end; | (q^<i>)(1) &equal; if q = empty then i else q(1) end; | ||
- | + | Доказтельство size(add) | |
size(add(i, q)) &equal; size(q) + 1 | size(add(i, q)) &equal; size(q) + 1 | ||
len(q ^ <i>) &equal; len(q) + 1 | len(q ^ <i>) &equal; len(q) + 1 |