Apakah bahasa reguler yang diberikan mengandung subset bebas awalan tak terbatas?


11

Seperangkat kata di atas alfabet terbatas bebas awalan jika tidak ada dua kata yang berbeda di mana satu merupakan awalan dari yang lain.

Pertanyaannya adalah:

Apa kompleksitas memeriksa apakah bahasa reguler yang diberikan sebagai NFA berisi subset bebas awalan tak terbatas?

Jawaban (karena Mikhail Rudoy, ​​di sini di bawah ini) : Ini dapat dilakukan dalam waktu polinomial, dan saya pikir bahkan dalam NL.

Mengutip jawaban Mikhail, misalkan menjadi input NFA dalam bentuk normal (tanpa transisi epsilon, trim), dan biarkan (resp. ) menjadi bahasa yang diperoleh dengan memiliki negara sebagai keadaan awal dan sebagai keadaan akhir (resp. keadaan sebagai inital dan set sebagai final). Untuk kata biarkan menjadi kata tak terbatas yang diperoleh dengan iterasi .( Σ , q 0 , F , δ ) ( Σ , q0, F, δ)L [ p , r ] L [ p , r ]L [ p , R ] L[p,R]p p{ r } {r}p pR Ru uu ωuω uu

Berikut ini adalah setara:

  1. Bahasa berisi subset bebas awalan tak terbatas.L [ q 0 , F ]L[q0,F]
  2. q QqQ , sehingga bukan awalan dari .u L [ q , q ] { ε } uL[q,q]{ε} v L [ q , F ] vL[q,F]v vu ωuω
  3. q Q qQ L [ q , q ] { ε } L[q,q]{ε} u L [ q , q ] uL[q,q] v L [ q , F ]vL[q,F] sehingga bukan awalan dari .v vu ωuω

Bukti:

3 2 sepele.

Untuk 2 1, sudah cukup untuk melihat bahwa untuk setiap kita memiliki adalah subset bebas awalan tak terbatas dari .w L [ q 0 , q ] wL[q0,q]w ( u | v | ) v w(u|v|)vL [ q 0 , F ]L[q0,F]

Akhirnya, 1 3 adalah bukti "benar" dalam jawaban Mikhail.

Jawaban:


7

Masalah Anda dapat diselesaikan dalam waktu polinomial.

Untuk memulai, konversikan NFA yang diberikan ke NFA yang setara dengan properti tambahan berikut:

  • Tidak ada transisi epsilon
  • Semua status dapat dijangkau dari kondisi awal

Subrutin bermanfaat

Misalkan kita memiliki NFA , state , dan string nonempty . Subrutin berikut akan memungkinkan kami mengevaluasi nilai kebenaran dari pernyataan berikut: "setiap jalur di dari status ke kondisi terima berhubungan dengan string yang merupakan awalan dari string untuk beberapa ." Selanjutnya, subrutin ini akan berjalan dalam waktu polinomial.N Nq qs sN Nq qs nsn nn

Pertama, buat NFA dengan menyatakan yang menerima semua string yang bukan awalan untuk sembarang ( keadaan tidak-terima dalam satu lingkaran untuk melacak di mana di "pola" kita sejauh ini, dan satu menerima keadaan jika kita telah menyimpang dari pola itu). Selanjutnya, buat NFA yang persis seperti tetapi memiliki sebagai status awal. Akhirnya, buat NFA final yang bahasanya adalahS S| s | + 1 |s|+1s nsn n n| s | |s|s s s s s ...sssss N 'N N Nq qN "N′′ L ( N " ) L(N′′)L ( S ) L ( N ' )L(S)L(N)menggunakan konstruksi persimpangan NFA standar. Perhatikan bahwa semua konstruksi ini jumlahnya banyak dalam ukuran input.

Kemudian cukup menguji apakah bahasa kosong (yang dapat dilakukan dalam waktu polinomial dengan pencarian grafik sederhana). jika dan hanya jika , atau dengan kata lain setiap string dalam tidak dalam . Dengan kata lain, bahasa kosong jika dan hanya jika hanya menerima string yang merupakan awalan dari untuk beberapa . Ini dapat diulangi persis dengan pernyataan yang kami coba evaluasi: "setiap jalur di dari status ke status terima berhubungan dengan string yang merupakan awalan dari stringN N′′ L ( N ) = L(N′′)=L ( S ) L ( N ) = L(S)L(N)=L ( N ) L(N)L ( S ) L(S)N N′′N Ns nsn n nN Nq qs nsn nuntuk beberapa . "n

Algoritma utama

Pertimbangkan serangkaian negara di NFA yang ada dalam beberapa lingkaran. Untuk setiap kondisi tersebut, , lakukan hal berikut:qq

Biarkan menjadi loop sederhana yang mengandung . Biarkan menjadi string sesuai dengan lingkaran . Karena NFA tidak memiliki transisi epsilon, tidak kosong. Kemudian menerapkan subrutin ke NFA, status , dan string . Jika subrutin memberi tahu kita bahwa setiap jalur yang dimulai pada di NFA dan berakhir di keadaan terima berhubungan dengan awalan untuk beberapa kemudian lanjutkan ke keadaan berikutnya . Kalau tidak, output bahwa bahasa NFA yang diberikan berisi subset bebas-prefeks tak terbatas.P 2P2 q qs sP 2P2 s sq qs sq qs nsn n nqq

Jika kita mencoba setiap status yang ada dalam satu lingkaran dan algoritme tidak pernah menghasilkan, maka keluaran bahwa bahasa NFA yang diberikan tidak mengandung subset bebas-batas tak terbatas.qq

Kebenaran (babak pertama)

Pertama, anggaplah bahwa algoritma di atas menyatakan bahwa bahasa NFA yang diberikan berisi subset bebas-prefeks tanpa batas. Katakanlah output ini dipilih sambil mempertimbangkan beberapa loop dan beberapa status . Seperti sebelumnya, adalah string yang sesuai dengan . Kemudian kita tahu menurut subrutin bahwa tidak setiap jalur yang dimulai pada di NFA dan berakhir pada status terima berhubungan dengan awalan untuk beberapa (karena ini adalah satu-satunya output dari subrutin yang akan mengarah ke main algoritma yang mengeluarkan ).P 2P2 q qs sP 2P2 q qs nsn n nqq

Biarkan menjadi lintasan yang keberadaannya ditegaskan oleh subrutin: lintasan dari ke keadaan terima sedemikian rupa sehingga string yang sesuai bukan awalan untuk sembarang .P 3P3 q qt ts nsn nn

Misalkan terdiri dari salinan mana cukup besar sehingga. Karena adalah loop melalui , dapat diperlakukan sebagai jalur dari ke . String yang terkait dengan adalahP 2P2 m mP 2P2 m mm | s | > | t | m|s|>|t|P 2P2 q qP 2P2 q qq qP 2P2 s msm

Biarkan menjadi jalur dari keadaan awal ke (yang ada karena setiap negara dapat dijangkau dari awal) dan biarkan menjadi string yang sesuai dengan jalur ini.P 1P1 q qrr

Kemudian jalur yang terdiri dari , salinan , dan adalah jalur perhitungan yang menerima. String yang terkait dengan path ini adalah . Dengan demikian, NFA menerima setiap string dari bentuk . Ini adalah rangkaian string tak terbatas yang diterima oleh NFA, dan saya mengklaim bahwa rangkaian string ini bebas awalan. Secara khusus, misalkan adalah awalan dengan . Dengan kata lain, adalah awalan dari . Karena memiliki panjang, ini menyiratkan ituP 1P1 x xP 2P2 P 3P3 r ( s m ) x t r(sm)xtr ( s m ) x t r(sm)xtr ( s m ) x t r(sm)xtr ( s m ) y t r(sm)yty > x y>xt t( s m ) y - x t (sm)yxt( s m ) y - x(sm)yx m ( y - x )| s | m | s | > | t | m ( yx)|s|m|s|>|t|t t adalah awalan dari . Tetapi kita tahu dari keluaran subrutin bahwa bukan awalan untuk . Dengan demikian, tidak bisa menjadi awalan , dan seperti yang diinginkan set string bebas awalan.( s m ) y - x = s m ( y - x )(sm)yx=sm(yx) t ts nsn n nr ( s m ) x t r(sm)xtr ( s m ) y tr(sm)yt

Jadi, saya telah menunjukkan bahwa jika algoritma utama menghasilkan bahwa bahasa NFA yang diberikan mengandung subset bebas-prefeks yang tak terbatas maka inilah kenyataannya.

Kebenaran (babak kedua)

Selanjutnya, saya akan menunjukkan setengah lainnya: jika bahasa NFA yang diberikan berisi subset bebas-batas tak terbatas maka algoritma utama akan menampilkan fakta ini.

Misalkan bahasa yang diberikan NFA berisi subset bebas awalan tak terbatas. Misalkan adalah himpunan jalur komputasi (menerima) yang sesuai dengan string ini. Perhatikan bahwa adalah himpunan tak terbatas untuk menerima jalur komputasi yang string yang bersesuaian tidak pernah saling awalan satu sama lain.A AAA

Katakanlah bahwa suatu negara adalah "perulangan" di NFA jika ada perulangan di NFA melalui keadaan itu dan "non-perulangan" sebaliknya. Pertimbangkan semua jalur dari kondisi awal ke kondisi pengulangan apa pun yang hanya melewati status non-pengulangan (kecuali untuk satu kondisi pengulangan di mana mereka berakhir). Biarkan menjadi himpunan jalur ini. Setiap jalur tidak dapat memiliki satu loop karena kemudian negara-negara di loop itu akan menjadi negara-negara pengulangan dan sehingga akan melewati suatu kondisi pengulangan. Dengan demikian, panjang lintasan dalam dibatasi di atas oleh jumlah status dalam NFA dan sehingga adalah terbatas (misalnya, jika keadaan awal adalah keadaan perulangan maka satu-satunya jalan tersebut adalah lintasan kosong).P Pp P pPp pP PPP

Kita dapat mempartisi menjadi himpunan bagian berdasarkan bagaimana jalur penghitungan dalam dimulai. Secara khusus, untuk , biarkan adalah himpunan semua jalur perhitungan di yang dimulai dengan jalan dan membiarkan adalah himpunan semua jalur lainnya di . Jelas, semua dan saling terpisah dan serikat mereka adalah seluruh set . Selain itu, hanya berisi jalur yang tidak pernah melewati kondisi perulangan, dan karenanya tidak pernah berulang; dengan demikian terbatas. Kita dapat menyimpulkan bahwa beberapaA A| P | + 1 |P|+1A Ap P pPA pAp A Ap pB BA AA pAp B BA AB BB BA pAp Aharus tak terbatas (jika tidak, akan menjadi gabungan dari set terbatas hingga terbatas).A

Karena tidak terbatas, ada banyak jalur komputasi yang tak terhingga, tidak ada string yang merupakan awalan satu sama lain, yang menerima jalur yang dimulai dengan . Biarkan menjadi keadaan yang dicapai di ujung jalan . Kita dapat menyimpulkan bahwa ada banyak jalur penerimaan, sebut set ini , mulai dari semuanya berhubungan dengan string yang bukan awalan satu sama lain.A pAp p pq qp pA A qq

Selama algoritma utama, kami menjalankan subrutin pada status dan beberapa string . Subrutin ini memberi tahu kita apakah setiap jalur penerimaan yang dimulai pada sesuai dengan string yang merupakan awalan untuk beberapa . Jika ini masalahnya, maka semua jalur penerimaan tak terhingga dalam akan menjadi awalan untuk berbagai , yang akan menyiratkan bahwa mereka semua adalah awalan satu sama lain. Ini tidak terjadi, jadi kami menyimpulkan bahwa ketika algoritma utama menjalankan subrutin pada statusq qs sq qs nsn n nA As nsn n nqq, hasilnya adalah hasil lain yang mungkin. Ini, bagaimanapun, mengarahkan algoritma utama untuk menghasilkan bahwa bahasa NFA berisi subset bebas awalan tak terbatas.

Ini menyimpulkan bukti kebenaran.


Saya tidak mengerti bagaimana penanganan loop bekerja, karena keadaan yang diberikan dapat menjadi bagian dari (secara eksponensial) banyak loop. Tentu saja, jika ada dua dari loop itu dapat digunakan untuk menghasilkan urutan non-periodik, maka kita selesai. qq
jaf

Apa yang Anda maksud dengan penanganan loop? Dalam algoritma utama, untuk setiap negara Anda memilih hanya satu loop yang melewati (loop apa pun yang berpotensi banyak secara eksponensial) dan menyebutnya loop (kata penutup Anda menjalankan subrutin pada state dan string mana adalah string terkait dengan P 2 ). Subrutin pada dasarnya menangani pemeriksaan apakah mungkin untuk menghasilkan urutan non-periodik menggunakan loop itu. Jika ya, maka kita sudah selesai. Jika tidak (dan selanjutnya tidak untuk setiap q ), maka seluruh bahasa Anda adalah gabungan dari urutan berkala sehingga kami juga selesai. q q P 2 q s sqqP2qssP2q
Mikhail Rudoy

Untuk membuat pertanyaan saya lebih jelas, berikut adalah sederhana NFA dengan awal negara q , keadaan akhir T dan tiga transisi: q a q , q b q , q seorang T . Loop untuk a tidak akan menghasilkan string bebas awalan, tetapi loop untuk b akan. qTqaqqbqqaTab
jaf

Sebenarnya, loop untuk sebuah melakukan menghasilkan awalan set gratis: himpunan string a * b yang semua penggunaan sebuah lingkaran. Dalam algoritma saya, jika loop Anda pilih untuk q adalah sebuah lingkaran maka subrutin akan menentukan bahwa tidak ada, tidak setiap jalan menerima mulai q memiliki string dari bentuk sebuah * , sehingga algoritma utama akan mengatakan bahwa awalan yang tak terbatas -Subset gratis ada. Jika loop yang digunakan algoritma untuk q adalah b loop maka subrutin menentukan bahwa tidak setiap jalur penerimaan yang dimulai pada q memiliki string dari bentuk baabaaqaqaqbq , dan dalam hal ini juga algoritma memiliki output yang sama. b
Mikhail Rudoy

Mikhail terima kasih! Saya pikir jawaban Anda menyelesaikan pertanyaan.
Googlo

2

Definisi

Definisi 1 : Biarkan SS menjadi seperangkat kata. Kami mengatakan bahwa SS adalah baik tak terbatas awalan bebas (dibuat nama untuk tujuan jawaban ini) jika ada kata-kata u 0 , ... , u n , ...u0,,un, dan v 1 , ... , v n , ...v1,,vn, sehingga:

  • Untuk setiap n 1n1 , u nun dan v nvn tidak kosong dan mulai dengan huruf yang berbeda;

  • S = { u 0 v 1 , ... , u 0 ... u n v n + 1 , ... }S={u0v1,,u0unvn+1,} .

Intuisi adalah bahwa Anda dapat meletakkan semua kata-kata itu pada pohon berakar yang tak terbatas ( yaitu akar, daun, dan simpul interior yang tersisa) dari bentuk berikut ini sehingga kata-kata dalam SS persis label label jalur dari akar ke daun:

   u₀    u₁    u₂
■-----•-----•-----•⋅⋅⋅
      |     |     |
      | v₁  | v₂  | v₃
      |     |     |
      ▲     ▲     ▲

Proposisi 1.1 : Satu set bebas awalan yang tak terbatas dengan baik adalah bebas awalan.

Bukti proposisi 1.1 : Misalkan u 0 ... u n v n + 1u0unvn+1 adalah awalan ketat u 0 ... u m v m + 1u0umvm+1 . Ada dua kasus:

  • Jika n < mn<m maka v n + 1vn+1 adalah awalan dari u n + 1 ... u m v m + 1un+1umvm+1 . Ini tidak mungkin karena u n + 1un+1 dan v n + 1vn+1 memiliki huruf pertama yang berbeda.

  • Jika n > mn>m maka u m + 1 ... u n v n + 1um+1unvn+1 adalah awalan dari v m + 1vm+1 . Ini tidak mungkin karena u m + 1um+1 dan v m + 1vm+1 memiliki huruf pertama yang berbeda.

Proposisi 1.2 : Perangkat awalan bebas tak terbatas yang tak terbatas tak terbatas.

Bukti proposisi 1.2 : Dalam bukti 1.1, kami menunjukkan bahwa jika n mnm maka u 0 ... u n v n + 1u0unvn+1 dan u 0 ... u m v m + 1u0umvm+1 tidak sebanding dengan urutan awalan. Karena itu mereka tidak sama.


Bukti utama

Proposisi 2 : Setiap set bebas awalan tak terbatas berisi set bebas awalan tak terbatas yang bagus.

Proposisi 3 : Suatu bahasa berisi kumpulan awalan infinite yang tak terbatas jika dan hanya jika itu berisi kumpulan awalan infinite yang tak terbatas.

Bukti di bawah ini.

Bukti proposisi 3 : oleh proposisi 2. oleh proposisi 1.1 dan 1.2.

Proposisi 4 : Himpunan himpunan bagian bebas awalan dari bahasa reguler (dikodekan sebagai kata tak terbatas ¯ u 0 ^ v 1 ¯ u 1 ^ v 2 ¯ u 2 ...u0¯¯¯¯¯v1ˆu1¯¯¯¯¯v2ˆu2¯¯¯¯¯ ) adalah ω-ω regular (dan ukuran Büchi otomat mengenali itu polinom dalam ukuran NFA mengenali bahasa biasa).

Bukti di bawah ini.

Teorema 5 : Memutuskan apakah bahasa reguler yang dijelaskan oleh NFA berisi subset bebas awalan tak terbatas dapat dilakukan dalam polinomial waktu dalam ukuran NFA.

Bukti teorema 5 : Dengan proposisi 3, cukup untuk menguji apakah mengandung subset bebas awalan yang tak terbatas, yang dapat dilakukan dalam waktu polinomial dengan membangun otomat Büchi yang diberikan oleh proposisi 4 dan menguji non-kekosongannya. bahasa (yang dapat dilakukan dalam waktu linier dalam ukuran otomat Büchi).


Bukti proposisi 2

Lemma 2.1 : Jika SS adalah perangkat awalan yang bebas, maka w - 1 Sw1S (untuk kata apa pun ww ).

Bukti 2.1 : Menurut definisi.

Lemma 2.2 : Biarkan SS menjadi kumpulan kata yang tak terbatas. Mari w : = LCP ( S n )w:=lcp(Sn) menjadi awalan umum terpanjang untuk semua kata-kata dalam SS . SS dan w - 1 Sw1S memiliki kardinal yang sama.

Bukti 2.2 : Tentukan f : w - 1 S Sf:w1SS oleh f ( x ) = w xf(x)=wx . Ini didefinisikan dengan baik oleh definisi w - 1 Sw1S , injeksi dengan definisi ff dan perkiraan dengan definisi ww .

Bukti proposisi 2 : Kami membangun u nun dan v nvn dengan induksi pada nn , dengan hipotesis induksi H nHn terdiri dari bagian berikut:

  • ( P 1 )(P1) Untuk semua k { 1 , , n }k{1,,n} , u 0 ... u k - 1 v kSu0uk1vkS ;

  • ( P 2 )(P2) Untuk semua k { 1 , ... , n }k{1,,n} , u kuk dan v kvk adalah non-kosong dan mulai dengan huruf yang berbeda;

  • ( P 3 ) (P3) S n : = ( u 0 ... u n ) - 1 SSn:=(u0un)1S tidak terbatas;

  • ( P 4 )(P4) Tidak ada awalan non-kosong yang umum untuk semua kata dalam S nSn . Dengan kata lain: Tidak ada huruf aa sehingga S na Σ SnaΣ .

Berkomentar 2.3 : Jika kita memiliki urutan yang memverifikasi H nHn tanpa ( P 4 )(P4) , kita dapat memodifikasi u nun untuk membuat mereka untuk juga memenuhi ( P 4 )(P4) . Memang, sudah cukup untuk mengganti u nun dengan u n lcp ( S n )unlcp(Sn) . ( P 1 )(P1) tidak terpengaruh. ( P 2 )(P2) sepele. ( P 4 )(P4) adalah dengan konstruksi. ( P 3 )(P3) oleh lemma 3.

Kami sekarang membangun urutan dengan induksi pada nn :

  • Inisialisasi: H 0H0 benar dengan mengambil u 0 : = lcp ( S )u0:=lcp(S) (yaitu dengan mengambil u 0 : = εu0:=ε dan menerapkan komentar 3.1).

  • Langkah induksi: Misalkan kita memiliki kata-kata u 1 , , u nu1,,un dan v 1 , , v nv1,,vn sedemikian rupa sehingga H nHn untuk beberapa nn . Kami akan membangun u n + 1un+1 dan v n + 1vn+1 sedemikian rupa sehingga H n + 1Hn+1 .

Karena S nSn tidak terbatas dan bebas awalan (oleh lemma 1), ia tidak mengandung εε sehingga S n = a Σ ( S na Σ )Sn=aΣ(SnaΣ) . Karena S nSn tidak terbatas, ada huruf aa sehingga S na Σ SnaΣ tidak terbatas. Pada ( P 4 )(P4) , ada huruf bb berbeda dari hurufa sedemikian sehingga S nb ΣSnbΣ tidak kosong. Pilih v n + 1S nb Σ vn+1SnbΣ . Mengambil u n + 1un+1 menjadi sebuaha akan memuaskan ( P 1 )(P1) , ( P 2 )(P2) dan ( P 3 )(P3) sehingga kita menerapkan pernyataan 3.1 untuk mendapatkan ( P 4 )(P4) : u n + 1 : = a LCP ( a - 1 S n)un+1:=alcp(a1Sn) .

( P 1 ) (P1) u 1 ... u n v n + 1u 1 ... u n ( S nb Σ * ) Su1unvn+1u1un(SnbΣ)S .

( P 2 )(P2) Dengan definisi u n + 1un+1 dan v n + 1vn+1 .

( P 3 ) (P3) a - 1 S na1Sn tidak terbatas dengan definisi aa , dan S n + 1Sn+1 karena itu tidak terbatas oleh lemma 3.

( P 4 )(P4) Dengan definisi u n + 1un+1 .


Bukti proposisi 4

Bukti proposisi 4 : Misalkan A = ( Q , , Δ , q 0 , F )A=(Q,,Δ,q0,F) menjadi NFA.

Idenya adalah sebagai berikut: kita membaca u 0u0 , mengingat di mana kita berada, membaca v 1 , mundur ke tempat kita setelah membaca u 0 , membaca u 1 , mengingat di mana kita berada, ... Kita juga ingat huruf pertama yang baca di setiap v n untuk memastikan bahwa u n dimulai dengan huruf yang lain.

Saya telah diberitahu bahwa ini bisa lebih mudah dengan automata multi-head tapi saya tidak terlalu terbiasa dengan formalisme jadi saya hanya akan menggambarkannya menggunakan otomat Büchi (dengan hanya satu kepala).

Kami mengatur Σ ' : = ¯ ΣΣ , di mana simbol-simbol overlined akan digunakan untuk menggambarkan u k s dan simbol dengan topi untuk v k s.

Kami menetapkan Q : = Q × ( { } ( Q × Σ ) ) , di mana:

  • ( Q , ) berarti bahwa Anda membaca beberapa u n ;

  • ( Q , ( p , a ) ) berarti bahwa Anda selesai membaca beberapa u n di negara p , bahwa Anda sekarang membaca v n + 1 yang dimulai dengan sebuah , dan bahwa setelah Anda selesai, Anda akan kembali ke p untuk membaca u n + 1 yang tidak dimulai dengan a .

Kami menetapkan q 0 : = ( q 0 , ) karena kami mulai dengan membaca u 0 .

Kami mendefinisikan F sebagai F × Q × Σ .

Set transisi didefinisikan sebagai berikut:

  • " u n " Untuk setiap transisi q a q , tambahkan ( q , ) ¯ a ( q , ) ;

  • " U n ke v n + 1 " Untuk setiap transisi q a q ' , add ( q , ) a' ( q ' , ( q , a ) ) ;

  • " V n " Untuk setiap transisi q a q ' , add ( q , ( p , a ) ) a' ( q ' , ( p , a ) ) ;

  • " v n to u n " Untuk setiap transisi p a p ′ di mana p adalah final dan huruf b berbeda dari a , tambahkan ( q , ( p , b ) ) ¯ a ( p , ) ;

Lemma 4.1 : ¯ u 0 ^ v 1 ¯ u 1 ^ v 2 ... ¯ u n ^ v n + 1 diterima oleh A iff untuk masing-masing n 1 , u n dan v n tidak kosong dan mulai dengan huruf yang berbeda , dan untuk setiap n 0 , u 0u n v n + 1L ( A) .

Bukti lemma 4.1 : diserahkan kepada pembaca.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.