Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Акторный Пролог.pdf
Скачиваний:
37
Добавлен:
01.05.2014
Размер:
1.91 Mб
Скачать

6.2. ПОДЦЕЛИ ПРЕДЛОЖЕНИЙ

57

оно преобразуется к виду

p(E,A1,A2,. . . ,An):– Конъюнкция, S.

При этом все вызовы функций S, входящие в состав терма E, выносятся в конец предложения, после подцелей «Конъюнкция». Вызовы функций S всегда помещаются после любых других вызовов функций, вынесенных в конец предложения из его заголовка.

Ссылки: вызов функции 6.2.1, заголовок предложения 6, значение терма 3, метапеременная 3, объявление функции 6.1.3, подцель предложения 6.2, предложение 6, простой атом 6.1.1, терм 3, терм или выражение 3.2.1.

6.2Подцели предложений

Подцелями предложения служат вызовы предикатов.

«Вызовом предиката» называется синтаксическая конструкция, определяющая экземпляр класса, в котором этот вызов должен быть исполнен, тип вызова (ближний или дальний), а также атомарную формулу вызова. Различаются ближние и дальние, а также простые и акторные вызовы предикатов.

Вызов предиката называется «дальним», если в подцели явным образом (с помощью переменной или атрибута) указан мир, в котором он должен быть исполнен. Если соответствующий мир не указан, вызов предиката называется «ближним». Исполнение ближнего вызова осуществляется в том же самом мире, в котором исполняется рассматриваемое предложение.

Акторными вызовами предикатов называются подцели предложений, определяющие акторы. Если про вызов предиката не сказано, что он является акторным, такой вызов называется (является) простым.

подцель = простая подцель |

бинарное отношение | “[” [ термы и выражения ] “]” | “!”

простая подцель = [ [ целевой параметр ] инфикс подцели ] простой атом

инфикс подцели = “?” | “<<” | “<−”

58

Глава 6. ПРЕДЛОЖЕНИЯ КЛАССОВ

Если инфикс подцели равен «<<» или «<−», в качестве простого атома этой подцели не разрешается использовать метапеременные.

Подцель [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).

– – простой ближний вызов

Ссылки: актор 7.1, атом 6.1, атрибут 4.1.1, бинарное отношение 6.1.2, встроенный оператор 8, инфикс подцели 6.2, исполнение предиката 6.3.1, исполнение предложения 6.3.2, метапеременная 3, мир 5.1, отсечение 8, переменная 2.1.1, предложение 6, простой атом 6.1.1, термы и выражения 3.2.1, целевой параметр 4.1.3, copy 8.2.

6.2.1Вызовы функций

«Вызовом функции» называется синтаксическая конструкция, имитирующая вызов подпрограммы-функции.

В составе предложений разрешается использовать следующие вызовы функций:

вызов функции в предложении = [ целевой параметр ] “?” простой атом |

целевой параметр “[” термы и выражения “]”

В качестве простых атомов в составе вызовов функций не разрешается использовать метапеременные.

Если в составе вызова функции целевой параметр не задан явно, целевым параметром считается предопределённый атрибут self.

Врезультате трансляции вызовы функций вида W ? p(A1,A2,. . . ,An)

6.2. ПОДЦЕЛИ ПРЕДЛОЖЕНИЙ

59

преобразуются в вызовы предикатов вида

W? p(R,A1,A2,. . . ,An) ,

авызовы функций вида

X[A1,A2,. . . ,An]

в вызовы предикатов вида

X? element(R,A1,A2,. . . ,An) ,

где R — некоторая уникальная переменная, обозначающая результат функции и помещаемая на место транслируемого вызова функции.

В случае если вызов функции используется в составе некоторой подцели SA, вызов предиката SB, соответствующий этому вызову функции, добавляется в состав предложения перед подцелью SA. При этом гарантируется, что подцель SB будет помещена перед любой другой подцелью, в состав которой войдёт переменная R, обозначающая результат рассматриваемого вызова функции, но после всех подцелей, находившихся перед подцелью SA в исходном предложении.

Если вызов функции используется в заголовке предложения вида

Заголовок:– Конъюнкция.

и не является составной частью другого вызова функции, вызов предиката S, соответствующий этому вызову функции, добавляется в состав предложения после конъюнкции подцелей «Конъюнкция»:

Заголовок:– Конъюнкция, S.

Если вызов функции FC1 в заголовке предложения входит в состав другого вызова функции FC2, в этом случае FC1 рассматривается как вызов функции, входящий в состав подцелей предложения, поставленных в соответствие вызову функции FC2.

Примечание. В соответствии с правилами исполнения вызова предиката, определёнными в разделе 6.3.1, вызовами функций считаются также такие подцели метапредложений, атомарная формула которых является метапеременной, при условии что рассматриваемое метапредложение поставлено в соответствие вызову функции.

60

Глава 6. ПРЕДЛОЖЕНИЯ КЛАССОВ

Пример. Определение функции append.

Определение функции append, добавляющей элементы в конец списка,

append([ ],L) = L.

append([H|L1],L2) = [H | ?append(L1,L2)].

соответствует процедуре вида

append(L,[ ],L). append(R0,[H|L1],L2):–

append(R1,L1,L2), R0 == [H | R1].

Ссылки: атом 6.1, атрибут 4.1.1, вызов предиката 6.2, заголовок предложения 6, исполнение предиката 6.3.1, конъюнкция 6, метапеременная 3, метапредложение 6, объявление функции 6.1.3, переменная 2.1.1, подцель доказательства 6.3.1, подцель предложения 6.2, предложение 6, простой атом 6.1.1, процедура 6, список 3.2.2, термы и выражения 3.2.1, функция 6.1.3, целевой параметр 4.1.3, self 4.1.1, ’==’ 3.3.

6.2.2Выражения

Выражение — это видоизменённый вызов функции:

выражение = [ выражение аддитивный оператор ] слагаемое |

выражение аддитивный оператор терм слагаемое =

[ слагаемое мультипликативный оператор ] множитель | слагаемое мультипликативный оператор терм

множитель = [ “−” ] “(” выражение “)”

Для построения выражений используется ограниченный набор знаков операций, в состав которого входят следующие математические символы:

аддитивный оператор = “+” | “−” мультипликативный оператор = “ ” | “/”

Выражение, построенное с помощью инфиксного знака операции, эквивалентно вызову функции вида