Pas + Toki Pona
Herhangi bir dil kabul edilir, bu yüzden Rust'ta Toki Pona'da bazı cümleler üreten bir program yazdım .
Toki Pona, minimal bir doğal dil yaratma çabasıdır ve çok basit ve düzenli bir gramer bilgisine sahiptir. Bu yarışma için çok faydalı bir özellik!
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);
}
Toki Pona bilmiyorum, ama Toki Pona'nın sözdizimini Vikipedi'de bir BNF kuralı olarak buldum . Her BNF kuralı için bir yapı ya da enum oluşturdum ve bunları ücretsiz olarak deriving(Rand)
rastgele bir Phrase
yapı oluşturmanın bir yolunu veren ek açıklama yaptım ! Sonra, ToStr
bu yapıların her biri için bir dizgeye dönüştürmek üzere uygulandım .
Yapısal isimleri fransızca olarak bıraktım, çünkü bulduğum BNF kuralları fransızcadır ve aynı zamanda gönderimimin çok dilli doğasını da reinfokt ettiğinden!
Örnek çıktılar
BNF kurallarına ve Toki Pona sözlüğüne dayanarak yaptığım bazı çıktılar ve çevirileri . Eminim bu çeviriler çoğunlukla yanlıştır, fakat Toki Pona aslında bir cümlenin yorumlanmasına yer bırakıyor.
nasin mi tawa la jan li jaki
Seyahatimdeyken biri kirlendi
monsi li jaki li jan ike musi
Popo kirli ve komik kötü bir insan
sina li tawa ale jelo e kili tawa e insa
Meyveyi ve merkezi sarı evrene taşıdın
Sorunlar
- Bir fiilin geçişli olup olmadığını kontrol etmiyorum, bu nedenle bazı cümleler dilbilgisi yanlıştır.
- Bazı yapılar özyinelemelidir ve bir kural tekrarlandığında rastgele 0, 1 veya 2 eleman çıkarmayı seçerim. Bu, binlerce kelime içeren veeeeeery uzun oluşturulan cümleler yol açabilir ...
- Çıktının geçerliliğini gerçekten doğrulayamıyorum, tamamen BNF sözdizimini, sözlüğünü ve kendi vahşi tahminlerime güveniyorum :)