Karat + Toki Pona
Bahasa apa pun diterima, jadi saya menulis sebuah program di Rust yang menghasilkan beberapa kalimat dalam Toki Pona .
Toki Pona adalah upaya untuk menciptakan bahasa alami yang minimal, dan memiliki tata bahasa yang super sederhana dan teratur. Itu properti yang sangat berguna untuk kontes ini!
use std::rand;
#[deriving(Rand)]
struct Phrase { a: Option<~GNominal>, b: ~Sujet, c: ~Predicat }
#[deriving(Rand)]
enum Sujet { A(~GNominal), B(~SCompose) }
#[deriving(Rand)]
enum Predicat { C(~GVerbal), D(~PCompose) }
#[deriving(Rand)]
struct SCompose { a: ~Sujet, b: ~Sujet }
#[deriving(Rand)]
struct PCompose { a: ~Predicat, b: ~Predicat }
#[deriving(Rand)]
struct GNominal { a: ~nom::Nom, b: Multi<~adjectif::Adjectif> }
#[deriving(Rand)]
struct GVerbal { a: ~verbe::Verbe, b: Multi<~adjectif::Adjectif>, c: Multi<~ODirect> }
#[deriving(Rand)]
struct ODirect { a: ~GNominal}
#[deriving(Rand)]
enum Multi<T> { Zero, One(T), Two((T,T)) }
mod nom {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Nom {akesi,ala,ale,anpa,ante,ijo,ike,ilo,insa,jaki,jan,jo,kala,kalama,kama,kasi,ken,kili,kiwen,ko,kon,kule,kulupu,lape,lawa,len,lete,linja,lipu,luka,lupa,ma,mama,mani,meli,mi,mije,moku,moli,monsi,mun,musi,mute,nanpa,nasin,nena,nimi,noka,oko,olin,ona,pakala,pali,palisa,pana,pilin,pimeja,pini,pipi,poka,poki,pona,seli,selo,sewi,sijelo,sike,sina,sinpin,sitelen,sona,soweli,suli,suno,supa,suwi,tan,tawa,telo,tenpo,toki,tomo,tu,unpa,uta,utala,walo,wan,waso,wawa,weka,wile}
}
mod verbe {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Verbe {ante,awen,ijo,ike,jaki,jan,jo,kalama,kama,ken,kepeken,kule,kute,lape,lawa,lete,lili,lon,lukin,moku,moli,musi,mute,nasa,olin,open,pakala,pali,pana,pilin,pimeja,pini,pona,seli,sin,sitelen,sona,suli,suwi,tawa,telo,toki,tu,unpa,utala,wan,wawa,weka,wile,}
}
mod adjectif {
#[deriving(Rand)]
#[deriving(ToStr)]
pub enum Adjectif {ala,ale,anpa,ante,awen,ike,insa,jaki,jan,jelo,kama,kin,kiwen,kon,kule,kute,kulupu,lape,laso,lawa,lete,lili,linja,loje,luka,lukin,mama,meli,mi,mije,moli,monsi,mun,musi,mute,nasa,ni,olin,ona,pali,pimeja,pini,poka,pona,sama,seli,sewi,sike,sin,sina,suli,suwi,taso,tawa,toki,tomo,unpa,uta,walo,wan,wawa,weka,wile,}
}
impl ToStr for Phrase {
fn to_str(&self) -> ~str {
self.a.as_ref().map_or(~"", |g| format!("{:s} la ", g.to_str()))
+ format!("{:s} li {:s}", self.b.to_str(), self.c.to_str())
}
}
impl ToStr for Sujet {
fn to_str(&self) -> ~str {
match *self {
A(ref v) => v.to_str(),
B(ref v) => v.to_str(),
}
}
}
impl ToStr for Predicat {
fn to_str(&self) -> ~str {
match *self {
C(ref v) => v.to_str(),
D(ref v) => v.to_str(),
}
}
}
impl ToStr for SCompose {
fn to_str(&self) -> ~str {
format!("{:s} en {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for PCompose {
fn to_str(&self) -> ~str {
format!("{:s} li {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for GNominal {
fn to_str(&self) -> ~str {
format!("{:s} {:s}", self.a.to_str(), self.b.to_str())
}
}
impl ToStr for GVerbal {
fn to_str(&self) -> ~str {
format!("{:s} {:s} {:s}", self.a.to_str(), self.b.to_str(), self.c.to_str())
}
}
impl ToStr for ODirect {
fn to_str(&self) -> ~str {
format!("e {:s}", self.a.to_str())
}
}
impl<T: ToStr> ToStr for Multi<~T> {
fn to_str(&self) -> ~str {
match *self {
Zero => ~"",
One(ref v) => v.to_str(),
Two((ref v,ref w)) => format!("{:s} {:s}", v.to_str(), w.to_str()),
}
}
}
fn main() {
let phrase = rand::random::<Phrase>();
println!("{:s}\n{:?}", phrase.to_str(), phrase);
}
Saya tidak berbicara Toki Pona, tetapi saya menemukan sintaksis Toki Pona sebagai seperangkat aturan BNF di Wikipedia. Saya membuat satu struct atau enum untuk setiap aturan BNF, dan saya menjelaskannya dengan deriving(Rand)
, yang memberi saya cara untuk menghasilkan Phrase
struct acak gratis! Kemudian, saya menerapkan ToStr
untuk masing-masing struct ini untuk mengubahnya menjadi string.
Saya bermaksud meninggalkan nama struct dalam bahasa Prancis, karena aturan BNF yang saya temukan adalah dalam bahasa Prancis, dan juga karena itu memasukkan kembali sifat multibahasa dari pengiriman saya!
Output sampel
Beberapa output dan terjemahannya, yang saya lakukan berdasarkan aturan BNF dan kamus Toki Pona . Saya yakin terjemahan ini sebagian besar salah, tetapi Toki Pona sebenarnya meninggalkan banyak ruang untuk penafsiran sebuah kalimat.
nasin mi tawa la jan li jaki
Saat dalam perjalanan, seseorang mencemari
monsi li jaki li jan ike musi
Puntungnya kotor dan orang jahat yang lucu
sina li tawa ale jelo e kili tawa e insa
Anda memindahkan buah dan pusat ke alam semesta kuning
Masalah
- Saya tidak memeriksa apakah kata kerja transitif atau tidak, sehingga beberapa kalimat secara tata bahasa salah.
- Beberapa struct bersifat rekursif, dan ketika sebuah aturan dapat diulang, saya secara acak memilih untuk menghasilkan elemen 0, 1 atau 2. Ini dapat menyebabkan kalimat yang dibuat lama oleh veeeeeery, mengandung ribuan kata ...
- Saya tidak dapat benar-benar memverifikasi validitas output, saya sepenuhnya mengandalkan sintaks BNF, kamus, dan tebakan liar saya sendiri :)