BÖLÜM 2 Biçimsel Dillerin Matematiksel Temelleri 2.1 Kümeleri tümevarım yolu ile tanımlama E tanımlanacak küme olsun: Taban: Yapı taşı elemanları kümesi veya taban B ile gösterilsin. Bu kümenin içindeki elemanlardan hareketle diğer elemanlar türetilebiliyorsa, bu elemanlara yapı taşı elemanları denir. Örnek olarak Alfabe bir dil kümesinin yapı taşı elemanları kümesidir. Kurallar: Bir kümenin içindeki elemanlardan hareketle yeni elemanları türetmenin kurallarıdır. Bir dil, alfabeden belli kurallar neticesinde türetilmiş kelimeler topluluğudur (kümesidir). = { f 1, f 2,..., f n } f i f i : E x E x E x.. x E E x 1, x 2,.., x p E f i (x 1, x 2,..., x p ) = x E (X yeni eleman) Kapanış: (E) = E E kümesi, taban elemanları ve sadece kurallar uygulanması sonucu oluşan elemanlardan başka bir elemanı olmayan kümedir. Tüme varımla gösterilim: B 0 = B B 1 = (B 0 ) B 0 (kurallar B 0 a uygulanır.) B 2 = (B 1 ) B 1... B i+1 = B i (B i ) = B i = E (kapanış). i sayısı sonlu olabileceği gibi sonsuza da gidebilir. Elemanın yüksekliği: H(x) = min{ i x B i }. Elemanın ilk defa kaçıncı sırada elde edildiğini gösterir. Kelimenin uzunluğudur. Çift sayılar: i) 0 E ii) n E => (n + 2) E iii) Bu kuralın uygulanması ile elde edilenler dışında hiç bir sayı çift sayı değildir. 2.2 Alfabe ve diller Tanımlar: Alfabe: Sonlu, boş olmayan simgeler veya karakterler kümesi. Sözcük: nın sonlu bir dizisi veya katarı. Sözcük uzunluğu: Sözcükteki simge sayısı. Boş sözcük: Uzunluğu sıfır olan sözcük. Λ veya e ile gösterilir. Sözcük bitiştirme: x = a 1 a 2...a n y = b 1 b 2...b m => xy = a 1 a 2..a n b 1 b 2...b m (x&y)
Sözcük bitiştirme işleminin etkisiz elemanı Λ dir. x = Λ => xy = y y = Λ => xy = x Boş katar ve birleşme özelliği (asosiyativite) gösteren bitiştirme işlemi (konkatenasyon) ile alfabe üzerinde oluşturulmuş sözcükler kümesi * bir monoiddir. Bundan sonra aşağıda verilmiş olan kümeler bilgisayar biliminde sıklıkla kullanılır. Katar Tersi ya da ters katar (ing: Reverse of a string) (baba) R = abab; (ana) R = ana Ters katar tanımı (tüme varım ile) 1. w = 0 => w R = w = Λ ; w, w sözcüğünün karakter sayısını gösterir. 2. w = n + 1 ve u R mevcut olduğunu var sayalım. u = n, (w ve u) katarlar, n R n uzunlukta bir katar verilmiştir ve bunun tersi u R dur. w = ua a Σ => w R = au R w = 1 => w = Λa, w R = aλ = w w = 2 => w = ua (u = b), w R = au R = au = ab w = 3 => w = ua, u = cb, w R = au R = abc (wx) R = x R.w R x = n, w = m m N Tanıt: x = 0 => x = Λ n = x = 0 için (wx) R = (wλ) R = w R = Λw R = Λ R w R = x R w R Varsayım: x n => (wx) R = x R w R x = n + 1 için tanıt x = ua u = n a Σ x R = au R (tanım) (wx) R = (w(ua)) R = ((wu)a) R = a(wu) R = a(u R w R ) = au R w R = x R w R (atlı karınca ) = (karınca) R (atlı) R Tanımlar: + (boş olmayan sözcüklerin kümesi) kümesi: ( alfabesi üzerinde) i) a => a + (taban) (Σ nın her elemanı Σ + nın da elemanıdır.) ii) (x + Λ a ) => ax + (Σ nın her elemanı Σ + nın da elemanıdır. Bitiştirme işlemi, a bitiştir x) iii) i) ve ii) nin sonlu uygulamaları dışında elde edilemeyen hiç bir eleman + nın elemanı olamaz.
= { a, b} => + = { a, b, aa, ba, ab, bb, aaa, aab,...}. Σ + içinde boş katar yoktur. Boş katara sözcük uzayının sıfır elemanı gibi bakabiliriz. * kümesi: ( alfabesi üzerinde) i) Λ * ii) x * a => ax * iii) i) ve ii) nin sonlu uygulamaları dışında elde edilemeyen hiç bir eleman * nın elemanı olamaz. = { a, b} => * = { Λ, a, b, aa, ba, ab, bb, aaa, aab,...} = {0, 1} => * = { Λ, 0, 1, 00, 01, 10, 11, 000, 001,... } (x *) (n N) ise x n nin tanımı (Bir katarın n inci kuvvetinin tanımı) i) x 0 = Λ (bitiştirmenin etkisizi olduğu böyle tanımlanmıştır) ii) x n+1 = x n..x = (x n & x) Örnek 1: = {a, b} x = ab x 0 = Λ, x 1 = ab, x 2 = abab, x 3 = ababab Örnek 2: { a n b n n 0 } yanda belirtilen kümeyi tanımlar: { Λ, ab, aabb, aaabbb,... } sonlu bir alfabe olsun. üzerinde bir dil, * ın bir alt kümesidir. Σ* dan bir alt küme seçmenin kuralları ilerideki bölümlerde gramer olarak işlenecektir. { a n b m n, m N }, { a, b } üzerinde bir dildir. Bu dilde b ler a ların önüne geçemiyor. Bu dilde sade a lar ve b ler olabilir. Örneğin ba sözcüğü bu dile ait değildir. (Çarpım Diller) A ve B, üzerinde diller ise A.B küme çarpımı yeni bir dil oluşturur. AB = { xy x A y B } AB = { z z = xy x A y B } = { a, b } A = { Λ, a, ab }, B = { a, bb } diller olsun. AB = { a, bb, aa, abb, aba, abbb}, burada a terimi (Λa) den gelmektedir. BA = { a, aa, aab, bb, bba, bbab } İki çarpım dilin elemanlarının hepsinin aynı olmadığı görülmektedir.. Teoremler: boş dili (not: tek elemanı Λ olan dil değildir); A, B, C, D aynı alfabesinin farklı dillerini göstersin. Buna göre: 1) A = A =. ( boş dildir, boş katar değildir).
Tanıtlar: 2) A{Λ} = {Λ}A = A 3) (AB)C = A(BC) 4) (A B) (C D) => AC BD 5) A(B C) = AB AC 6) (B C)A = BA CA 7) A(B C) AB AC 8) (B C)A BA CA 1) A = {xy xa y}, y önermesi her zaman yanlıştır, buna göre x, y için xa ve y önermesini sağlayan xy yoktur. Hiç bir x, y şartı sağlamadığına göre A =. Benzer bir tanıt A = için de kullanılabilir. 4) Bu teoremin tanıtı doğrudandır. Farz edelim ki A B C D, ve z de AC kümesinin rasgele bir elemanı olsun. Bu durumda z = xy olur ki burada x A ve y C. A B ve C D olduğundan, x in B ye, y nin de D ye ait oldukları (x B, y D) sonucu çıkar. Buna göre z = xy BD olur. z, AC nin rasgele bir elemanı olduğundan AC BD sonucu ispatlanmış olur. 7) A(B C) AB AC teoreminin ispatı: A(B C) ise z (z = xy x A y B C) yazılabilir. Buradan x A y B x A y C olur. İlerlersek xy (AB AC). Şu halde z (za(b C) => z AB AC AB AC A(B C) her zaman doğru olamayacağına ilişkin karşı örnek: A = { a n n N } B = { a n b n n N } C = { b n n N } kümelerini ele alırsak, örneğin z=a 5 b 2 değerinde olan bir eleman hem AB, hem de AC ye aittir, yani z AB AC dir. Oysa z A(B C) doğru değildir, zira B C = {} dir: z = a 5 b 2 = a 3 a 2 b 2 olsun z AB AC z A( B C ) çünkü B C = {Λ} A n : A üzerinde bir dil olsun. i) A 0 = { Λ } ii) A n+1 = A n A; nn = { a, b}, A = { Λ, a, ab} A 1 = A A 2 = {Λ, a, ab, aa, aab, aba, abab } Teoremler: A ve B, üzerinde tanımlanmış diller ise: 1) A m A n = A m+n 2) (A m ) n = A mn 3) A B => A n B n..
Tanıtlar: Tanıt 1: Bunun için 1.tümevarım yöntemini kullanılabilir. n = 1 için A m A 1 = A m+1 bulunur. Bu eşitlik yukarıdaki tanımdan gelmektedir. n için doğru kabul eder ve n + 1 için doğruluğunu gösterirsek A m A n+1 = A m A n A 1. Dil bitiştirmenin asosiyatiflik özelliği uyarınca A m (A n A 1 ) yerine (A m A n )A 1 yazılabilir. Buradan A m+n A 1 bulunur ki bu da tanıtın yapıldığını gösterir. Tanıt 2: Aynı yöntem kullanılırsa, n = 1 için doğruluğun sağlanması açıktır. A m = A m. n için doğru kabul edilirse, n + 1 için: (A m ) n+1 = (A m ) n (A m ) 1 = A mn + m = A m(n+1) ispat yapılmıştır. Tanıt 3: A 2 = A x A, B 2 = B x B birer dildir. A B => x A => x B n = 2 için: A 2 = { xy x A y A} xy A 2 => xy B 2 => A 2 B 2 n = n + 1 için: n için doğru kabul edilir ve n + 1 için de aynı şekilde tanıtlanır. Pozitif kapanış: A + = A n = A A 2 n=1 Yıldız kapanışı (Kleen Yıldızı veya Kleen Kapanışı): A* = A n = A 0 A Boş katarı da içine alan kümedir. n=0 A ve B, üzerinde tanımlı iki dil ve n N olsun. Bu durumda aşağıdaki bağıntılar geçerlidir: 1. A* = {Λ} A +. Tanımın kendinden gelmektedir. 2. A n A*, n 0 için. Aynı şekilde 3. A n A +, n 1 için. Aynı şekilde 4. A AB*. Tanıt: A 0 B* => A AB* 5. A B*A. İspatı açıktır. 6. A B => A* B*. A B => A n B n teoreminden gelmektedir. Bütün n ler için doğru ise, bütün n lerin bileşimi için de doğrudur. 7. A B => A + B + 8. AA* = A*A = A + 9. Λ A A + = A* 10. (A*)* = A*A* = A* 11. (A*) + = (A + )* = A* 12. A*A + = A + A* = A + 13. (A*B*)* = (A B)* = (A* B*)*. Bu teoremi düzenli ifadelerin yalınlaştırılmasında kullanacağız.
Tanıt 8: AA* = A + => A(A 0 A 1.) = A A 2 = A + Tanıt 9: Λ A => A {Λ} = A A A 0 = A A + = A { A n } = A 0 A { } = A* n = 2 Tanıt 9 ters yön: A A 2. = A 0 A ise A 0 A A 2 Bu içindelik iki şekilde yorumlanabilir: i) Λ A => A 0 A ii) Λ A => i, Λ A i, i (N + - 1) HAlbuki Λ A => x A i ( x i) Oysa Λ = 0 => Λ A i i 2. Tezatla karşılaşıldığından ii) şıkkı doğru olamaz. Buna göre i) şıkkı gösterilmek istenendir. Tanıt 13: (A*B*)* = (A B)* Birinci yön: A A B B A B A* (A B)* B* (A B)* A*B* (A B)* (A B)* A*B* (A B)* (A*B*)* ((A B)*)* = (A B)* İkinci yön: A A* A*B* B B* A*B*. Bu ifadeleri A* ve B* içinde Λ olduğu için yazabiliyoruz. A B A*B* => (A B) * (A*B*)*. (A*B * )* (A B)* ve (A B)* (A*B*)* olduğuna göre eşitlik doğrudur. A ve B, * üzerinde tanımlanmış alt kümeler ve Λ A olsun X = AX B denkleminin tek çözümü X = A*B dir. Tanıt: I) X = A*B bir çözümdür. {Λ}B = B özelliğini göz önüne alarak A*B = AA*B B = A + B B = (A + {Λ }) B = A*B II) X, denklemin bir çözümü olsun X = A*B olduğunun tanıtlanması için: X A*B ve X A*B ayrı ayrı tanıtlanacaktır.
a) X A*B nın tanıtı: İlk aşamada (X A n B) olduğunu 1.tüme varım yöntemi ile tanıtlayalım. n = 0, A n = A 0 = {Λ} => A 0 B = B Öte yandan X = AX B => X AX X B X B ve A 0 B = B => X A 0 B Varsayım: X A n B X AX => X A (A n B), X A n+1 B Şu halde n, ( X A n B ) ve öte yandan A*B = i A i B olduğundan sonuç olarak: X A*B bulunmuş olur. b) İkinci aşamada X A*B 2.tümevarım yöntemi kullanılarak tanıtlanacaktır. Bunun için herhangi bir n değerinden daha küçük n ler için tanıtlanacak ifadenin doğru olduğu kabul edilip n için doğruluğu ispat edilir. x( x X => x A*B ) x in uzunluğu n olsun. Burada n rasgele bir uzunluktur. 2.tümevarım hipotezine göre uzunluğu n den kısa her zincir için tanıtlanmak istenenin doğru yani w{ w < x => w X => w A*B } varsayımına göre tanıtı yapacağız. Açıklık getirmek için A*B de en kısa katarın uzunluğu, B nin en kısa katarının uzunluğuna eşit olduğuna dikkat çekilebilir. Tanıtın birinci kısmından X in en kısa katarı için bu söylem geçerlidir. ( X = AX B x X) => (x AX v x B) i) x B => x A*B ii) x AX => x = yz y A z X Λ A => y 0 y 0 => z < x Eğer x, B nin en küçük katarının uzunluğuna eşitse, z < x yoktur yani x B olmadığından ii) şıkkı doğru olamaz. Hipoteze göre: z < x z X => z A*B Şu halde: x = yz AA*B Yani x A + B A*B olur. Bu durumda tanıt bitmiştir. 2.3 Bağıntılar ve kapanış 2.3.1 Bağıntılar: Bağıntılar bir yapıyı karakterize eder. Önceki bölümde kümeleri incelemiştik. Bu bölümde kümelerin elemanları arasındaki küme içi bağıntılar ile temsil edilen bazı basit yapı formlarını inceleyeceğiz. Bağıntılar bilgisayar biliminin temel kavramlarından biridir. Bileşik bir veri yapısı, dizi, liste, ağaç gibi, bir veri nesneleri kümesini bağıntılar aracılığı ile bir arada göstermek amacıyla kullanılır. Bağıntılar ayrıca program yapısı, algoritma analizi gibi konularda da önemli bir rol oynar. Küme içi bağıntılar: B = A kaynak ile hedef aynı R A X A => M kare matris
Graf: Koşut bağlı yay bulunmaz. Yönlendirilmiştir. Tek çevre olabilir. Küme içi bağıntının kuvvetleri: bağıntısının (n N) n inci kuvveti n ile gösterilir ve tümevarım ile tanımlanır. i) 0 = {(x,x) x A} ii) n+1 = n n N (tanıt tüme varım ile öğrenci tarafından yapılacaktır) m n = m+n (n, m N) ( m ) n = mn (n, m N) -p = ( -1 ) p = ( p ) -1 Özellik: <x, y> n => grafta x ile y bağlı ve aralarında n uzunlukta en az bir dolaşı mevcut. A = {a, b, c, d} elemanlarından oluşan bir küme olsun. α n, uzunluğu n olan bağıntıları göstersin. Buna göre: 0 : a b c d : a b c d 2 : a b c d 3 : a b c d 4 : a b c d Şekil 2.1 Bağıntının kuvvetlerinin açık gösterimi 2 = 4 4 = 2 = 3 5 = 3 6 = 4 = 2 2n+1 = 3 2n = 2 0 1 2 3 Şekil 2.2 Bağıntının kuvvetleri grafı A, n elemanlı bir sonlu küme ise ve, A üzerinde bir bağıntı ise [0 (2 n ) 2 ] kapalı aralığında s = t eşitliğini sağlayan en az bir (s, t) çifti bulunur.
Tanıt: A x A Card (A x A) = n 2, Card P(A x A) = (2 n ) 2 Şu halde A üzerinde (2 n ) 2 den fazla birbirinden farklı bağıntı kurulamaz. Buna göre: 0, 1, 2,..., ( 2n ) 2 bağıntılarının sayısı (2 n ) 2 +1 dir. Şu halde bunlardan en az ikisi birbirinin aynısıdır., A kümesi üzerinde tanımlanmış bir bağıntı ise ve s = t (s<t ve p= t-s olmak üzere) a) s+k = t+k ; k 0 b) s+kp+i = s+i ; k > 0 i (0 < i < p) c) = {, 1, 2,..., t-1 } olduğuna göre q{ q q 0 q N} a) ve b) şıklarını tümevarım ile siz tanıtlayınız. c) şıkkının tanıtı: q < t ise q tanım uyarınca q t ise b şıkkına göre q = s + kp + i (i < p) olmak üzere yazılabilir. Buna göre q = s+i i < p => s + i < t => q. 2.3.2 Bağıntılar üzerinde kapanış işlemleri (Closure Operations): Bir bağıntının kapanışı: Bir bağıntıdan yeni bağıntı türetme yollarından biri. Düğümler ve ayrıtlar ile bir graf, bir haberleşme ağını temsil etsin. Bu grafa ilişkin bağıntı lokal bir bağıntıdır. Bu yerel (local) bağıntıdan giderek birbiri ile arasında haberleşme yolu olan düğümleri bulma işlemi ise daha global bir bağıntı şeklidir. Bu bağıntıya 1. bağıntının kapanışı diyoruz. A üzerinde tanımlanmış bir küme içi bağıntı nın yansımalı kapanışı ( ) ise aşağıdaki koşullar sağlanır: i) yansımalı bir bağıntıdır. ii) iii) yansımalı bağıntı => A üzerinde tanımlanmış bir küme içi bağıntı nın bakışlı kapanışı ( ) ise aşağıdaki koşullar sağlanır: iv) bakışlı bir bağıntıdır. v) vi) bakışlı bağıntı => A üzerinde tanımlanmış bir küme içi bağıntı nın geçişli kapanışı ( ) ise aşağıdaki koşullar sağlanır: vii) geçişli bir bağıntıdır. viii) ix) geçişli bağıntı =>
Buna göre () dan ( ) ünü elde etmek için () ya A da gerekli ve yalnız gerekli sıralı çiftleri eklemek yeterlidir. r() ya yansımalı (reflexive) kapanış bağıntısı, s() ya bakışlı (symmetric) kapanış bağıntısı, t() ya da geçişli (transitive) kapanış bağıntısı denir. yansımalı ise => r() =. bakışlı ise => s() =. geçişli ise => t() =. E herhangi bir A kümesinde tanımlanan eşitlik bağıntısı (birim bağıntı) olsun. E = { <x, x> x A}, R A x A (E = R 0 ) r() = R E (yönlü grafta her düğüme bir tek çevre eklenebilir) a) r(r(<)) = R() (<: dar sıra bağıntısı, : genel sıra bağıntısı olarak isimlendirilir.) b) r(e) = E c) r(r()) = A x A evrensel bağıntı Not: r(r()) = E Boş bağıntının yansımalı kapayanı eşitliktir. bakışlı ise => = -1 s() = -1 Yönlü grafta her yaya bir ters yay eklemek demektir. s(r(<)) = R(#) s(r()) = A x A s(e) = E s(r()) = R() Geçişli Kapanış: D, bağıntısının grafı olsun. t() nün grafı (D ) sü D nin yol olan her iki düğümü arasına bir yay konularak elde edilir. (D) x x x x (D ) x x x x, A da bir küme içi ikili bağıntı ise
t() = i = 2 3... Tanıt: t() i ve i t() ayrı ayrı tanıtlanmalıdır. a) Öncelikle: i t() olduğunu, diğer bir deyişle; <a, b> α n+1 => <a, b> t(α) olduğunu tanıtlayalım. Tüme varım yöntemi kullanılacaktır. Tanım gereği t() Varsayım gereği: n t() İspatlanacak bölüm: <a, b> n+1 için c, <a, c> α n <c, b> α <a, c> t() (<a, c> α n ve α n t(α) olduğundan dolayı) <c, b> t() (<c, b> α, α t(α) olduğundan dolayı) <a, b> t() (t() nın geçiş özelliği) => n+1 t() => i ( i t()) => i t() İkinci olarak: t() i olduğunu ispatlayalım i geçişli bir bağıntı mıdır? <a, b>, <b, c> bu bağıntıdan iki sıralı bir çift olsun. <a, b> s ve (b, c) t. <a, c> s+t olacaktır. <a, c> i dir. Şu halde i geçişlidir. Tanıma göre t(), yı içine alan tüm geçişli bağıntıların içinde yer alır. (sırada en küçüğü ya da en önde gelenidir) t() i bulunur. a) b = a+1 a, b I bağıntısı verilsin. Bu bağıntının geçişli kapanışı R(<) bağıntısıdır.
b), A tam sayı kümesi üzerinde R(<) bağıntısı olsun. A kümesinin R(<) a göre sıralama (sort işlemi) A da R(<) = t( ) olacak şekilde en küçük ( ) bağıntısını bulmak demektir. Eğer nın tanımlandığı A sonlu ise (2 n ) 2 t() = i olduğunu biliyoruz. t(α) yı oluşturma yöntemini veren teorem., n elemanlı A kümesi üzerinde tanımlanıyorsa n t() = i n k ( k>0 k i ) göstermek yetiyor. <x, y> k => nın D yönlendirilmiş grafında x ile y arasında bir dolaşı mevcuttur anlamını taşır (Dolaşıda düğüm ve ayrıtlardan istenildiği kadar geçilebilir. Yolda her düğümden ancak bir kere geçilebilir. Gezide düğümden istenildiği kadar, ayrıtlardan bir kere geçilebilir.). <x, y> k ifadesi, x ten y ye gitmek için k adım atıldığı anlamına gelir. Bu dolaşıda tüm çevreleri kaldırırsak iki düğüm arasında bir yol elde ederiz. <x, y> i burada 0 < i n arasında bir değerdir. i = n ancak x ve y düğümlerinin aynı olduğu ve yolun tüm düğümlerden geçtiği durumda olabilir. Teoremler: a) yansımalı ise s() ve t() da yansımalıdır. b) bakışlı ise, r() ve t() da bakışlıdır. c) geçişli ise, r() da geçişlidir. Ancak s() geçişli olmayabilir. a) nın tanıtı: yansımalı ise = E ( ) dır. s() = E ( ) E -1 ( ) -1 = E ( ) ( ) -1 = E r( ) n t() = (E ) i ve E = E = E n = E olduğuna göre = E () ( ) 2... ( ) n yansımalı bir bağıntıdır. Teoremler: a) rs() = sr() b) rt() = tr() c) ts() st() Tanıtlar: a) sr(r) = s(r E) = (R E) (R E) -1 = R E R -1 E -1 oysa E E -1 = E R R -1 = s(r) sr(r) = (R R -1 ) E = s(r) E = rs(r) yansıma
b) tr(r) = t(r E) rt(r) = t(r) E E birim bağıntı ER = RE E n = E n (R E) n = E R tr(r) = t(r E) = R E (R E) 2... (R E) n... = E R R 2... R n... = E t(r)... = rt(r) c) R 1 R 2 => s(r 1 ) s(r 2 ) t(r 1 ) t(r 2 ) s(r) R olduğuna göre ts(r) t(r) st(r) st(r) s(r) bakışlı ise t(s(r)) de bakışlıdır. Şu halde st(s(r)) = ts(r) => ts(r) st(r) bulunmuş olur., A üzerinde bir bağıntı ise + = t() ve * = tr() olarak gösterilir. Bağıntıların + ve * işlemleri formel dillerde, hesap modellerinde ve derleyici tasarımında kullanılır. P = { P 1, P 2,..., P n } bir program kitaplığında program ve alt programlar kümesi olsun. Bu kümede P i => P j ikili bağıntısı P i program P j yi çağırır anlamında kullanılsın. Bu durumda => + bağıntısı bir programın icrası sırasında çağrılan bir tüm alt programları kümesini ortaya çıkarmaya yarar. Örneğin (P i => + P j ) P i nin icrası sırasında P j çağrılır demektir. Oysa =>* bir programın yürütülmesi sırasında herhangi bir anda etkin olacak olan program ya da alt programlar kümesini ortaya çıkarmaya yarar. P i =>* P j, P i nin icrası sırasında P j uyarılıyorsa i (P i =>* P i ) her zaman doğrudur ancak P i => + P i ise => P i rekürsiftir (kendi kendini çağırıyordur).