Лекции по семантика на езиците за програмиране


Ербранови алгебрични структури



страница6/6
Дата10.04.2018
Размер3.6 Mb.
#65977
ТипЛекции
1   2   3   4   5   6
Ербранови алгебрични структури

Нека = ((c1, c2, …, cr), (f1, f2, …, fm), (T1, T2, …, Tk)) е език от първи ред.

При това, нека r  1, т.е. в езика има константни символи.

Алгебрична система E = (H, (a1, a2, …, ar), (F1, F2, …, Fm), (P1, P2, …, Pk)

в се нарича ербранова, ако тя изпълнява следните условия:


  1. H е множеството от всички основни термове в .

  2. ai = ci, i = 1, 2, …, r.

  3. За всяко i = 1, 2, …, m, ако fi е n-местен функционален символ, то Fi (1, 2, …, n) = fi (1, 2, …, n) за произволни основни термове

1, 2, …, n.

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


Твърдение: Нека  (X1, X2, …, Xn) е терм в , v е оценка в

ербранова E в . Тогава е в сила равенството



v () =  (X1/v (X1), X2/v (X2), …, Xn/v (Xn)).

Доказателство: индукция по построението на .

Нека  е константа,  = ci, i  { 1, 2, …, r }. Тогава v () = ai = ci и

 (X1/v (X1), X2/v (X2), …, Xn/v (Xn)) = ci.

Нека  е променлива,  = Xi, i  { 1, 2, …, n }. Тогава v () = v (Xi) и

 (X1/v (X1), X2/v (X2), …, Xn/v (Xn)) = v (Xi).

Нека  = fi (1, 2, …, l), където fi е l-местен функционален символ и твърдението е изпълнено за термовете 1, 2, …, l.

Тогава v () = Fi (v (1), v (2), …, v (n)) = Fi (1 (X1/v (X1), …, Xn/v (Xn)), …,

l (X1/v (X1), …, Xn/v (Xn))) = fi (1 (X1/v (X1), …, Xn/v (Xn)), …,

l (X1/v (X1), …, Xn/v (Xn))) = fi (1, 2, …, l)(X1/v (X1), X2/v (X2), …, Xn/v (Xn)) =  (X1/v (X1), X2/v (X2), …, Xn/v (Xn)). Използвали сме индукционното предположение и дефиницията за ербранова структура.


Следствие: Ако  е затворен терм в , v е оценка в

ербранова E в , то v () = .


Следствие: Нека A = Tj (1 (X1, X2, …, Xn), 2 (X1, X2, …, Xn), …,

l (X1, X2, …, Xn)), j  { 1, 2, …, k } е атомарна формула в (Tj е l-местен функционален символ) и v е оценка в ербранова E в .

Тогава E, v A  Pj (1, 2, …, l) = true,

където j = j (X1/v (X1), X2/v (X2), …, Xn/v (Xn)), j = 1, 2, …, n.


Следствие: Нека A = Tj (1, 2, …, l) е основен атом, j  { 1, 2, …, k },

1, 2, …, l са основни термове. Тогава E A  Pj (1, 2, …, l) = true.


И трите следствия са очевидни, затова не привеждаме доказателства.
Нека E е ербранова алгебрична система. Да означим с

множеството от всички основни атоми, които са вярни в E.

Ясно е, че E еднозначно определя . Ще покажем, че е в сила и обратното. Нека M е произволно множество от основни атоми.

Определяме ербранова алгебрична система E, като задаваме интерпретация на предикатните символи:

за всяко j  { 1, 2, …, k}, ако Tj е n-местен предикатен символ, то

Pj (1, 2, …, n) = true, ако Tj (1, 2, …, n)  M,

Pj (1, 2, …, n) = false, ако Tj (1, 2, …, n)  M

за прозволни основни термове 1, 2, …, n.

От горното следствие, E Tj (1, 2, …, n)  Pj (1, 2, …, n) = true 

 Tj (1, 2, …, n)  MM = . По този начин можем да отъждествяваме всяка ербранова алгебрична система с множеството от вярните основни атоми в нея. Нека M е множество от основни атоми.

Нека F е формула в . Бележим M F, ако F, където е ербрановата алгебрична система съответна на M.

Още казваме, че M е ербранов модел на F.

Естествено, ако A е основен атом, то M A  A  M.

Ако v е произволна оценка бележим M, v F, ако , v F.

С M* ще бележим множеството от всички основни атоми в .
Нека C е хорнова клауза, C = X1X2…Xs (A (X1, X2, …, Xs) 

 B1 (X1, X2, …, Xs)  B2 (X1, X2, …, Xs)  … Bn (X1, X2, …, Xs)).

Означаваме с C формулата A  B1  B2  … Bn.

Всяка формула D = C (X1/1, X2/2, …, Xn/n), където 1, 2, …, n са основни термове, наричаме частен случай на хорновата клауза C.

Основният атом A (X/) наричаме глава на частния случай D.

Крайното множество от основни атоми { Bi (X/) | i  { 1, 2, …, n } } наричаме опашка на частния случай D. Главата на D бележим с head (D), а опашката бележим с tail (D).


Твърдение: Нека MM*. Нека C е хорнова клауза.

Тогава M C  M D за всеки частен случай D на C.

Доказателство: нека C = X1X2…Xs (A (X)  B1 (X)  B2 (X)  …

 Bn (X)). Нека M C и D е частен случай на C, D = C (X/).

Нека v е оценка, такава че v (Xi) = i, i = 1, 2, …, s.

Имаме M, v C  M, v C  M, v A или М, v B1 или …или



M, v Bn  A (X/)  M или B1 (X/)  M или …или Bn (X/)  M

M A (X/) или М, v B1 (X/) или …или M, v Bn (X/) 

M A (X/)  B1 (X/)  … Bn (X/), т.е. M C (X/)  M D.

Обратно, нека M D за всеки частен случай D на C.

Ще покажем, че M C. Достатъчно е да покажем, че M C.

Нека v е оценка. Нека v (Xi) = i, i = 1, 2, …, n. Естествено, C (X/) е частен случай на C. Имаме M C (X/)  M A (X/) или



М, v B1 (X/) или …или M, v Bn (X/)  М, v A или

М, v B1 или …или M, v BnM, v C. Така M, v C за всяка оценка vM C  М C.
Следствие: Нека MM*. Нека P е логическа програма.

Тогава M PM е модел на всеки частен случай на

хорнова клауза от P.

Доказателство: M PМ е модел на всяка хорнова клауза от P

M е модел на всеки частен случай на хорнова клауза от P.
Твърдение: Нека MM*. Нека C е хорнова клауза, D е частен

случай на C. Тогава M D  tail (D)  M  head (D)  M.

Доказателство: нека D = A  B1  B2  … Bn, където A, Bi,

i = 1, 2, …, n са основни атоми. Тогава M D  M A или М B1

или …или M Bn  А  М или B1M или …или BnM

 head (D)  M или tail (D)  M  tail (D)  M  head (D)  M.


Твърдение: Всяка логическа програма P има поне един ербранов модел.

Доказателство: ще покажем, че M* е ербранов модел на P.

Имаме M* PM* е модел на всеки частен случай на

хорнова клауза от P  tail (D)  M*  head (D)  M* за всеки частен случай D на хорнова клауза от P. Последното е изпълнено, тъй като M* се състои от всички основни атоми.


Нека P е логическа програма. Означаваме с MP сечението на всички ербранови модели на P. От предното твърдение това сечение е добре дефинирано.
Твърдение: MP е модел на P.

Доказателство: нека D е частен случай на хорнова клауза от P.

Да предположим, че tail (D)  MP. Нека M е произволен ербранов

модел на P. Имаме MPM  tail (D)  M  head (D)  M, тъй като M е ербранов модел на P. Така head (D) лежи във всеки ербранов модел на P  head (D)  MP. Така MP P.

Моделът MP на P се нарича най-малък ербранов модел на P.
Теорема: МP = OUTPUT (P) за всяка логическа програма P.

Доказателство: нека A  OUTPUT (P). Тогава P A. Имаме MP P

MP A  A  MP. Така OUTPUT (P)  MP.

За обратното включване ще покажем, че OUTPUT (P) е модел на P.

Нека D е частен случай на хорнова клауза от P.

Нека tail (D)  OUTPUT (P). Тогава P B за всеки основен

атом B  tail (D). Ще покажем, че P head (D).

Нека е произволен модел на P. Тогава е модел на всеки частен случай на всяка хорнова клауза от P D  B за някоя

B  tail (D) или head (D). Oт друга страна, P B за всяко B  tail (D), P B за всеки B  tail (D). Така head (D).

Получихме, че P head (D), т.е. head (D)  OUTPUT (P) 

 OUTPUT (P) е ербранов модел на PMP  OUTPUT (P).

Като комбинираме двете включвания получаваме МP = OUTPUT (P).


Нека P е логическа програма. Означаваме с M* множеството от всички основни атоми в и с P (M*) множеството от всички

подмножества на M*. Да напомним, че P (M*) = (P (M*), , ) е

област на Скот. Дефинираме изображение TP : P (M*)  P (M*) по следния начин: TP (M) = { A | съществува частен случай D на хорнова клауза от P, такъв че A = head (D) и tail (D)  M }.
Твърдение: Дефинираното TP е непрекъснато изображение на

P (M*) в P (M*).

Доказателство: първо ще покажем, че TP е монотонно.

Нека MN. Нека A  TP (M). Тогава съществува частен случай D на хорнова клауза от P, такъв че A = head (D) и tail (D)  M

съществува частен случай D на хорнова клауза от P, такъв че

A = head (D) и tail (D)  N  A  TP (N). Така TP (M)  TP (N).

Нека M0M1  … Mk  …е монотонна редица от елементи на P (M*).

Достатъчно е да покажем, че TP ( ) = .

Естествено, от монотонността имаме TP ( ).

Нека A  TP ( ). Тогава съществува частен случай D на хорнова клауза от P, такъв че A = head (D) и tail (D)  . Тъй като tail (D) е крайно множество, то съществува k  N, такова че tail (D)  Mk.

При това положение, A  TP (Mk). Така TP ( )  и твърдението е доказано.
От теоремата на Кнастер-Тарски TP притежава най-малка неподвижна точка. Да я означим с LP, LPM*. Да напомним, че LP също е най-малка квазинеподвижна точка.
Твърдение: Нека MM* е ербранов модел на P. Тогава TP (M)  M.

Доказателство: нека A  TP (M). Тогава съществува частен случай C на хорнова клауза от P, такъв че A = head (D) и tail (D)  M. Тъй като M е ербранов модел на P, то M е модел на D, tail (D)  M  A  M.

Така TP (M)  M.
Следствие: LPMP.

Доказателство: тъй като MP е модел на P, то TP (MP)  MPMP е квазинеподвижна точка на TPLPMP, тъй като LP е най-малка квазинеподвижна точка на TP.


Твърдение: Нека TP (M)  M. Тогава M е ербранов модел на P.

Доказателство: нека D е частен случай на хорнова клауза от P.

Да предположим, че tail (D)  M. Тогава head (D)  TP (M) 

head (D)  M. Така M е ербранов модел на P.


Следствие: МPLP.

Доказателство: имаме TP (LP)  LP, тъй като LP е квазинеподвижна точка на TP. Тогава LP е ербранов модел на PМPLP.


И така показахме равенствата OUTPUT (P) = MP = LP за всяка логическа програма P. Тези равенства са известни като теорема на Ван Емден-Ковалски.
Нека P е логическа програма, MM*. Твърдение от вида

OUTPUT (P)  M наричаме твърдение за частична коректност на програмата P. От горните твърдения е ясно, че такова твърдение следва от всяко едно от следните твърдения: TP (M)  M, M е модел на P.

Твърдение от вида OUTPUT (P) = M наричаме твърдение за тотална коректност на програмата P. Твърденията за тотална коректност са значително по-силни и се доказват по-трудно.
Ще разгледаме един пример. Нека P е следната логическа програма:

is_int (0) & X (is_int (f (X))  is_int (X)). В PROLOG тази програма се записва по следния начин:

is_int (0).

is_int (f (X)) :- is_int (X).

Нека M = { is_int (fn (0)) | n = 0, 1, …}.

Ще покажем, че OUTPUT (P)  M.

Както отбелязахме, достатъчно е да покажем, че TP (M)  M.

Нека A  TP (M). Тогава съществува частен случай D на хорнова клауза от P, такъв че A = head (D) и tail (D)  M. Ако D е частен случай на първата клауза, то D = is_int (0), tail (D) = , A = is_int (0)  A  M.

Нека D е частен случай на втората клауза. Имаме tail (D) = { is_int (X/) }, където  e основен терм, tail (D)  M  is_int (X/)  M   = fn (0) за някое n  N. При това положение, A = head (D) = is_int (f (X))(X/) =

= is_int (f (X))(X/fn (0)) = is_int (fn+1 (0))  M.

Така TP (M)  M  OUTPUT (P)  M.
Схеми на програми.
Стандартни схеми
Нека = ((c1, c2, …, cr), (f1, f2, …, fm), (T1, T2, …, Tk)) е език от първи ред.

Считаме, че функционалният символ fi е ai-местен, i = 1, 2, …, m и предикатният символ Tj е bj-местен, j = 1, 2, …, k.

Нека разполагаме с изброимо множество от променливи, които ще означаваме с главни латински букви (X, Y, …), евентуално с индекси.
Дефинираме синтактичното понятие оператор в езика :


  1. Оператор за присвояване - l. Zi := Zj, l  N, Zi, Zj са променливи.

  2. Оператор за присвояване на константа - l. Zi := cj, l  N, Zi е променлива, j  { 1, 2, …, r }.

  3. Оператор за присвояване на резултат от операция -

l. Z := fj (Z1, Z2, …, ), l  N, j  { 1, 2, …, m }, Z, Zi, i = 1, 2, …, aj са променливи.

  1. Оператор за условен преход - l. if Tj (Z1, Z2, …, ) then l1 else l2,

l, l1, l2N, j  { 1, 2, …, k}, Zi, i = 1, 2, …, bj са променливи. Тук числата l1, l2 се наричат адреси на прехода.

  1. Оператор за безусловен преход - l. goto l1, l, l1N. Тук числото l1 се нарича адрес на прехода.

  2. Оператор за край - l. stop, l  N.

Числото l  N във всичките случаи се нарича етикет на оператора.


Дефинираме синтактичното понятие стандартна схема

(итеративна схема) в езика :

Input (X1, X2, …, Xn)

Output Y


begin

O0; O1; …; Oq;

end
Тук n  1 и X1, X2, …, Xn са различни помежду си входни променливи,

Y е променлива, Oi е оператор в за всяко i  { 0, 1, …, q }. При това за тези оператори са в сила следните ограничения:



  1. Етикетът на операторът Ol е l, l = 0, 1, …, q.

  2. Адресите на преходите във всички оператори са в интервала [0, q].

  3. Oq е оператор за край, оператор за условен преход или оператор за безусловен преход.

Ще дадем пример за стандартна схема.

Нека = (c; f, g; T), където f е едноместен, g е двуместен, T е едноместен.

Тогава следният синтактичен обект е коректна стандартна схема:

Input (X)

Output Y


begin

  1. Y := c;

  2. if T (x) then 5 else 2;

  3. Y := g (X, Y);

  4. X := f (X);

  5. goto 1;

  6. stop;

end
Ще дефинираме семантиката на една стандартна схема.

Естествено, има смисъл да говорим за семантиката на схема едва когато са интерпретирани константите, функционалните символи и предикатните символи на езика .

Нека = (H, (p1, p2, …, pr), (F1, F2, …, Fm), (P1, P2, …, Pk)) е алгебрична система в . В контекста на схемите на програми, алгебричните системи се наричат тип данни. Нека S е стандартна схема от горния общ вид.

Нека Z1, Z2, …, Zp са всички променливи, които участват в S.

Ще дефинираме две изображения val : N x Hn x { Z1, Z2, …, Zp }  H и

count : N x Hn  [0, q] с едновременна индукция по първия аргумент.

Неформално val ще определя съдържанието на променливите на всяка стъпка от изпълнението на схемата, а count ще определя етикетът на следващия оператор за изпълнение отново на всяка стъпка от изпълнението.

Нека s = (s1, s2, …, sn)  Hn, Z  { Z1, Z2, …, Zp }.



  1. val (0, s, Z) = si, ако Z е входната променлива Xi, i  { 1, 2, …, n } и

val (0, s, Z) = s1, ако Z не е входна променлива; count (0, s) = 0.

  1. Нека step  N, val (step, s, Zi) = tiH, i = 1, 2, …, p,

count (step, s) = l.

  1. Ако Ol = l. Zi := Zj, i, j  { 1, 2, …, p }, то

val (step+1, s, Z) = tj, ако Z = Zi,

val (step+1, s, Z) = val (step, s, Z), ако Z  Zi;

count (step+1, s) = l+1. Да отбележим, че Ol е оператор за

присвояване, така че l < q и l+1  [0, q].



  1. Ако Ol = l. Zi := cj, i  { 1, 2, …, p}, j  { 1, 2, …, r }, то

val (step+1, s, Z) = pj, ако Z = Zi,

val (step+1, s, Z) = val (step, s, Z), ако Z  Zi;

count (step+1, s) = l+1. Отново l < q и l+1  [0, q].


  1. Ако Ol = l. Zi := fj ( , , …, ), i, is  { 1, 2, …, p},

j  { 1, 2, …, m}, то

val (step+1, s, Z) = Fj ( , , …, ), ако Z = Zi,

val (step+1, s, Z) = val (step, s, Z), ако Z  Zi;

count (step+1, s) = l+1. Отново l < q и l+1  [0, q].



  1. Ако Ol = if Tj ( , , …, ) then l1 else l2, l1, l2N,

j  { 1, 2, …, m }, is  { 1, 2, …, p}, то

val (step+1, s, Z) = val (step, s, Z);

count (step+1, s, Z) = l1, ако Pj ( , , …, ) = true,

count (step+1, s, Z) = l2, ако Pj ( , , …, ) = false.

Да отбележим, че по дефиниция l1, l2  [0, q].


  1. Ако Ol = l. goto l1, l1N, то

val (step+1, s, Z) = val (step, s, Z);

count (step+1, s) = l1. Да отбележим, че по дефиниция

l1  [0, q].


  1. Ако Ol = l. stop, то

val (step+1, s, Z) = val (step, s, Z);

count (step+1, s) = count (step, s).


След като сме определили двете изображения, дефинираме семантиката < S, > : Hn H на стандартната схема S в типа

данни по следния начин: < S, > (s)  t  съществува k  N и съществува l  N, такива че count (k, s) = l, Ol = l. stop и val (k, s, Y) = t.

Не е трудно да се съобрази, че дефиницията е коректна - попадайки веднъж в оператор stop след това не променяме стойностите на променливите.
Нека S е примерната схема от по-горе.

Нека са дадени двата типа данни

1 = (N; 1; x.x81, x, y.x*y; x = 0?), 2 = ({ A, B, …, Z }*; ; , ; x = ?),

където функциите ,  се дефинират по следния начин:

 (x) = думата x, без първата си буква, ако x  ,

 () = ;

 (x, y) = първата буква на x, долепена до y, ако x  ,

 (, y) = y.

Лесно се проверява, че < S, 1 > (x)  x! за всяко x  N,

< S, 2 > (x)  обърнатата дума x за всяко x  { A, B, …, Z}*.
Рекурсивни схеми
Нека = ((c1, c2, …, cr), (f1, f2, …, fm), (T1, T2, …, Tg)) е език от първи ред.

Считаме, че функционалният символ fi е ai-местен, i = 1, 2, …, m и предикатният символ Tj е bj-местен, j = 1, 2, …, g.

Както в дефиницията на рекурсивните програми считаме, че разполагаме с обектови и функционални променливи.

Всъщност, рекурсивните схеми са обобщение на рекурсивните програми в произволен тип данни (а не в типа на естествените числа).

Означенията за константите от тип Bool и за основните операции от тип Booln  Bool ще съвпадат с тези при рекурсивните програми.

Абсолютно аналогично се дефинират понятията терм от основен тип, терм от тип Bool и условен терм. Разликите са, че символите за основните операции f : Natn  Nat се заменят с функционалните символи на , символите за основните операции f : Natn  Bool се заменят с предикатните символи на и символите за Nat-константите се заменят с константните символи на .



Рекурсивна схема наричаме следният синтактичен обект:

0 (X1, …, Xn, , , …, ), where



(X1, …, ) = 1 (X1, …, , , , …, )

(X1, …, ) = 2 (X1, …, , , , …, )



(X1, …, ) = k (X1, …, , , , …, )

Тук 0 е терм от основен тип, който наричаме глава на програмата,

1, …, k са термове от основен тип или условни термове.


Ще дефинираме семантиката на рекурсивна схема, естествено в конкретен тип данни.

Нека = (H, (p1, p2, …, pr), (F1, F2, …, Fm), (P1, P2, …, Pk)) е тип данни в .

Да напомним, че с FnH означаваме множеството на

n-местните частични функции на H.

Навсякъде по-долу означаваме FH = .
Нека  е (X1, …, Xn, , , …, ), sHn,  FH.

Дефинираме понятието стойност на терм с индукция по построението:



  1. Ако  = cj, то  (s, )  pj.

  2. Ако  = b, където b е булова константа, то  (s, )  b.

  3. Ако  е променлива,  = Xi, то  (s, )  si.

  4. Ако  = fj (1, 2, …, ), то  (s, )  Fj (1 (s, ), 2 (s, ), …, l (s, )).

  5. Ако  = Tj (1, 2, …, ), то  (s, )  Pj (1 (s, ), 2 (s, ), …, l (s, )).

  6. Ако  =  (1, 2, …, ), където  е l-местна булова операция, то

 (s, )   (1 (s, ), 2 (s, ), …, l (s, )).

  1. Нека  e условен терм,  = if  then 1 else 2. Тогава

 (s, )  1 (s, ), ако  (s, )  tt,

 (s, )  2 (s, ), ако  (s, )  ff,

!  (s, ), ако !  (s, ).



  1. Нека  e обръщение към функция,  = (1, 2, …, ).

Тогава  (s, )  i (1 (s, ), 2 (s, ), …, (s, )).
Дефиницията е аналогична на стойност на терм в основен тип Nat при предаване на параметрите по стойност.

С всеки терм  (X1, …, Xn, , , …, ) свързваме оператор

Г : FH  FnH, дефиниран по следния начин:

Г (1, 2, …, k)(s1, s2, …, sn)   (s1, s2, …, sn, 1, 2, …, k)

за всяко  FH, sHn. Както при рекурсивните програми с предаване по стойност се проверяват последователно монотонността и компактността на Г. Така за всеки терм , Г е непрекъснато изображение на области на Скот.
Нека R е рекурсивна схема от горния общ вид.

За всяко i  { 1, 2, …, k} означаваме, Гi = .

Разглеждаме системата за изображенията Г1, Г2, …, Гk:

Г1 (1, 2, …, k) = 1

Г2 (1, 2, …, k) = 2

Гk (1, 2, …, k) = k



Тъй като Г1, Г2, …, Гk са непрекъснати изображения, то системата притежава най-малко решение = (1, 2, …, k).

При това е и най-малко квазирешение.



Функцията < R, > : Hn H, дефинирана с

< R, > (s)  0 (s, ) за всяко sHn, където е точно това най-малко решение наричаме семантика на рекурсивната схема програмата R

в типа данни .
Каталог: uni
uni -> Отчет за ибсф ра, ибсф ksf и ибсф 33 за средствата по набирателните сметки
uni -> Условия и ред за приемане, отчитане и унищожаване на документи с фабрична номерация нормативна уредба
uni -> "Икономиката е история на човешката трудова дейност." Маршал
uni -> Програма за развитието на силите на мозъка. През 1978 г въз основа на разработените принципи той започва да обучава хора, а към 1980 г неговите лекции вече се ползват с колосален успех в цял свят


Сподели с приятели:
1   2   3   4   5   6




©obuch.info 2024
отнасят до администрацията

    Начална страница