Нека = ((c1, c2, …, cr), (f1, f2, …, fm), (T1, T2, …, Tk)) е език от първи ред.
При това, нека r 1, т.е. в езика има константни символи.
Алгебрична система E = (H, (a1, a2, …, ar), (F1, F2, …, Fm), (P1, P2, …, Pk)
в се нарича ербранова, ако тя изпълнява следните условия:
-
H е множеството от всички основни термове в .
-
ai = ci, i = 1, 2, …, r.
-
За всяко 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) M M = . По този начин можем да отъждествяваме всяка ербранова алгебрична система с множеството от вярните основни атоми в нея. Нека M е множество от основни атоми.
Нека F е формула в . Бележим M F, ако F, където е ербрановата алгебрична система съответна на M.
Още казваме, че M е ербранов модел на F.
Естествено, ако A е основен атом, то M A A M.
Ако v е произволна оценка бележим M, v F, ако , v F.
С M* ще бележим множеството от всички основни атоми в .
Нека C е хорнова клауза, C = X1X2…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).
Твърдение: Нека M M*. Нека C е хорнова клауза.
Тогава M C M D за всеки частен случай D на C.
Доказателство: нека C = X1X2…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 Bn M, v C. Така M, v C за всяка оценка v M C М C.
Следствие: Нека M M*. Нека P е логическа програма.
Тогава M P M е модел на всеки частен случай на
хорнова клауза от P.
Доказателство: M P М е модел на всяка хорнова клауза от P
M е модел на всеки частен случай на хорнова клауза от P.
Твърдение: Нека M M*. Нека 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 А М или B1 M или …или Bn M
head (D) M или tail (D) M tail (D) M head (D) M.
Твърдение: Всяка логическа програма P има поне един ербранов модел.
Доказателство: ще покажем, че M* е ербранов модел на P.
Имаме M* P M* е модел на всеки частен случай на
хорнова клауза от P tail (D) M* head (D) M* за всеки частен случай D на хорнова клауза от P. Последното е изпълнено, тъй като M* се състои от всички основни атоми.
Нека P е логическа програма. Означаваме с MP сечението на всички ербранови модели на P. От предното твърдение това сечение е добре дефинирано.
Твърдение: MP е модел на P.
Доказателство: нека D е частен случай на хорнова клауза от P.
Да предположим, че tail (D) MP. Нека M е произволен ербранов
модел на P. Имаме MP M 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) е ербранов модел на P MP 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 е монотонно.
Нека M N. Нека 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).
Нека M0 M1 … 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, LP M*. Да напомним, че LP също е най-малка квазинеподвижна точка.
Твърдение: Нека M M* е ербранов модел на 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.
Следствие: LP MP.
Доказателство: тъй като MP е модел на P, то TP (MP) MP MP е квазинеподвижна точка на TP LP MP, тъй като LP е най-малка квазинеподвижна точка на TP.
Твърдение: Нека TP (M) M. Тогава M е ербранов модел на P.
Доказателство: нека D е частен случай на хорнова клауза от P.
Да предположим, че tail (D) M. Тогава head (D) TP (M)
head (D) M. Така M е ербранов модел на P.
Следствие: МP LP.
Доказателство: имаме TP (LP) LP, тъй като LP е квазинеподвижна точка на TP. Тогава LP е ербранов модел на P МP LP.
И така показахме равенствата OUTPUT (P) = MP = LP за всяка логическа програма P. Тези равенства са известни като теорема на Ван Емден-Ковалски.
Нека P е логическа програма, M M*. Твърдение от вида
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, …), евентуално с индекси.
Дефинираме синтактичното понятие оператор в езика :
-
Оператор за присвояване - l. Zi := Zj, l N, Zi, Zj са променливи.
-
Оператор за присвояване на константа - l. Zi := cj, l N, Zi е променлива, j { 1, 2, …, r }.
-
Оператор за присвояване на резултат от операция -
l. Z := fj (Z1, Z2, …, ), l N, j { 1, 2, …, m }, Z, Zi, i = 1, 2, …, aj са променливи.
-
Оператор за условен преход - l. if Tj (Z1, Z2, …, ) then l1 else l2,
l, l1, l2 N, j { 1, 2, …, k}, Zi, i = 1, 2, …, bj са променливи. Тук числата l1, l2 се наричат адреси на прехода.
-
Оператор за безусловен преход - l. goto l1, l, l1 N. Тук числото l1 се нарича адрес на прехода.
-
Оператор за край - 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 }. При това за тези оператори са в сила следните ограничения:
-
Етикетът на операторът Ol е l, l = 0, 1, …, q.
-
Адресите на преходите във всички оператори са в интервала [0, q].
-
Oq е оператор за край, оператор за условен преход или оператор за безусловен преход.
Ще дадем пример за стандартна схема.
Нека = (c; f, g; T), където f е едноместен, g е двуместен, T е едноместен.
Тогава следният синтактичен обект е коректна стандартна схема:
Input (X)
Output Y
begin
-
Y := c;
-
if T (x) then 5 else 2;
-
Y := g (X, Y);
-
X := f (X);
-
goto 1;
-
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 }.
-
val (0, s, Z) = si, ако Z е входната променлива Xi, i { 1, 2, …, n } и
val (0, s, Z) = s1, ако Z не е входна променлива; count (0, s) = 0.
-
Нека step N, val (step, s, Zi) = ti H, i = 1, 2, …, p,
count (step, s) = l.
-
Ако 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].
-
Ако 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].
-
Ако 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].
-
Ако Ol = if Tj ( , , …, ) then l1 else l2, l1, l2 N,
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].
-
Ако Ol = l. goto l1, l1 N, то
val (step+1, s, Z) = val (step, s, Z);
count (step+1, s) = l1. Да отбележим, че по дефиниция
l1 [0, q].
-
Ако 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, , , …, ), s Hn, FH.
Дефинираме понятието стойност на терм с индукция по построението:
-
Ако = cj, то (s, ) pj.
-
Ако = b, където b е булова константа, то (s, ) b.
-
Ако е променлива, = Xi, то (s, ) si.
-
Ако = fj (1, 2, …, ), то (s, ) Fj (1 (s, ), 2 (s, ), …, l (s, )).
-
Ако = Tj (1, 2, …, ), то (s, ) Pj (1 (s, ), 2 (s, ), …, l (s, )).
-
Ако = (1, 2, …, ), където е l-местна булова операция, то
(s, ) (1 (s, ), 2 (s, ), …, l (s, )).
-
Нека e условен терм, = if then 1 else 2. Тогава
(s, ) 1 (s, ), ако (s, ) tt,
(s, ) 2 (s, ), ако (s, ) ff,
! (s, ), ако ! (s, ).
-
Нека 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, s Hn. Както при рекурсивните програми с предаване по стойност се проверяват последователно монотонността и компактността на Г. Така за всеки терм , Г е непрекъснато изображение на области на Скот.
Нека 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, ) за всяко s Hn, където е точно това най-малко решение наричаме семантика на рекурсивната схема програмата R
в типа данни .
Сподели с приятели: |