Использование альтернативных доменов
Представление данных требует большого числа структур. В ТП эти структуры должны быть описаны. Возникает трудность с преедикатами, работающими с объектами этих доменов. Для устранения недостатков ТП предлагает пользователю альтернативное описание доменов.
domains
предмет разные_вещи (вещь);
книга (автор, название);
пластинка (альюом, артист, тип);
имя, вещь, автор, название, артист,
альбом, тип = symbol
predicates
имеет (имя, предмет)
clauses
имеет (тои, разные_вещи (авто)).
имеет (джон, книга («Войнич», «Овод»).
имеет (билл, пастинка («Мадонна», Мадонна, эстрада)
Программа использует 3 структуры: разные вещи, книга и пластинка. Все они объединены под одним именем, что позволило вывести очень простой предикат имеет (имя, предмет).
использование альтернативных доменов позволяет писать в утверждении предикат имеет применительно к разным классам. При отсутствии этой конструкции требовалось бы написать 3 предиката.
Заметим, что термы разные_вещи, книга, пластинка являются именами структур. Однако, когда они появляются в предикатных выражениях, то одновременно играют и роль имен функторов. ТП не делает различия между функторами и доменами структур. Это средство введено в ТП преднамеренно, так как оно очень удобно именно в декларативных языках.
/* Пермещение курсора по экрану */
domains
movement = up (step);
down (step);
left (step);
right (step);
no
row, column, step = integer
predicates
move_cursor (row, column, movement)
clauses
move_cursor (R, C, up (step)):- cursor (R,C), R1=R-step, cursor (R1, C).
move_cursor (R, C, down (step)):- cursor (R,C), R1=R+step, cursor (R1, C).
move_cursor (R, C, left (step)):- cursor (R,C), C1=C-step, cursor (R, C1).
move_cursor (R, C, right(step)):- cursor (R,C), C1=C+step, cursor (R, C1).
move_cursor (R, C, no):- cursor (R,C).
Стандартный предикат cursor (строка, столбец) (integer, integer) : (i, i) (o, o)
(i, i) – перемещение курсора в заданную позицию в текущем активном окне.
(o, o) – связь параметров строка и столбец с текущей позицией курсора.