Требования к программе
Основные требования к программе связаны с особенностями языка Пролог, одна из которых - так называемая инвертируемость прологовских предикатов (процедур). В процедурах и функциях большинства операторных языков программирования (Паскаль, Си и др.) фиксируется, какие параметры (аргументы) являются входными (input), какие выходными (output), т.е. фиксируется направления передачи значений этих аргументов. Прологовский же предикат обычно допускает многообразное использование, т.е. один и тот же аргумент может быть как входным (при одних вычислениях), так и выходным (при других вычислениях), что связано с декларативным пониманием предиката как отношения между объектами. Например, предикат member (E, L), определяемый предложениями
member (E, [E| L]).
member (E, [Z| L]):- member (E, L).
и истинный, если E есть элемент списка L, допускает следующие варианты использования:
?-member (b, [a, b, c]): значения обоих аргументов заданы, результат вычислений - истинность данного отношения;
?-member (Х, [a, b, c]): задано значение только второго аргумента, результат вычислений (значение Х) - объекты, которые могут быть элементами заданного списка;
?-member (b, У): задан лишь первый аргумент, результат - списки, которые можно составить из объекта-элемента b.
Зафиксированные направления передачи значений аргументов (внутрь/вовне или input/output) предиката часто называют образцом или прототипом передачи (flow pattern), для его записи используются буквы i и o, а также скобки. Для рассмотренного предиката member соответствующие прототипы записываются как: (i, i), (o, i), (i, o). Таким образом, инвертируемый предикат - это предикат, допускающий несколько образцов передачи.
Другая часто встречающаяся особенность предикатов Пролога - недетерминированность. Предикат называется недетерминированным, если его вычисление может дать более одного решения/результата. Точнее говорить о недерминированности (или детерминированности) образцов передачи предиката. Например, для предиката member недетерминированными являются образцы (o, i) и (i, o).
|