% 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).