"Deterministik bağlamsız dilbilgisi" gibi ifadelerde "deterministik" ile ne anlama geldiğini anlamaya çalışıyorum. (Bu alanda daha belirleyici "şeyler" vardır). En ayrıntılı açıklamadan daha çok bir örneği takdir ediyorum! Eğer mümkünse.
Başlıca karışıklık kaynağım, bir dilbilgisinin bu özelliğinin (olmayan) belirsizlikten ne kadar farklı olduğunu söyleyememek.
Ne anlama geldiğini bulabildiğim en yakın şey D. Knuth'un Soldan Sağa Dillerin Çevirisi Üzerine yazdığı bu alıntıdır :
Ginsburg ve Greibach (1965) deterministik bir dil kavramını tanımlamışlardır; Bölüm V'de bunların tam olarak LR (k) dilbilgisi olan diller olduğunu gösteriyoruz
bu da en kısa sürede dairesel hale gelir Section V
, çünkü orada LR (k) ayrıştırıcısının ayrıştırabileceği şey deterministik dildir ...
Aşağıda, "belirsiz" in ne anlama geldiğini anlamama yardımcı olabileceğim bir örnek var, lütfen bir göz atın:
onewartwoearewe
Hangi olarak ayrıştırılabilir one war two ear ewe
veya o new art woe are we
- bir dilbilgisi izin veriyorsa (az önce listelediğim tüm kelimelere sahip olduğunu söyleyin)
Bu örnek dili (belirsiz) deterministik yapmak için ne yapmam gerekir? (Örneğin, o
dilbilgisini belirsiz yapmak için kelimeyi dilbilgisinden kaldırabilirim ).
Yukarıdaki dil deterministik midir?
PS. Örnek Godel, Esher, Bach kitabından alınmıştır: Ebedi Altın Örgü.
Diyelim ki, örnek dil için dilbilgisini şöyle tanımlıyoruz:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Tüm dizeyi ayrıştırma argümanına göre, bu dilbilgisi dili deterministik yapmaz mı?
let explode s =
let rec exp i l =
if i < 0 then l else exp (i - 1) (s.[i] :: l) in
exp (String.length s - 1) [];;
let rec woe_parser s =
match s with
| 'w' :: 'e' :: [] -> true
| 'e' :: 'w' :: 'e' :: [] -> true
| 'o' :: x -> woe_parser x
| 'n' :: 'e' :: 'w' :: x -> woe_parser x
| 'a' :: 'r' :: 't' :: x -> woe_parser x
| 'w' :: 'o' :: 'e' :: x -> woe_parser x
| 'a' :: 'r' :: 'e' :: x -> woe_parser x
(* this line will trigger an error, because it creates
ambiguous grammar *)
| 'o' :: 'n' :: 'e' :: x -> woe_parser x
| 'w' :: 'a' :: 'r' :: x -> woe_parser x
| 't' :: 'w' :: 'o' :: x -> woe_parser x
| 'e' :: 'a' :: 'r' :: x -> woe_parser x
| _ -> false;;
woe_parser (explode "onewartwoearewe");;
- : bool = true
| Label | Pattern |
|---------+--------------|
| rule-01 | S -> A 'we' |
| rule-02 | S -> A 'ewe' |
| rule-03 | A -> B |
| rule-04 | A -> BA |
| rule-05 | B -> 'o' |
| rule-06 | B -> 'new' |
| rule-07 | B -> 'art' |
| rule-08 | B -> 'woe' |
| rule-09 | B -> 'are' |
| rule-10 | B -> 'one' |
| rule-11 | B -> 'war' |
| rule-12 | B -> 'two' |
| rule-13 | B -> 'ear' |
#+TBLFM: @2$1..@>$1='(format "rule-%02d" (1- @#));L
Generating =onewartwoearewe=
First way to generate:
| Input | Rule | Product |
|-------------------+---------+-------------------|
| '' | rule-01 | A'we' |
| A'we' | rule-04 | BA'we' |
| BA'we' | rule-05 | 'o'A'we' |
| 'o'A'we' | rule-04 | 'o'BA'we' |
| 'o'BA'we' | rule-06 | 'onew'A'we' |
| 'onew'A'we' | rule-04 | 'onew'BA'we' |
| 'onew'BA'we' | rule-07 | 'onewart'A'we' |
| 'onewart'A'we' | rule-04 | 'onewart'BA'we' |
| 'onewart'BA'we' | rule-08 | 'onewartwoe'A'we' |
| 'onewartwoe'A'we' | rule-03 | 'onewartwoe'B'we' |
| 'onewartwoe'B'we' | rule-09 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
| | | 'onewartwoearewe' |
Second way to generate:
| Input | Rule | Product |
|-------------------+---------+-------------------|
| '' | rule-02 | A'ewe' |
| A'ewe' | rule-04 | BA'ewe' |
| BA'ewe' | rule-10 | 'one'A'ewe' |
| 'one'A'ewe' | rule-04 | 'one'BA'ewe' |
| 'one'BA'ewe' | rule-11 | 'onewar'A'ewe' |
| 'onewar'A'ewe' | rule-04 | 'onewar'BA'ewe' |
| 'onewar'BA'ewe' | rule-12 | 'onewartwo'A'ewe' |
| 'onewartwo'A'ewe' | rule-03 | 'onewartwo'B'ewe' |
| 'onewartwo'B'ewe' | rule-13 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
| | | 'onewartwoearewe' |
B -> 'o'
artık belirsiz olmayacaktır ...
S
. Kuralın uygulanmasıyla S := ...
, biz olsun ...
, ..."