Saya mencoba memahami apa yang dimaksud dengan "deterministik" dalam ungkapan seperti "tata bahasa bebas konteks deterministik". (Ada lebih banyak "hal-hal" deterministik dalam bidang ini). Saya akan menghargai contoh lebih dari penjelasan yang paling rumit! Jika memungkinkan.
Sumber kebingungan utama saya adalah dari tidak dapat mengatakan bagaimana properti tata bahasa ini berbeda dari ambiguitas (non-).
Yang paling dekat saya menemukan maknanya adalah kutipan dari makalah ini oleh D. Knuth On Translation of Languages dari Kiri ke Kanan :
Ginsburg dan Greibach (1965) telah mendefinisikan gagasan tentang bahasa deterministik; kami menunjukkan dalam Bagian V bahwa ini adalah bahasa yang tepat untuk tata bahasa LR (k)
yang menjadi melingkar segera setelah Anda sampai ke Section V
, karena di sana dikatakan bahwa apa yang dapat diurai LR (k) adalah bahasa deterministik ...
Di bawah ini adalah contoh yang bisa saya temukan untuk membantu saya memahami apa arti "ambigous", silakan lihat:
onewartwoearewe
Yang dapat diuraikan sebagai one war two ear ewe
atau o new art woe are we
- jika tata bahasa memungkinkan itu (katakan itu memiliki semua kata yang baru saja saya daftarkan).
Apa yang harus saya lakukan untuk menjadikan contoh bahasa ini (non-) deterministik? (Saya bisa, misalnya, menghapus kata o
dari tata bahasa, untuk membuat tata bahasa tidak ambigu).
Apakah bahasa di atas deterministik?
PS. Contohnya adalah dari buku Godel, Esher, Bach: Eternal Golden Braid.
Katakanlah, kita mendefinisikan tata bahasa untuk contoh bahasa seperti ini:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Dengan argumen tentang harus menguraikan seluruh string, apakah tata bahasa ini membuat bahasa menjadi non-deterministik?
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'
, maka tidak lagi ambigu ...S
. Dengan penerapan aturanS := ...
, kita dapat...
, ..."Jawaban:
PDA adalah deterministik, karenanya DPDA, jika untuk setiap konfigurasi otomaton yang dapat dijangkau, terdapat paling banyak satu transisi (yaitu, paling banyak satu konfigurasi baru dimungkinkan). Jika Anda memiliki PDA yang dapat mencapai beberapa konfigurasi yang memungkinkan dua atau lebih transisi unik, Anda tidak memiliki DPDA.
Contoh:
Ini adalah PDA nondeterministik karena konfigurasi awal -
q_0, Z0
- dapat dicapai, dan ada dua transisi yang valid yang menjauh darinya jika simbol inputnya adalaha
. Kapan pun PDA ini mulai mencoba memproses string yang dimulai dengana
, ada pilihan. Pilihan berarti tidak deterministik.Pertimbangkan, sebagai gantinya, tabel transisi berikut:
Anda mungkin tergoda untuk mengatakan bahwa PDA ini tidak deterministik; setelah semua, ada dua transisi yang valid dari konfigurasi
q1, b(a+b)*
, misalnya. Namun, karena konfigurasi ini tidak dapat dijangkau oleh jalur apa pun melalui otomat, itu tidak masuk hitungan. Satu-satunya konfigurasi yang dapat dijangkau adalah subset dariq_0, (a+b)*Z0
,,q1, a(a+b)*Z0
danq2, b(a+b)*Z0
, dan untuk masing-masing konfigurasi ini, paling banyak satu transisi ditentukan.CFL adalah deterministik jika itu adalah bahasa beberapa DPDA.
CFG tidak ambigu jika setiap string memiliki paling banyak satu derivasi yang valid menurut CFG. Kalau tidak, tata bahasanya ambigu. Jika Anda memiliki CFG dan Anda dapat menghasilkan dua pohon derivasi berbeda untuk beberapa string, Anda memiliki tata bahasa yang ambigu.
CFL secara inheren ambigu jika bukan bahasa CFG yang tidak ambigu.
Perhatikan yang berikut ini:
sumber
x+
- satu atau lebihx
,(x)*
- nol atau lebihx
?x+
biasanya mengacu pada "satu atau lebih darix
, sedangkanx*
biasanya mengacu pada" nol atau lebih darix
; Saya dapat menggunakanxx*
di tempatx+
, karena ini identik.Berikut ini contoh (dari Wikipedia):
Bahasa bebas konteks adalah deterministik jika dan hanya jika terdapat setidaknya satu otomat push-down deterministik yang menerima bahasa itu. (Mungkin juga ada banyak automata push-down non-deterministik yang menerima bahasa, dan itu masih akan menjadi bahasa deterministik.) Pada dasarnya automata push-down deterministik adalah salah satu di mana transisi mesin ditentukan secara deterministik berdasarkan keadaan saat ini, simbol input dan simbol tumpukan saat ini . Deterministikdi sini berarti bahwa tidak ada lebih dari satu transisi status untuk simbol state / input / simbol stack paling atas. Jika Anda memiliki dua atau lebih status berikutnya untuk beberapa simbol status / input / simbol stack paling atas tiga kali maka otomatnya tidak deterministik. (Anda harus "menebak" transisi mana yang harus diambil untuk memutuskan apakah otomat menerima atau tidak.)
Apa yang Knuth buktikan adalah bahwa setiap tata bahasa LR (k) memiliki otomat pushdown deterministik dan bahwa setiap deterministik pushdown automata memiliki tata bahasa LR (k). Jadi, tata bahasa LR (k) dan automata pushdown deterministik dapat menangani serangkaian bahasa yang sama. Tetapi serangkaian bahasa yang memiliki otomat pushdown deterministik yang menerimanya adalah (menurut definisi) bahasa deterministik. Argumennya tidak melingkar.
Jadi bahasa deterministik menyiratkan bahwa ada tata bahasa yang tidak ambigu. Dan kami telah menunjukkan tata bahasa yang tidak ambigu yang tidak memiliki otomat pushdown deterministik (dan dengan demikian itu adalah tata bahasa yang tidak ambigu yang menerima bahasa yang tidak deterministik.)
sumber
Bahasa bebas konteks deterministik adalah bahasa yang diterima oleh beberapa otomat pushdown deterministik (bahasa bebas konteks adalah bahasa yang diterima oleh beberapa otomat pushdown non-deterministik). Dengan demikian, ini adalah properti bahasa daripada tata bahasa . Sebaliknya, ambiguitas adalah properti dari tata bahasa, sementara ambiguitas yang melekat adalah properti dari bahasa (bahasa bebas konteks secara inheren ambigu jika setiap tata bahasa bebas konteks untuk bahasa adalah ambigu).
Ada hubungan antara dua definisi: bahasa bebas konteks bebas deterministik tidak pernah secara inheren ambigu, seperti yang ditunjukkan dalam jawaban untuk pertanyaan ini .
sumber
sumber
Definisi
Jika setiap tata bahasa yang menghasilkan CFL adalah ambigu, maka CFL disebut inheren ambigu . Jadi itu bukan bahasa setiap CFGs ambigu.
Fakta
Jawab pertanyaan Anda (hubungan antara determinisme dan ambiguitas)
Ambiguitas (Non) berlaku terutama untuk tata bahasa (di sini CFG). (Non) determinisme berlaku untuk tata bahasa dan otomat (di sini PDA).
Jika Anda menginginkan perbedaan logis, Anda dapat melihat empat poin terakhir di bagian fakta ketika mereka mencoba menghubungkan ambiguitas dan determinisme. Di sini saya mengulanginya lagi:
CFL yang diterima oleh beberapa PDA deterministik pada dasarnya tidak ambigu . (Ada setidaknya satu CFG jelas untuk itu.)
PS:
sumber