Iowa-Oto
This is an example of a language project. This project implements a linguistic generalization regarding well-formed words in Iowa-Oto.
This project is an example of a Recognizer modeling Phonology.
This project would earn a grade of 1,0.
import Tsl
Description of the generalization
This project is about the distribution of stress in the language Iowa-Oto, an extinct Siouan language of North America (Ethnologue entry; Wikipedia entry).
Iowa-Oto has a ternary stress system, where, in long enough words, stress falls on every third syllable, counting from the peninitial (second) syllable. In words with just one syllable, stress is on the first (and only) syllable. The generalization comes from page 319 of the paper On the role of locality in learning stress patterns (2009) by Jeffrey Heinz, which is a simplification of (and extrapolation from) the description in section 7 of the paper Descriptive Grammar of Ioway-Oto (1947) by William Whitman. In the latter paper, Whitman says that
the Ioway language has a free primary accent on one of the first two syllables of a word. (p238)
There are two types of secondary stress, the one described by Heinz is
rhythmically determined by the position of the primary accent and falls on the third syllable after the one bearing the primary accent. (p238)
- References
- Heinz, Jeffrey (2009). On the role of locality in learning stress patterns. Phonology 26. 303-351.
- Whitman, William (1947). Descriptive Grammar of Ioway-Oto. International Journal of American Linguistics. 13(4). 233-248.
Here are some examples of words which conform to this generalization, and those which do not. I represent an unstressed syllable as 0
, a primary stressed syllable as 1
and a secondary stressed syllable as 2
.
trueWords = [ [1] , [0,1] , [0,1,0] , [0,1,0,0] , [0,1,0,0,2,0] , [0,1,0,0,2,0,0,2]] falseWords = [ [2] , [1,0] , [1,0,0] , [0,0,1] , [0,1,0,2] , [0,1,0,0,0,2]]
Implementation
We can use a 2-SL grammar to describe this generalization.
ioStress = learnTSL 3 ["1","01","0100","01002","010020020"]
The factors are:
Factors concerning primary stress
- ">1<"
- ">01"
- "01<"
- "010"
- "100"
As primary stress falls on the peninitial syllable in all but finitely many cases, we exceptionally license initial (and final) stress in too short words by adding the 3-factors ">1<" (licensing primary stress in monosyllables) and "01<" (which happens only in disyllables). The general case is generated by the factor ">01", which allows primary stress in a peninitial position. The remaining factors "010" and "100" allow up to two unstressed syllables to follow a primary stressed one.
Factors involving secondary stress
- "002"
- "020"
- "20<"
- "200"
- "02<"
- "00<"
Secondary stress is very regular, appearing only on every third syllable, starting counting at the main stress. Because the 3-grams specifying two stresses simultaneously ("202","102","201") are not permitted, this forces only one stress to appear in a window of three syllables. The 3-grams "02<", "20<", and "00<" permit a word to end with 0, 1, and 2 unstressed syllables.
Verification
To test our implementation, we define a function which attempts to use a grammar to recognize each word in a list of words, each time reporting on the result.
test :: (Eq b, Show b) => TSL b -> [[b]] -> IO () test g ws = sequence_ $ fmap attempt ws where attempt w = putStrLn (show w ++ "\t\t" ++ show (acceptTSL g 3 w))
The program can be tested using the following function.
main :: IO () main = do putStrLn "These should be accepted" test ioStress trueWords putStrLn "\nThese should be rejected" test ioStress falseWords return ()
The output should look like the following:
*Main> main These should be accepted [1] True [0,1] True [0,1,0] True [0,1,0,0] True [0,1,0,0,2,0] True [0,1,0,0,2,0,0,2] True These should be rejected [2] False [1,0] False [1,0,0] False [0,0,1] False [0,1,0,2] False [0,1,0,0,0,2] False