% Signature % ========= bot sub [unit,list,segment]. unit sub [cluster,syllable,word] intro [first:segment, last:segment]. cluster sub [consonant_cluster, vowel_cluster] intro [segments:list_segment]. consonant_cluster sub [onset,coda]. onset sub []. coda sub []. vowel_cluster sub []. syllable sub [] intro [syllable:list_segment]. word sub [] intro [syllables:list_list_segment]. segment sub [consonant,vowel]. consonant sub [sibilant,obstruent,nasal,liquid,glide]. sibilant sub [s,z]. s sub []. z sub []. obstruent sub [p,t,k,b,d,g]. p sub []. t sub []. k sub []. b sub []. d sub []. g sub []. nasal sub [n,m]. n sub []. m sub []. liquid sub [l,r]. l sub []. r sub []. glide sub [y,w]. y sub []. w sub []. vowel sub [a,e,i,o,u]. a sub []. e sub []. i sub []. o sub []. u sub []. list sub [e_list,ne_list,list_segment,list_list_segment]. e_list sub []. ne_list sub [ne_list_segment,ne_list_list_segment] intro [hd:bot, tl:list]. list_segment sub [e_list,ne_list_segment]. ne_list_segment sub [] intro [hd:segment, tl:list_segment]. list_list_segment sub [e_list,ne_list_list_segment]. ne_list_list_segment sub [] intro [hd:list_segment, tl:list_list_segment]. % Rules % ===== word_schema_rec rule (word, syllables:[Syllable|Syllables], first:First1, last:Last2) ===> cat> (syllable, syllable:Syllable, first:First1, last:Last1), cat> (word, syllables:Syllables, first:First2, last:Last2), goal> (\+ less_sonorous(Last1,First2)). word_schema_base rule (word, syllables:[Syllable], first:First, last:Last) ===> cat> (syllable, syllable:Syllable, first:First, last:Last). v_syllable rule (syllable, syllable:[Vowel], first:Vowel, last:Vowel) ===> cat> (vowel,Vowel). vc_syllable rule (syllable, syllable:[Vowel|Segs1], first:Vowel, last:Last) ===> cat> (vowel,Vowel), cat> (coda, segments:Segs1, last:Last). cv_syllable rule (syllable, syllable:Segs, first:First, last:Vowel) ===> cat> (onset, segments:Segs1, first:First), cat> (vowel,Vowel), goal> append(Segs1,[Vowel],Segs). cvc_syllable rule (syllable, syllable:Segs, first:First, last:Last) ===> cat> (onset, segments:Segs1, first:First), cat> (vowel,Vowel), cat> (coda, segments:Segs2, last:Last), goal> append(Segs1,[Vowel|Segs2],Segs). consonant_cluster_base rule (consonant_cluster, segments:[Consonant], first:Consonant, last:Consonant) ===> cat> (consonant,Consonant). onset rule (onset, segments:[Consonant1|Consonants], first:Consonant1, last:Consonant3) ===> cat> (consonant,Consonant1), cat> (onset, segments:Consonants, first:Consonant2, last:Consonant3), goal> less_sonorous(Consonant1,Consonant2). coda rule (coda, segments:[Consonant1|Consonants], first:Consonant1, last:Consonant3) ===> cat> (consonant,Consonant1), cat> (coda, segments:Consonants, first:Consonant2, last:Consonant3), goal> less_sonorous(Consonant2,Consonant1). % Lexicon % ======= p ---> p. t ---> t. k ---> k. b ---> b. d ---> d. g ---> g. s ---> s. z ---> z. n ---> n. m ---> m. l ---> l. r ---> r. y ---> y. w ---> w. a ---> a. e ---> e. i ---> i. o ---> o. u ---> u. % Definite Clauses % ================ less_sonorous_basic(sibilant,obstruent) if true. less_sonorous_basic(obstruent,nasal) if true. less_sonorous_basic(nasal,liquid) if true. less_sonorous_basic(liquid,glide) if true. less_sonorous_basic(glide,vowel) if true. less_sonorous(L1,L2) if less_sonorous_basic(L1,L2). less_sonorous(L1,L2) if less_sonorous_basic(L1,L3), less_sonorous(L3,L2). append([],Xs,Xs) if true. append([X|Xs],Ys,[X|Zs]) if append(Xs,Ys,Zs).