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



Содержание