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:

  1. 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.

  2. 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

Date: 09. Dez 2019

Author: Greg Kobele

Created: 2019-12-09 Mon 10:51

Validate