जंग + टोकी पोना
किसी भी भाषा को स्वीकार किया जाता है, इसलिए मैंने रस्ट में एक कार्यक्रम लिखा जो टोकी पोना में कुछ वाक्य उत्पन्न करता है ।
टोकी पोना एक न्यूनतम प्राकृतिक भाषा बनाने का एक प्रयास है, और इसमें एक सुपर सरल और नियमित व्याकरण है। यह इस प्रतियोगिता के लिए एक बहुत ही उपयोगी संपत्ति है!
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);
}
मैं टोकी पोना नहीं बोलता, लेकिन मुझे विकीपीडिया पर बीएनएफ के नियमों के एक सेट के रूप में टोकी पोना का वाक्य विन्यास मिला । मैंने प्रत्येक बीएनएफ नियम के लिए एक संरचना या एनम बनाया, और मैंने उन्हें एनोटेट किया deriving(Rand)
, जो मुझे Phrase
मुफ्त में एक यादृच्छिक संरचना उत्पन्न करने का एक तरीका देता है ! फिर, मैंने ToStr
इनमें से प्रत्येक संरचना को एक स्ट्रिंग में बदलने के लिए लागू किया।
मैं जानबूझकर फ्रेंच में नाम छोड़ देता हूं, क्योंकि मुझे मिला बीएनएफ नियम फ्रेंच में है, और यह भी क्योंकि यह मेरे प्रस्तुत करने की बहुभाषी प्रकृति को पुष्ट करता है!
नमूना आउटपुट
कुछ आउटपुट और उनके अनुवाद, जो मैंने बीएनएफ नियमों और एक टोकी पोना शब्दकोश पर आधारित थे । मुझे यकीन है कि ये अनुवाद अधिकतर गलत हैं, लेकिन टोकी पोना वास्तव में एक वाक्य की व्याख्या के लिए बहुत जगह छोड़ता है।
नासिन मील तवा ला जान ली जाकी
मेरी यात्रा के दौरान, किसी ने प्रदूषित किया
मोनसी ली जाकी ली जान इक मुसी
बट गंदा है और एक मजाकिया बुरा व्यक्ति है
सिना ली तवा एले जेलो ई किली तवा ई इंसा
आपने फल और केंद्र को पीले ब्रह्मांड में स्थानांतरित कर दिया
मुद्दे
- मैं जाँच नहीं करता कि एक क्रिया सकर्मक है या नहीं, इस प्रकार कुछ वाक्य व्याकरणिक रूप से गलत हैं।
- कुछ संरचनाएं पुनरावर्ती हैं, और जब एक नियम दोहराया जा सकता है तो मैं यादृच्छिक रूप से आउटपुट 0, 1 या 2 तत्वों का चयन कर सकता हूं। यह लंबे समय से उत्पन्न वाक्यों के कारण हो सकता है, जिसमें हजारों शब्द होंगे ...
- मैं वास्तव में आउटपुट की वैधता को सत्यापित नहीं कर सकता, मैं पूरी तरह से बीएनएफ सिंटैक्स, शब्दकोश, और मेरे अपने जंगली अनुमानों पर भरोसा करता हूं :)