6.2Подцели предложений
Подцелями предложения служат вызовы предикатов.
«Вызовом предиката» называется синтаксическая конструкция,
определяющая экземпляр класса, в котором этот вызов должен быть исполнен,
тип вызова (ближний или дальний), а также атомарную формулу вызова. Различаются
ближние и дальние, а также простые и акторные вызовы предикатов.
Вызов предиката называется «дальним», если в подцели
явным образом (с помощью переменной или атрибута) указан мир, в котором он должен
быть исполнен. Если соответствующий мир не указан, вызов предиката называется
«ближним». Исполнение ближнего вызова осуществляется в том же самом мире, в
котором исполняется рассматриваемое предложение.
Акторными вызовами предикатов называются подцели предложений,
определяющие акторы. Если про вызов предиката не сказано, что он является акторным,
такой вызов называется (является) простым.
подцель =
простая.подцель |
бинарное_отношение
"[" [ термы_и_выражения ] "]" |
"!"
простая.подцель =
[ [ целевой_параметр ] инфикс_подцели ] простой_атом
инфикс_подцели = " ? " | " << " I " <— "
Если инфикс подцели равен «<<» или «< —», в
качестве простого атома этой подцели не разрешается использовать метапеременные.
Подцель [V1,...,Vk] обозначает встроенный управляющий
оператор copy(V1,... ,Vk). Подцель «!» обозначает встроенный управляющий
оператор отсечения '!'.
Пример.
Правильно построенные предложения:
clause_1(M,N,J):-
M*2 + N<7 — ? f(J),_______________________простой ближний вызов
console ? write("N=",N).__________________простой дальний вызов
clause_2(K,1,N,L*):-
check(K, slot ? p(N) ),___________________простой ближний вызов
? p(N,7,L)._______________________________простой ближний вызов
6.2.1 Вызовы функций
«Вызовом функции» называется синтаксическая конструкция,
имитирующая вызов подпрограммы-функции.
В составе предложений разрешается использовать следующие вызовы функций:
вызов_функции_в_предложении =
[ целевой_параметр ]"?" простой_атом
целевой_параметр "[" термы_и_выражения "]"
В качестве простых атомов в составе вызовов функций не
разрешается использовать метапеременные.
Если в составе вызова функции целевой параметр не задан
явно, целевым параметром считается предопределённый атрибут self.
В результате трансляции вызовы функций вида
W?p(A1,A2.....Аn)
преобразуются в вызовы предикатов вида
W?p(R,A1,A2.....Аn),
а вызовы функций вида
X[A1,A2.....Аn]
— в вызовы предикатов вида
X ? element(R,A1,A2__An) ,
где R — некоторая уникальная переменная, обозначающая
результат функции и помещаемая на место транслируемого вызова функции.
В случае если вызов функции используется в составе некоторой
подцели SA, вызов предиката SB, соответствующий этому вызову функции,
добавляется в состав предложения перед подцелью SA. При этом гарантируется,
что подцель SB будет помещена перед любой другой подцелью, в состав которой
войдёт переменная R, обозначающая результат рассматриваемого вызова функции,
но после всех подцелей, находившихся перед подцелью SA в исходном предложении.
Если вызов функции используется в заголовке предложения вида
Заголовок:- Конъюнкция, S.
Если вызов функции FC1 в заголовке предложения входит в состав
другого вызова функции FC2, в этом случае FC1 рассматривается как вызов функции,
входящий в состав подцелей предложения, поставленных в соответствие вызову функции FC2.
Пример.
Определение функции append.
Определение функции append, добавляющей элементы в конец списка,
append([],L) = L
append([H|L1],L2) = [Н | ?append(L1,L2)].
соответствует процедуре вида
append(L,[],L). append(R0,[H|L1],L2):-
append(R1,L1,L2),
R0 == [H | R1].
6.2.2 Выражения
Выражение — это видоизменённый вызов функции:
выражение =
[ выражение аддитивный_оператор ] слагаемое
выражение аддитивный_оператор терм
слагаемое =
[ слагаемое мультипликативный_оператор ] множитель
слагаемое мультипликативный_оператор терм
множитель = [ "—" ] "(" выражение ")"
Для построения выражений используется ограниченный набор знаков операций,
в состав которого входят следующие математические символы:
аддитивный_оператор = "+" | "—"
мультипликативный_оператор = "*" | "/"
Выражение, построенное с помощью инфиксного знака операции,
эквивалентно вызову функции вида
?функтор(аргумент1,аргумент2),
где функтор — знак операции, заключённый в апострофы,
аргумент1 и аргумент2 — операнды, стоящие соответственно слева
и справа от знака операции.
Выражение, построенное с помощью префиксного знака операции « —», эквивалентно вызову функции вида
?' —'(аргумент),
аргументом которой является операнд выражения.
Пример.
Правильно построенные выражения:
1+H*-(E)/4+(W+"A4"-319eO), T*X+(7-"t")-Y
Содержание