Алгебраическая спецификация [1] [2] [3] [4] — это метод разработки программного обеспечения для формального описания поведения системы. Это был очень активный предмет исследований в области компьютерных наук около 1980 года. [5]
Алгебраическая спецификация стремится систематически разрабатывать более эффективные программы путем:
Алгебраическая спецификация достигает этих целей, определяя один или несколько типов данных и указывая набор функций, которые работают с этими типами данных. Эти функции можно разделить на два класса:
Рассмотрим формальную алгебраическую спецификацию для булевого типа данных.
Одна из возможных алгебраических спецификаций может предоставлять две функции-конструктора для элемента данных: конструктор true и конструктор false . Таким образом, элемент данных boolean может быть объявлен, сконструирован и инициализирован значением. В этом сценарии все другие соединительные элементы , такие как XOR и AND , будут дополнительными функциями . Таким образом, элемент данных может быть инстанцирован либо со значением «true», либо со значением «false», а дополнительные функции могут использоваться для выполнения любой операции над элементом данных.
В качестве альтернативы, вся система булевых типов данных может быть определена с использованием другого набора функций-конструкторов: конструктор false и конструктор not . В этом случае можно определить дополнительную функцию true для получения значения not false , и следует добавить уравнение .
Таким образом, алгебраическая спецификация описывает все возможные состояния элемента данных и все возможные переходы между состояниями. [ необходима ссылка ]
Для более сложного примера целые числа можно указать (помимо многих других способов, выбрав один из многочисленных формализмов) с помощью двух конструкторов
1 : Я (_ - _) : Z × Z -> Z
и три уравнения:
(1 - (1 - п)) = п ((1 - (н - п)) - 1) = (п - п) ((p1 - n1) - (n2 - p2)) = (p1 - (n1 - (p2 - n2))
Легко проверить, что уравнения верны, учитывая обычную интерпретацию двоичной функции «минус». (Имена переменных были выбраны так, чтобы намекнуть на положительный и отрицательный вклад в значение.) Приложив немного усилий, можно показать, что, применяемые слева направо, они также образуют конфлюэнтную и завершающую систему переписывания, отображающую любой сконструированный термин в однозначную нормальную форму, представляющую соответствующее целое число:
... (((1 - 1) - 1) - 1) ((1 - 1) - 1) (1 - 1) 1 (1 - ((1 - 1) - 1)) (1 - (((1 - 1) - 1) - 1)) ...
Следовательно, любая реализация, соответствующая этой спецификации, будет вести себя как целые числа или, возможно, их ограниченный диапазон , как обычные целочисленные типы, встречающиеся в большинстве языков программирования.