"To the only wise God be glory forever through Jesus Christ! Amen."
(Romans 16:27)
1.0 General Introduction
This section describes the conditions on distribution, support ofthe language, history, objectives and implementation, and gives ascript for a quick start in using Fonol.
Online, you can look in the table of contents (TOC) by typing?/toc.
1.1 Fonol Distribution
Fonol is distributed with my blessings. You may give away copiesto your heart's content so long as you do not charge for the copiesand so long as you give all the distribution files in unmodified form.
1.2 Fonol Support
I intend to support Fonol as much as is possible with a sparetime project and I welcome your bug reports and suggestions forimprovements. When sending in bug reports, please give all the detailsof what happened including the matrix and rules you were trying torun. The transcription and batch file features will help in this (i.e.send a diskette with a batch file to set up the problem if it is atall complex). If you have the source code, please don't fix thingsyourself -- let me centralize the versions, OK? I also welcome anyhelp on the documentation so as to make sure that it is clear.
Positive reinforcement is naturally also welcome!
My current address is:
Frank R. Brandon
3937 Anewby Way
Fort Worth, TX 76133-6860
(817) 294-0239.
1.3 Porting Fonol
Porting to other machines that run Pascal or C, especially TurboPascal, should be fairly transparent since I wrote Fonol asgenerically as possible. I developed this version of Fonol on an AT&T6300 using Turbo Pascal 4.0, a version of Pascal that has incorporatedmany of the low level conveniences of C.
1.4 Fonol Objectives
Fonol is a programming language that simulates phonological rulesof the sort described in Chomsky and Halle 'Sound Pattern of English'or Schane 'Generative Phonology'. It also incorporates the input andoutput filters (conditions) which came into common use about the sametime. These filters are currently restricted to the identification ofa pattern and two actions: preventing the successful application of aspecific rule or blocking (starring) the entire derivation. Somestandard conventions on rule application are supported. Cycles ofseveral types are allowed for and other means of appropriate controlare also provided. Further extensions, variations, and deviations areincluded from later phonological folklore. (Let me know if there issomething truly vital missing -- I'll try to add it if I can.)
Fonol is designed to provide a way of writing phonological rulesand viewing their effects. It is intended to aid students of phonologyto grasp the ideas behind phonological rules and to help phonologistsmanage large complex bodies of rules in the theory of their choice.Considering how many competing theories and partial theories ofphonology exist, it may fail in the second case, even though I wouldlike to accommodate as many theoretical variations as possible. Sincean attempt will be made to provide for all theories, those who usemore restrictive theories will simply have to avoid using somefeatures of the Fonol language. In any case, it should be useful forstudents and in beginning work on undescribed phonological systems. Insome cases, Fonol will allow for the same effects as theoreticalsystems it does not directly support. In this case, try using what isprovided and fixing up or beautifying your rules when you put them inpaper form. A program written for the IBMs character oriented displayis not able to directly print the typographically complex forms ofphonological rules, anyway.
Computer simulation of phonological rules helps to advance thebroad generative program as well, in that no amount of hand-waving onthe part of the rule writer or good will on the part of the rulereader will have any effect on the way the software interprets what iswritten. In this sense, it forces the clarification of our ideas justas the whole explicit rule writing approach was meant to, only withoutany generosity in assumptions. In the 'wins-no-friends' department, italso has been beneficial in revealing how many 'radically new' ideasare reinventions of the wheel and in raising the question of how weselect one theory over another of similar descriptive power -- theproblem of notational variants. I personally do not want to solve allthese problems by myself. For this reason, you will find thedocumentation to be written in an informal style and filled withinvitations for you to write me with your ideas.
1.5 Fonol History
Fonol 1.0 was written in Microsoft's MBasic 5.2 under CP/M in1983 while I was employed in the Linguistics Department at theUniversidade Estadual de Campinas. A paper on it ('A Phonological RuleInterpreter for Microcomputers') was eventually published in 1985 inthe Proceedings of the Eleventh International Conference of theAssociation for Literary and Linguistic Computing ["Computers inLiterary and Linguistic Computing", Slatkine Reprints, Rue desChaudronniers, 5 - Case 765, CH-1211 Geneve 3, Switzerland].Intermediate versions through 3.0._ were written in my spare timeafter work while I was employed in the Human Factors Technology Groupat General Dynamics-Fort Worth. There was a hiatus of three yearsbetween version 3.0._ and 3.1.0 due to lack of interest. This dearthof stimulus was broken in late 1990 by Dr. Wayne Redenbarger -- towhom much appreciation! Recent versions from 3.1.0 to 4.0.0 werefunded in part by Aetna Insurance and the Social SecurityAdministration, I suppose, since they've been written while I've beenon disability leave and under treatment. The present version iswritten in Borland's Turbo Pascal 4.0 under MS-DOS.
The name 'Fonol' was chosen for similarities to Cobol, Snobol,Algol, etc. and because, since I was teaching in Brazil at the time,it seemed like a good abbreviation of 'Linguagem de ProgramaçäoFonológica'. I forgot that some people don't speak Portuguese.
1.6 Quick Start in Fonol
If you can't stand reading documentation, then please follow thisscript to get started:
--Type fonol at the A> prompt and hit Return.
--When you see the cursor flashing after the Fnl: prompt thenenter 'a --> b __d' and hit Return. You will see an error message withthe Atn: prompt followed by a Rec: prompt with what you entered. Thismeans you have an opportunity to recuperate the rule or recover fromthe error.
--Now use the arrows to go into the rule and put a '/' between band the '__'. Take this opportunity to remove any single quotes youmay have entered. Now hit Return.
--Now type d. You will see your rule and some information aboutspace usage.
--Now type '<<cad' and hit Return. If you left out the singlequotes then you will see your rule apply and yield 'cbd'.
--Now type 'l/swa.max' to load the demo Swahili phonologicalmatrix. Type 'm' and hit return to see the matrix (F9 to exit again).
--Type l/swa and hit Return and the swa.fon file of rules forSwahili will be loaded. Your rule is lost.
--Type d/symbols and hit Return and you will see a list of thephonemes, features, and other symbols loaded in.
--Type d/ and hit Return and the rules will be displayed. The ][lines are declarations, mostly abbreviations to provide 'syntacticsugar'. The rules with --> are obvious. The ones with * are input andoutput conditions.
--Now when the Fnl: prompt reappears, type << [A# Cl9 + pya #] andhit Return. The rules will be applied and those that do apply will beprinted together with their effects. If you want to see a lot of theseforms, type 'l/swa.fbf'. This will load and run a batch file ofderivations. Keep hitting Q if you get bored, OK?
--Display the rules with d/ again. Note the numbers? Pick a ruleat random and from the Fnl: prompt type i/ N where N is the number ofthe rule. Now type '[] this is my comment' and hit Return. If you leftout the single quotes, then there will be no error message, otherwiseuse backspace or ^g or DEL to delete the first one at least and hitReturn again. You will still see the Ins: prompt. Hit return on anempty line or ESC or ^y and you will be back at the Fnl: prompt. Nowredisplay the rules. Note where your comment went and the way theother rules have been renumbered. Now take the number of your rule andtype r/ number. Redisplay the rules and you will see that yours is nowgone and the numbering is as it was previously.
--You could type 'l/demo.fbf' to see the English, Turkish, andSwahili demo rule sets loaded and applied to some forms, or...
--Type x/ to exit Fonol; say 'no' to its suggestion that you savethe edited rules; and now please do familiarize yourself with thedocumentation!
1.7 Fonol Files Supplied
Fonol.exe
Fonol.doc
Doc-Help.exe (Utility that converts Fonol.doc into on-line help
files which are kept in a subdirectory called
..\fonhelp)
(Sample matrices and rule sets for various languages)
Swa.Max
Swa.Fon
Turk.Max
Turk.Fon
SPE-ex.Max (English rules from Sound Pattern of English)
SPE-ex.Fon
TestPat.Max (to practice moving columns and rows in the matrix)
(Sample batch files of base forms)
Swa.FBF, Turk.FBF, Demo.FBF
2.0 System Commands
After Fonol is loaded you will see a title display and a prompt ininverse (Fnl:). At this point you may type in a system command or aphonological rule. System commands allow you to load a phonologicalmatrix or a set of rules, save the rules that are in memory, edit arule, display the rules on the screen, remove rules, insert rules,apply the rules to a base form to derive a surface form, get furtherinformation (on-line help), customize the environment, or exit Fonolto your operating system. These commands mostly consist of a singleletter followed by a slash (/). This is a way of distinguishing themfrom Fonol rules. Case is not important for the letter, although youwill probably be in lower case all the time. The command letter andslash may be followed by various types of arguments: line numbers,file names, or strings. When there is no argument, the slash is notrequired. Line numbers are supplied by the system as a convenient wayof referring to a rule or range of rules. You can find out the numberof a rule by displaying the rules - you never add them yourself. Thefile names will refer to your matrix and rule files. The editingcommands are available most of the time, even outside of the editmode. The following is a list of the commands and their options.Anything that is not a command is assumed to be a rule. The promptwill tell you if you are in a 'mode': edit (Edt), insert (Ins),recovery (Rec). The attention (Atn) prompt distinguishes errors thatmust be fixed from mere information.
General System Messages:
Bad Parameters (Read the documentation on the command you gave)
Press RETURN for More (Hit return key to see the rest)
2.1 File System Commands
Files may be loaded, saved with a set number of backup copies,listed from the current disk, and erased from the disk.
2.1.1 Loading Files
l/ name
Loads the file name. If there is no file extension, then .FON isassumed (=the file extension for rules). Rules will be compiled withthe matrix currently loaded. If no matrix is loaded, an advisorymessage or an error message will be given as described below. To loada phonological matrix you must supply the .MAX extension of the matrixfile. If the extension is given as .*, then name.MAX and name.FON willbe loaded. Any matrix or rules currently in memory will be overwrittenwhen a new one is loaded. A batch file (.FBF) will be run as it isloaded. If any commands cannot be executed the batch file willterminate (See 2.3.2).
Load Messages: (Also see 2.2.2 -- Edit -- and all the 3.x.x -- Rules
-- message sections)
Expected File Types: X, or... (Check your spelling)
name Not Found
Enter New Name or RETURN to Quit:
Check your spelling or use d/files or l/ to look at the file
names.
.Fon Files:
Loading...
Loaded.
Cannot Compile Features Without Matrix File
Load the matrix file first!
Unread Rules in File
This message is given when a file load is interrupted by an
unfixable error
.Max files:
Loading..
Every 10 lines another dot (.) is printed for reassurance
Loaded.
** Out of Phoneme Space **
Should never happen! Let me know.
** Cannot Read File Format **
Not a .Max file or glitches on media have corrupted your
data.
.FBF files:
Reading From Batch File...
Batch File Read.
2.1.2 Saving Files
s/
If name is not specified, the name of the current or last loadedfile is used, if one exists. The current file is always renamed with a.FN1 extension and all other backup files up to the maximum number ofgenerations have 1 added to their extension (i.e. myfile.fon -->myfile.fn1, myfile.fn1 --> myfile.fn2 etc. up to the number declaredwith /[gen).
s/ name
Saves the rules in memory as file name. The .FON extension will beadded, if not present. Matrix (.MAX) files are only saved from theMatrix Editor and two generations of backup are automatically kept(.mx1 and .mx2).
/[gen
This is a system declaration placed in the rule file, whichdetermines the number of generations of backup copies kept (see 3.2).
Save Messages:
Filename exists
Enter New Name or RETURN to Write Over Filename
You have given an already existing name to a newly created
rule file or matrix file. Decide if you want to write over
it or not.
Expected File Types: X, or...
Check your spelling
Rules Edited But Not Saved. Save? (y/n)
Matrix Edited But Not Saved. Save? (y/n)
These messages are issued as you try to leave Fonol.
2.1.3 Listing Files
l/
This lists the loadable files in the current directory, i.e. .FONor .MAX files and their respective back-up files.
d/files
This shows every file in the current directory like dir in DOS.
2.1.4 Erasing Files
r/name.ext
This removes file name.ext from the current directory.
2.2 Rule Manipulation Commands
These are commands for displaying, editing, inserting, andremoving rules.
2.2.1 Displaying Rules
d/
This displays the rules present in memory and assigns a referencenumber to each. It also follows the rules with a status report on theamount of internal storage space in use and the names of currentlyloaded files.
d/ N
d/ N M
These display particular rules or ranges of rules using thenumbers supplied by the system (i.e. d/1, d/3 5). Any non-number maybe used as a separator between numbers (e.g. d/3-5, d/ 3 to 5, etc).
d/' string
This displays all rules containing string (e.g. d/ts, d/][gen). Amessage: No Matching Rule is displayed if string can't be found. ' isrequired in front of the string only if you are looking for a stringbeginning with a number or the single quote character (i.e. ''abc tofind 'abc. d/1 displays rule one, but d/'1 finds all the 1 charactersin your rules).
d/symbols
This displays a quick summary of some elements of the currentmatrix: a list of phoneme symbols and a list of feature names. It alsoshows all the atom and abbreviation symbols. M will bring up theentire matrix in the matrix editor and d/=# and d/== will show all theatoms and abbreviations in the rule set. d/symbols sometimes is moreconvenient.
d/files
This displays all the files on the currently logged diskette. (l/shows only loadable .MAX and .FON files.)
/[hide
/[show
/[step
These are system declarations which can be inserted in a rule setto turn rule display on or off during a derivation or to allow forpausing the display. See 3.2.
2.2.2 Editing Rules
e/
This, by itself, brings up the last entered or edited rule, ifany exists, to be reedited.
e/ N
This allows rule number N to be edited. The number of a rule maybe found by typing d (see display) to show the rules. The prompt Edt:appears. The rule editor allows lines of up to 245 characters to beinput. It automatically wraps around at the end of the screen line.The rule can be edited using cursor and/or control keys. All editingkeys are available for input even without the Edt: prompt. The Rec:prompt is a special edit prompt for recovery from a fatal error in arule and is invoked by the compiler. If you edit or delete an atom orequality definition, Fonol will attempt to recompile the rule set tomaintain consistency (see note below).
e/matrix
m
This puts you in the matrix editor and brings up the currentlyloaded matrix. (M is a shortcut.) If no matrix is loaded, then a'dummy' matrix is displayed. After entering a new matrix or modifyingan existing one, Fonol attempts to recompile the rules to keep themconsistent. See the section below on the matrix editor.
Edit Messages (see also Rule and Load sections):
** Out of Rule Text Space **
Fix by reducing text size if possible.
** Out of Rule Space **
** Out of Compiled Rule Space **
Not fixable. Write me if this happens. If you enter the
rules with the built-in editor, these errors will not
surprise you. A look at the status line after rule display
with d will tell you how much space is left.
** Out of Symbol Definition Space **
Atoms and abbreviations have exceeded the magic number.
Write me if it is too small. Currently 80.
** Out of Abbreviation Expansion Space **
Room for expansions is gone. Write me. Currently 40.
** Rule Buffer Too Small for Rule **
The compiler buffer for a single line has overflowed. No fix
is available. Write me.
Not Identifiable as Rule!
No specific error is detectable, but the rule cannot be
read. It will be displayed with the Rec: prompt for editing.
No Matrix Loaded - Compiled as String
The rule you just entered may not have been compiled as you
desired. However there is nothing to prevent you from
writing rule systems with undifferentiated symbols -- all
non-phonemic -- so it is accepted as is, with this caveat.
Cannot Compile Features Without Matrix File
No doubt on this one. Load a matrix first.
Automatic Recompilation After Editing
When the matrix or the atom or equality/abbreviation parts ofyour rule set are edited, Fonol attempts to recompile the matrix andthe rules to conserve internal consistency the next time you try toderive something. Up to the point you type in <<string, you may editand even save inconsistent files. If something goes very wrong, youmay 'lose' your rules. Don't panic! The changed rules are on diskunder the name 'FNLTMP.FON'. Your previous rules and matrix are stillthere on disk (unless you deleted them -- bad move!). You must fixwhatever is wrong to successfully compile, i.e. re-load. Sometimesthis can be done at the Rec: prompt. Sometimes for extensive changesit is easier to edit the rules in your word processor (don't forget tosave as ASCII without tabs), edit the matrix in Fonol and then putthem together. The main trick is to edit all abbreviations, atoms, andthe matrix with care, before attempting to derive something.
[To practice not panicking, load the supplied Swa.Max and Swa.Fonand go in and change the feature syll to voc in the matrix. Now tryderiving something. As the complaints about syll show up, fix them atthe Rec: prompt. But wait, an equality declaration uses syll! There isno escape! Go back to the matrix and change voc back to syll first, sothe old Swa.fon will load and, now, if this were serious, you'd fixthe atom and abbreviation declarations, before changing syll to voc.]
Recompilation Messages:
Recompiling...
Recompiled.
** Rules and Matrix Are In An Inconsistent State! **
The recompile failed on the error you could not fix. This is
like the 'Unread Rules in File' message.
2.2.2.1 Special Editing Keys
(Note: ^X means control-X)
Editing Commands
WordStar type commands are a historical residue. Older keyboards
also did not have cursor keys.
^s moves left one character (or Left Arrow)
^d moves right one character (or Right Arrow)
^e moves up one line or to the beginning of the line (Up Arrow)
^x moves down one line or to the end of the line (Down Arrow)
^g, DEL and Backspace delete characters. Characters are normally
inserted. There is no overwrite mode.
^y or ESC or ^c will erase the whole entry -- abandon edit.
RETURN enters or accepts the rule mostly -- it erases in Rec: mode
since a fatal error is being ignored!
Symbol Entry Short Cuts
^a inserts the arrow (-->) with blanks around it.
^b inserts the curly braces used in extended rules ({| |}) and
positions the cursor between them to insert the contents
^t inserts the transformation arrow (==>) with blanks around it.
^v inserts the variable symbol ... with blanks on either side.
Short Cut Alternative to Retyping
^r restores the last entry, inserting it at the cursor position.
Pressing ^r again replaces the last entry with preceding entries
on the history stack until the history stack is empty, then there
is a beep and the next ^r will give you the bottom of the history
stack (i.e. the last entry) again. Any other key than ^r will
accept what ^r has entered, reset ^r to the last entry, and return
to normal editing.
Disambiguation
blank can be used to separate potentially ambiguous sequences. (If you
have /t/,/s/, and /ts/ as phonemes, a-->b/__ts will only mean
/ts/, but typing a blank after the t (a-->b/__t s) will
distinguish the sequence as /t/,/s/. Blanks are skipped in match.)
2.2.2.2 Special Characters
The full IBM character set is supported as a minimum by Fonol.Special characters in the 'high' ASCII set used by IBM can be enteredby typing an accent followed by a letter. You type ^a and get â. Useblanks between an accent and a letter to prevent accenting (^ a willnot be converted). Type ?/~ to see supported special characters (i.e.this section). The accents and letters they combine with are:
Other special characters must still be entered with the Alt key andcode.
2.2.2.3 Matrix Editor
e/matrix
m
Editing the matrix is somewhat different from editing rules. Thematrix is represented as a large space you move through freely, notnumbered lines. Because of this, function keys are used for specialcommands instead of commands entered on a line. A help prompt bar onthe bottom of the screen will show what keys are available at eachpoint as you move the cursor. The eight arrow keys (including thediagonals such as 9/PgUp) are used to move all over the page. Youcannot fall off the screen, but since matrices can be bigger than thephysical screen, Control Arrow is used to scroll between sections orpages. Hold down the CTRL key and push the appropriate arrow key.Using the arrows, move into the feature name column on the left handside and type in any sequence of up to four lower-case characters as afeature name. After typing the name, either Return or the arrow keyswill move you back out of the feature name column. Move to the phonemerepresentation row on the top of the page and type in up to threecharacters to represent a phoneme. Go back into the value space andput in the appropriate + or -. If you move beyond the edges of thematrix, you will automatically be prompted to input a new feature nameor phoneme representation depending on which dimension you 'stretch'.Return is enough to put you back where you 'departed' the matrix. Mostediting features, like accented characters, are available.
If no matrix is currently loaded, then a 'seed' matrix isdisplayed.
r/matrix will remove a loaded matrix.
d/matrix shows a summary of the matrix which is easier to look atfor some purposes than the whole thing.
Classes
There is a facility to search for the class of phonemes describedby a set of common features and to discover the features common to aset of phonemes. Once again the help prompt contains this informationwith the designations Compare and Classify. Compare takes a list ofphonemes in the matrix and shows what features they have in common andwhat features differ. This is useful for figuring out how to specifyrules. Classify takes as input a sequence of specified features andshows what phonemes they determine. This is useful for determining ifthe specification you have settled on really works!
Arranging the Matrix
You may move rows and columns around. This is done by a kind ofswapping, so the direction of motion will affect where the moved rowor column arrives relative to the cursor position. All these areexplained on screen in a prompt bar and should be transparent.TesPat.Max is supplied for you to move columns and rows around and geta feel for what happens.
Deletion and Insertion of Phonemes and Features
You can also delete existing columns and rows (i.e. phonemes andfeatures) or insert a new feature or phoneme in the middle of theexisting ones. This is prompted at the bottom of the screen every timeyou enter the feature or phoneme spaces.
Types of Matrix
The only sort of matrix currently available is one that is fullyspecified. Unmarked and marked are not allowed for. It is possible towork around this in some ways due to the laxness of matrix definitionsin Fonol. No checks are made for duplicate phoneme featuredefinitions, although if a change has been made by a rule and aphoneme is being looked up, it will be determinate. Identical featurenames will not compile differently nor will identical phoneme names:you get the first one on the sorted list (you'd need to play aroundwith the matrix to be sure which one). This sort of laxness can berooted out with the Classify and Compare commands. However, just asyou can define allophones for printing purposes, you can also define'underspecified' segments with printable forms which are filled in byrules, if the fact that all features are inherently - is not aproblem. Scalar features are also not supported. In some cases,depending on the kind of rules you need to write, the same effect canbe gotten by using two or more features together. [However I amthinking about how to handle underspecified and scalar segments in acorrect way, and would welcome your comments.]
NOTE: After editing the matrix, the rules will be automaticallyrecompiled with the new matrix, when you attempt to derive some form.See the note on Automatic Recompilation in 2.2.2
See d/matrix, r/matrix, e/matrix, and l/file.max.
2.2.3 Inserting and Moving Rules
i/ N
This allows new rule lines to be inserted above line N as the new line N.
An Ins: prompt appears. Pressing RETURN (or ESC or ^y) inresponse to the Ins: prompt ends the insertion mode. All editing keysare active. (Example: i/5 allows new rules to be inserted above rule 5which becomes rule 6, rule 7, and so on as new rules are inserted.)
i/ N M
This moves rule N to the position just before rule M. If M is avalue past the end of the current rules, then N becomes the last rulein the rule set. (Example: i/3 7 moves current rule 3 to the point infront of current rule 7, 3 becomes 6.) Any non-number may be used toseparate the two numbers.
2.2.4 Removing Rules
r/
Removes all rules (but not the current matrix). A confirmationmessage is given:
Delete ALL rules (y/n)?
r/ N
r/ N M
These commands remove rule number N or the range of rules Nthrough M including N and M.
(REMEMBER: Numbers are supplied by display (d/) and change withthe removal or insertion of rules so be careful. r/N followed by r/Mmay remove rule M+1 if you forget that the numbers are relative andnot absolute.)
r/matrix
This removes the current matrix without replacing it. Currentlycompiled rules become orphans and attempting to derive forms will notwork as expected.
r/name
This command will remove file name from the disk in the currentdrive.
2.3 Applying Rules for Derivation
<< string
This applies the current rule set to string (the base form) toderive the surface form allowed by the rules. String including the'<<' is limited to the 255 character length of Pascal stringsincluding blanks (Blanks are removed automatically as the string istranslated to internal symbolic form). These characters represent upto 120 symbols (current limit). The symbols used in the base form aredifferentiated into two types: phonemes defined in the currentlyloaded matrix or non-phonemes. Feature bundles are not allowed: if youwant partly specified forms, like N for any nasal, then define them as"arch-phonemes" in the matrix. (see 3.3.1 for further information)
Base Form Messages:
** Base Form Contains Too Many Syntactic Boundaries ([,]) **
Use a less complex form. Write me if this limit is too low.
* Word Buffer Overflow -- Part of Base Form Lost *
Semi-fatal: processing continues but you don't get what you
wanted. Let me know if this buffer is too small.
* Word Contains Illegal Character: X *
X is a reserved character. If it is {, perhaps a feature
bundle is being used instead of a phoneme.
Too Many Open: [[]
Too Many Close: []]
No Brackets in Form
These messages are given when the syntactic cycle
declaration is active and means that the syntactic boundary
markers are not paired -- or not present. This must be
fixed at least initially. See 3.1.2, 3.5.2.
Declared Cyclic Category Not Found in Base Form
No bracket [ is labeled according to the ][Cyc Cat
declaration in your rules. See 3.1.2.
2.3.1 Saving Derivation Results
t/
Transcribe derivation results. T toggles transcription on andoff. When transcription is on, the results of << string are saved in afile on the logged disk (default: Trans.Txt). This file can be editedor printed with your usual word processor like any other file, outsideof Fonol (It's a pure ASCII file). New derivation results are appendedto former results so you may want to periodically edit out old bits orerase the file. Derivations are date and time stamped and identify thefiles used.
Transcription Messages
Transcribing...
Transcript Closed
Lets you know whether you toggled transcription on or off.
** Transcription Error **
Trans.TXT can't be created or added to.
2.3.2 Automating Derivation
l/name.FBF
This load command loads and runs the Fonol Batch File (.FBF) withname. Any commands which may be typed in at the Fnl: prompt may be putin a batch file. If anything goes wrong with one of these commands,the system will stop and wait for input from the user. x/ and /// areallowed for as well. Only loading of other .FBF files is forbidden.This is expected to be useful when rules are stable and files existbut the user wants to run large data sets under one or more sets ofrules and matrices. Naturally this feature can also be used to set upthe system with, say, color choices. The appropriate place for this isthe Config.FBF file.
CONFIG.FBF
This is a special .FBF file which is automatically loaded and runon start-up, like autoexec.bat or config.sys in DOS.
Batch File Messages
Reading From Batch File...
Batch File Read
These two messages let you know what's going on so you have
some idea whether the system is working or hung.
2.4 On-line Help
?
Displays this information about on-line help. The help function allows you to read all the documentation for Fonol from within Fonolas described below.
?!
Explains the last three system messages in more detail if suchinformation is available by bringing up the appropriate sections ofthis documentation. This is a way of supplying hints for problems,especially multiple problems, while avoiding too much verbosity in thestandard error messages.
?/~
The tilde (~) is used to represent all special characters. Thiscommand will show how to enter special characters (see Edit).
?/string
String is explained. It may be a command letter, a word, asection number or some symbol that is used in Fonol. All currentsupport may be found on-line: try typing something in, it will providesome kind of aid, even if it is only a list of the indexed terms mostsimilar to string.
?/toc
This command will show the Table of Contents (TOC) of the Fonoldocumentation (Fonol.doc). Section numbers or words or symbols insection titles may be looked up with ?/string. Words or symbols mayreference several sections, so section numbers will be less 'verbose'.
Help Messages:
** Help Table of Contents Overflow **
** Help Index Overflow **
The last edit of Fonol.doc blew out the limits. This should
never happen to you unless you decide to fix or customize
the documentation. Write me.
* Help Index Not Found *
Check Location of ..\fonhelp
Help was invoked, but the \fonhelp subdirectory was not
found on the current logged drive in the directory
containing Fonol.exe or no index file was in the
subdirectory.
* Missing Files in Help Subdirectory *
The subdirectory was found with an index file, but it is
incomplete. Better look it over and perhaps run Doc-help
again.
Search Failed In: X1..X5
Shows the five items in the midst of which the search failed. This provides some clues when you are hunting around
for information.
2.4.1 Printing Fonol Documentation
The documentation is currently being maintained in Sprint 1.0.Low ASCII (<32) are formatting codes which I use mostly for screenprinting and for marking words to be used in the help index. Youshould find one line beginning with ^K which is the ruler line andvarious strings beginning with ^B, ^U, or ^D and ending with ^N whichare the Bold, Underline, and inDexed strings. ^_ is the 'soft'carriage return symbol for line breaks in paragraphs. ^L is a pagebreak. The IBM high ASCII set (>127) may cause problems to yourprinter -- on my Epson I have to set some dip switches to print them,for example.
I am trying to figure out how to maintain the documentation in away that anyone can print and still not lose formatting.
2.4.2 Setting Up On-Line Help
Fonol.exe is distributed with FONOL.DOC and DOC-HELP.exe, theprogram that converts FONOL.DOC to the FH-xxxxx help files found in\FONHELP. To set up the on-line help, yo should put fonol.exe,doc-help.exe, fonol.doc into some convenient subdirectory or onto somedisk. Log in to that subdirectory or disk drive. Now type mkdirfonhelp to put ..\fonhelp into your current directory. Then typedoc-help and hit return. It will ask you if you have done thepreceding steps. Just hit return again and ..\fonhelp will be filledwith the files used by on-line help. This method is used so thatconsistency is maintained between the printed documentation and theon-line documentation.
If you want to edit FONOL.DOC and make changes which will appearwhen help is invoked you will have to run DOC-HELP with FONOL.DOC andthe ..\FONHELP subdirectory again. Doc-Help tries to lemmatize a bitby removing suspected plural s from words read from boldface titles
2.5 Exiting Fonol
x/ is the graceful way to exit Fonol.
2.6 Fonol System Setup
///
This command reinitializes the Fonol system, restoring alloriginal values and wiping rule and matrix memory clean. A desperationcommand to be used just before Control-Alt-Delete or the on/offswitch.
//PP+
//PP-
These commands turn 'pretty printing' on and off. When 'prettyprinting' is on, the base and intermediate forms are printed withblanks between symbols which are confoundable in sequences. Requiresupper-case 'P's.
//C F B
This represents a set of commands for customizing the colors inwhich classes of text are displayed.
C is a lower-case character identifying a class of text as shownin the table below. F and B are lower-case characters representing theforeground and background colors. F is a letter from a to p selectedfrom the color menu below and B is a letter from a to h. For example,//p o c sets prompts to a yellow foreground and a green background.
Text Class Identifiers:
p for prompts and very emphasized messages.
n for normal entries, rules, commands, etc. or 'bold' in help
text (primary emphasis).
d for de-emphasized entries, like comments and non-phonological
characters, or normal text in help text.
i for 'italic' entries in help text (secondary emphasis).
h for 'hidden' text (e.g. the part of a phonological base form
not being considered by rules when strict syntactic cyclicity
is in effect).
Available Colors: (background must be a dark color)
Dark: Light:
a Black i Dark Gray
b Blue j Light Blue
c Green k Light Green
d Cyan l Light Cyan
e Red m Light Red
f Magenta n Light Magenta
g Brown o Yellow
h Light Gray p White
On monochrome boards the 'colors' will appear as bright, dim, andunderline. The color names are relative to your machine.
CONFIG.FBF
This special .FBF file is the place to put these commands if theyare meant to be permanent. (See 2.3.2)
?/cor
This shows all the possible combinations of these colors for yourscreen. The present settings are also displayed. Just plug in theletter combination that you like best.
//c
This resets the original default colors.
3.0 Fonol Language
Fonol is a programming language based on phonological rules. As aprogramming language it is a 'declarative language', not 'imperative'.It should be natural enough to linguists. This section splits thelanguage up into declarations (information for compiling and runningthe language), comments, rules (including filters), and 'control'related items.
3.1 Declarations
Declarations (][) provide information to Fonol about how tounderstand symbols and rules. These are meta-theoretic, in general,and cover notation and questions such as strict cyclicity, iteration,and so on. They are meant to allow a certain theoretical tailoring ofrule sets.
3.1.1 Symbol Declarations and Abbreviations
These are the 'syntactic sugar' of Fonol. They improvereadability. They help prevent confusion (in the compiler) aboutmultiple uses of the same characters. They are also useful for keepinglines to a reasonable size. You should put all of these declarationsat the start of your rule set, but they may be in any order -- justremember that they must be defined before they can be used.
][A=#
][ A .. Z=#
Declares A to be an atomic symbol. A must be longer than 1 and nolonger than the maximum abbreviation size (currently 15). Thecharacters in A no longer have an independent existence. These shouldnormally be the first set of declarations, i.e. preceding equalitydeclarations, but they only need to precede the point where they willbe used. Atoms may be declared on as many lines as you wish. Multipleatoms may be declared on the same line by separating them with blanks(i.e. ][ Participle Passive Gerundive N3 Ablative =#). You might wantto group atoms on different lines according to their use in yourrules.
][A==B
Declarations of equality may be made for abbreviations and so on.The A part is the abbreviation and the B part is its expansion. Theexpansion may contain anything meaningful in the rules or matrix.
Abbreviations can be used to make rules look better and take upless space when printed. For example, C, as an abbreviation forconsonant may be implemented with the declaration: ][ C == {+cons-voc}, i.e. 1 character instead of 11. However, the symbols used inthe abbreviation cannot be recuperated for printing in a base form.(The original text of rules is saved and printed since they are staticduring a derivation.)
Besides shortening the length of strings, you can redefine othersymbols of Fonol to make them look nicer: ][ X==... would allow you towrite rules with X as the variable symbol, if you don't need X foranything else. ({|,|} may not be redefined however). And ][round==rndlets you get around the limits on feature name length. The right handside (i.e. B above) may be empty (i.e. ][0== to define 0 as anabbreviation for the null string). Duplicates are not checked for soyou may have many-to-one mappings from abbreviations to expansions.
Atoms and other abbreviations may be used in the expansion, butplease note that the substitutions expressed by these declarationswill be made in rules and base forms in the same order that you writethem. (Remember feeding and bleeding!) For example,
][C=={-syll+cons}
][C13==C(C(C))
will work all right, but
][C13==C(C(C))
][C=={-syll+cons}
will stick a bunch of capital Cs in your rules wherever you use C13.
Exotic errors can be introduced with == so be alert!
Note: Symbols of this sort are identified using the largestpossible match from left to right, so just as with phonemes, useblanks to disambiguate. For instance, if N stands for any nasalsegment, N1 is the first projection of the category N, and 1Plu standsfor the 1st person plural morpheme, then ...N1Plu... will find N1 andorphan Plu, but ...N 1Plu... will be correctly recognized. When indoubt, isolate the form with blanks.
Symbol Declaration Messages:
Wrong Size Atom:
Wrong Size Abbreviation:
Shows the size error for symbol declarations
Wrong Size Expansion:
Shows a size error for the expansion
3.1.2 Rule Interpretation Declarations
These declarations identify conventions for understanding thepatterns expressed by rules.
][skp+
][skp-
skp turns on or off the convention of skipping overnon-phonological segments to apply phonological rules, that is, rulesare understood to apply ignoring morpheme boundaries, bracketsidentifying morphological class, and other non-phonological segmentswhich are not specifically mentioned in the rule. This is the skipnon-phonological segments convention. It is implicit in generativephonological work, but must be made explicit in the world ofcomputers. It may be turned on explicitly with ][skp+ or turned offwith ][skp-. The skp option is on by default if a matrix is loaded,otherwise it is off by default.
][mcpi+
][mcpi-
mcpi means maximal categorial projection interpretation. Rules inthe scope of this declaration will have brackets [,] on rule extremesinterpreted as referring to the maximal projection of the currentcyclic category. For example, in the scope of mcpi, the rules
a --> b / [Z...c__d...Z]
a --> b / [Z...c__d
a --> b / c__d...Z]
would apply to the outermost brackets of the current cycle only. Theywould not apply to any embedded brackets. For that, you would have toturn off mcpi (][mcpi-) or else use [...[ or ]...] descriptions (...is the variable). This is not quite the same as ][ssc+ or using][CycCat: (described below), since only rules with expressly includedbrackets are affected. Rules with internal brackets or withoutbrackets will apply wherever they can. Sound Pattern of Englishcontains many rules written according to this convention.
This only has an effect in syntactic cycles currently.
3.1.3 Rule Reapplication Or Cycle Declarations
These declarations affect the way syntactic cycles are done. Theymake it possible to define a wide range of cycle types. They arefurther discussed in section 3.5.2.
][ssc+
][ssc-
][ssc turns strict syntactic cyclicity on and off in loops whichrepresent syntactic cycles. What this means is that no change will bemade in an embedded syntactic component during a higher cycle or, putanother way, deeper bracketings can only contribute environment tocyclic rules. For example, in a syntactic cycle with ssc+, the rule
a --> b /c__d
and the base forms
[ca[dca]d] or [c[adc]ad]
only the a in the outermost brackets will change. (skp+ is assumed)
This is the strictest form of 'Strict Syntactic Cycle', but notthe only kind allowed. In the discussion of Syntactic Cyclic Loops in3.5.2, the variety of syntactic cycles is more thoroughly compared andcontrasted. Syntactic cycles are marked in words by [,] pairs.
Off by default.
][ats+
][ats-
ats means apply to stems, where stem means the minimalbracketing, a bracketed string that does not contain other bracketedstrings (i.e. [X] where X does NOT contain [,]). Obviously, in thescope of ats, ssc has no noticable effect. Off by default.
][atdf+
][atdf-
atdf means apply to derived forms, where derived form means abracketed string which contains other brackets (i.e. [X] where Xcontains [,]). With ssc+ as well, nothing in the minimal bracketingswould be affected. Off by default.
][rbi!
rbi! means recompute bracketing immediately, meaning that thebrackets in the current state of the derived form are identified foruse in a syntactic cycle. This is provided to allow the user toproduce bracketings by rules and then apply some form of syntacticcycle to them. It is also useful if rules applied before a syntacticcycle change the size of the original bracketed string (e.g.morphological substitutions in a prior group of rules).
rbi! removes most of the limits on what you can do in syntacticcycles. It is safer to use this outside a loop, but it may be insertedin a loop. See the comparison in dbc below.
Envisioned use:
Replace the atom Past (length 1) with the string ed (length 2)
OR
[> Iterate until all the brackets are in place
rules... like zzz --> [zzz] or some such
<]
][rbi!
[> Syntactic cycle of some sort using the brackets
rules...
<]
][dbc+
][dbc-
dbc means dynamic bracketing convention. This provides fordo-it-yourself cycles. The rules in a syntactic cycle in the scope ofthis declaration will apply to the minimal bracketing as in ats, thenwhen these have all been applied to, the bracketing will be recomputedas in rbi! and the rules will be applied to whatever the minimalbracketings are at that point. It is up to the user to erase or insertthe correct number of brackets by rule during each cycle. The ruleswill stop being applied when there are no more brackets, the derivedform is a mess of mismatched brackets, or the loop has gone on forabout 30 tries.
dbc, like ats, obviates any need for ssc and does not combinewith atdf.
Don't forget to close off this declaration with ][dbc- if anyrules are to be applied after the syntactic cycle in the scope of][dbc+.
Note: The rbi! declaration may also be inserted in a syntacticcycle. It allows for a looser definition of loops that run until allbrackets are erased. The new bracketing does not have to be computedafter the rules apply to all minimal bracketings and otherdeclarations may be mixed in. See 3.5.2.
][ Cyc Cat:[string
][CycCat:[
This is the minimum required to declare string as the labelmarking the only cyclic category in a syntactic cyclic loop. Theabsence of string means that the cycle reverts to anything in [,]brackets. By default there is no defined cyclic category, i.e. allcategories are cyclic because cycles are defined on brackets alone.String may contain up to three phonemes, non-phonemes, atoms, or the _non-phonemic segment variable (which, in this case only, will alsomatch phonemes). The label string is expected following the openbracket '['. Labels inside close brackets ']' are not checked.
You may write this declaration in a more readable manner so longas the strings 'cyc', 'cat', ':', and '[' are present in that order,e.g.:
][ Cyclic Category: [N''' (assuming ][N'''=#)
][ Cyclic Category: [_## (i.e. any single label with two word
boundaries)
Cyclic Category Compilation Messages:
Invalid Cyclic Category Label
Somehow some symbol other than the legal ones is being used.
Cyclic Category Label Too Long
Consider making the label an atom, if possible, or using
numbers or -,=,≡ instead of ','',''' for bars of categories.
Three symbols should never be too short, but let me know if
it is.
3.2 System Declarations
These are declarations (/[) associated with rule sets thatdetermine system related conveniences such as the number of backupfiles to be kept and how results are displayed. They have nothing todo with theory.
3.2.1 Backup File Declarations
/[genN
This declaration sets the number of generations of backup copiesto be saved. N may be any number from 1 to 9. If no generation countis declared the default is one. Every time a file is saved all thebackup copies are increased one generation (e.g. myfile.fon ->myfile.fn1 -> myfile.fn2 etc.) and any generation beyond the declaredlimit is lost. This is useful if you are working on something whereyou make many changes without being certain that the changes arecorrect. Up to nine previous versions can be available for startingagain on a new tack.
3.2.2 Display Declarations
Used with t/ and batch files, these declarations help the userunderstand what his rules are doing, especially in large rule sets.
/[hide
This declaration shuts off the display of any rules in aderivation which follow it. It does not have a an effect on d/. It canbe used to declutter your display if you only want to observeparticular ranges of rules or just check the derived form. Turning offrule display speeds up derivations significantly.
/[show
This declaration undoes the effect of /[hide, restarting thedisplay of following rules. It also prints out the current derivedform as a reference, with an identifying label, either intermediate:or derived: (if /[show is the last line of the rule set). There can beshow declarations without corresponding hides, so it can be used toprint the final derived form or show a rule's input in step mode (seebelow).
/[step
This declaration pauses the derivation before the next rule orfilter and gives the user the option of stepping (S) to the nextrule/filter, hopping (H) to just before the next successful ruleapplication, leaping (L) to the one after the next /[step declaration(or the end of the rule set), or quitting (Q) the derivation. Thespace bar can also be used for stepping. Tapping the H twice (= H S)is a convenient one handed way to see just the rules that apply.
3.3 Comments
[]
This marks whatever follows as a comment. You may also writecomments after the disjunctive block markers or the iterative orsyntactic cyclic block markers so as to give names to groups of rules.
Remember that rules can be temporarily disabled by commentingthem out, i.e. putting [] in front of them.
3.4 Rules
These are what correspond to phonological rules plus otherinformation which is left implicit in ordinary phonological rules(e.g. some meta-theoretic considerations). Rule messages aredistributed under the type of rule, but related messages are also inthe load (l) and edit (e) sections.
The word 'rule' is used in three ways in this text. Most often itrefers to any line of Fonol, since Fonol is a line orientedprogramming language and compiling takes place in individual lines. Asyou might expect, 'rule' is used with the traditional meaning of oneof those entities with an arrow in it which expresses a change to beapplied to a form, including other lines holding the curly braceswhich belong to the rule, like
a --> b / c__d
or
a --> b / {| c |} __ d
{| e |}
'Rule' also refers to logical rules, which are what the interpretationmachinery works with when a form is derived. A logical rule has aformat which should be observed:
1. input conditions -- optional -i*, +i*
2. a disjunctive block of rules -- optional {[,]}
3. or a rule -- required -->
4. variable conditions -- optional +v*,-v*
5. output conditions -- optional -o*
The star (**) is completely independent.
A disjunctive block of rules is composed of the same sequences asabove (except for otherdisjunctive blocks). Comments may be freelymixed in anywhere except between a rule line (with an arrow) and curlybrace lines associated with it. No tests of syntactic coherence aremade, so please be aware that bits of logical rules can be strandedwith various odd results, if you put anything other than commentsbetween the lines or if you put anything between the curly bracelines.
Ordering of rules is left up to the user. No attempt is made toprovide a separate mechanism for ordering principles like the ProperInclusion Precedence and the Elsewhere Condition. This is because itis very hard to compute proper inclusion and 'elsewhere'-ness. Ifthere is a rule a --> b / c__d and another a --> e, all is well -- upto the time of application! Given a string #acazad#, should the secondrule apply to 'ad', 'ca' or the last 'a'? Currently it would apply tothe first 'a'. (For elsewhere conditions, the disjunctive blocknotation will yield the same effect and on converting your rules topaper you can beautify them with the appropriate notation.) Given tworules referring to features like {+cons} --> and {+high} --> y whichmay or may not have overlapping structural descriptions, it would beimpossible to generate an order due to a lack of specificity in theprinciple. This does not mean that Fonol tries to force extrinsicordering on the user, just that you should apply your theory ofordering manually (at least for now! Ideas are always welcome!).
Logical Rule Message:
Unexpected Interruption of Logical Rule
Since it is rare that the interpreter has any reason to
suppose that a logical rule is disorganized, there is only
one message, printed at run-time when the blocking of a rule
by an input condition is uncertain. (see also Rule Messages
in 3.4.2)
3.4.1 Symbols, Phonemes, and Feature Bundles
These are the basic units of which rules and base forms arecomposed. Matching and change in derivations operate over these units.Feature bundles and phonemes are obvious. Other symbols arenon-phonemic material such as the labels used to identify categories,symbols for morphemes, symbols for boundaries, and symbols whichidentify theoretical constructs. Non-phonemic symbols may be reservedto the system or user defined. All these are described in detail inthe following sections.
3.4.1.1 Phonemes and Non-Phonemic Symbols
Any Ascii code symbol from Ascii 32 through Ascii 254 may be usedin a rule. Up to three characters may be used to represent a singlephoneme (i.e. 'trigraphs' are allowed to compensate for the lack of agood way of using IPA symbols on the average PC). For a symbol to beused as a phoneme, it must be defined in a matrix. This requires useof the matrix editor, which is described later on. Non-phonemicsymbols are symbols used in rules and base forms without being definedin a matrix, e.g. [N bbbb N] to show the limits of a syntacticcategory or # for word boundary. Such symbols will be treateddifferently depending on whether there is a phonemic matrix in use andwhether the skp declaration is being used (see ][). Non-phonemicsymbols may also be declared with the =# declaration (see ][). Blankshave a special use as formatting and delimiting or quoting characters.Reserved symbols as shown below cannot be redefined as phonemeswithout unpredictable problems.
3.4.1.2 Reserved and Special Symbols
Reserved and special symbols are used by the compiler and the runtime system. The following are the reserved symbols or symbol series:
{, }, Feature Bundles
(, ), ..., {|, |}, Conflation of Rules
-->, /, __, ==> Rule Parts
**, -o*, +i*, -i*, +v*, -v*
Filter/Condition Types
[>, <], {[, ]}, Flow of Control (Iteration, Disjunction)
[], User Information
][ Run Time Controls
/[ System Controls
[, ] Syntactic Boundary Marker in Syntactic Cycles
see [> syn cyc
Symbols from ** to /[ are only reserved as the first non-blanksymbols on a line. However, it is probably safer to always treat thesesymbols as reserved.
Transformation Special Symbols.
On the right hand side of the ==> transformation arrow, numbersand the comma have a special use.
Declaration and Loop Special Symbols.
In the sections on ][, /[, and [> other special sequences aredefined.
Feature Bundle Special Symbols.
Within feature bundle boundaries ({, }), the symbols +, -, A..E,α..ε are reserved, but not outside (e.g. + can be used outside of afeature bundle as a symbol for morpheme boundary without beingconfused with the + feature sign: {+cons Avoc}+Ab is legitimate withtwo uses for + and A). The names of the features are also reservedsymbols inside the feature bundle and are defined as such in thematrix (see matrix editor).
Blanks.
Blanks are normally meaningless in rules, but may be used forformatting and to distinguish ambiguous sequences (i.e. to distinguishthe two vowel sequence 'a e' from the single vowel 'ae'=ash=æ). Feelfree to use them as separators. Phonemes are matched left to rightstarting with the longest sequence. For example, if you have thephonemes t, s, ts, sh, h defined, then the sequence 'tsh' will beparsed as 'ts','h'; the sequence 't sh' will be 't','sh'; and 't s h'will be 't','s','h'. When in doubt, put blanks around phonemes. When aword entered with blanks is printed during a derivation, the blankswill not be shown, but it should be clear that the phonemes have beendisambiguated.
3.4.1.3 Feature Bundles
A feature bundle is a sequence of signed features between singlecurly braces (regular square braces are impractical technically), e.g.{+cons -voc αstri} is a feature bundle specification. The features maybe written in any order (i.e. These curly braces are from the notationfor unordered sets). Features must be part of a previously loadedmatrix. Features must be specified with a sign: either +, - or some'Greek letter' variable. Within {, }, i.e. in feature bundles, thecapital letters A, B, C, D, E can be used as variables replacing + and-. A, B, and C may also appear immediately preceded by a - as in: {A cons -A voc} for non-glides. On IBM compatibles using the IBMcharacter set, the first five letters of the Greek alphabet α,ß,Γ,δ,εmay be used (remember that gamma is only given in its upper case formon the IBM). The Greek letters are translated into the capital lettersA through E internally (The correspondences are {(α,A), (ß,B), (Γ,C),(δ,D), (ε,E)}).
The values of variable features bound by a rule applicationpersist through the following output or variable conditions. (Seevariables and conditions)
Feature Compilation Messages:
Unidentified Feature: X
The following string was not a declared feature. Spelling
mistakes often cause this error, otherwise check that the
loaded matrix matches the loaded rules (use d/symbols).
Bad Feature Sign: X
The sign expected here was not in the set {+, -, A, .., E,
α, .., ε}. Most likely a spelling error or a misread feature
due to loading mismatched rule and matrix files.
3.4.2 Types of Rules
There are four types of rules provided for: insertion, deletion,replacement and movement or permutation rules. Rules have fourpotential parts, the target which appears before the arrow (-->), itsreplacement which appears after the arrow, and the left and rightcontexts or environments of the target which appear after the slash(/) and to the left or right of the environment bar (__). Rememberthat a context sensitive rule written A-->B/C__D in standardphonological notation is the same as the rule CAD-->CBD. (See 3.4 forrules as larger blocks). Rules of permutation are written using atransformational notation with the ==> arrow and numbers in thereplacement part.
Rule Messages:
Slash (/) Required!
It is not possible to distinguish the replacement from the
context without a slash.
Ambiguous Without Bar (__)!
The left and right contexts cannot be identified
Overgeneration: Indeterminate Insertion Point
Insertion with no context at all!
Conflation Used Improperly Outside of Environment
Conflation is not allowed in the target or replacement parts
of the rules. (see 3.4.4)
3.4.2.1 Replacement Rules
A --> B / C __ D
A is changed into B or receives the features of B in anoptionally specified environment, where __ marks the position of A andC is the preceding context and D the following context. (A is thetarget part and B is the replacement or change part of the rule.)Either C or D may be omitted. If both C and D are omitted then theslash / may be omitted. The following are correct rules:
sk --> sh OR sk --> sh /
p --> b / __ + {+nas +cons}
{+voc -cons +high} --> {-high} / p __
{-voice} --> {+voice} / {+voice} __ {+voice}
A replacement of features may produce a form with no currentsurface representation. This is not treated as a fatal error, but amessage is printed.
Indirect Insertion or Deletion.
Coalescence and some types of indirect insertion are alsosupported (e.g. ey --> I or I --> ey where I, e, y are all phonemes).The replacement symbols are matched one-to-one to the target symbolsfrom left to right and the leftovers are inserted or deleted. In theexample, I and e affect each other but y is deleted or inserted as aphoneme. This only becomes important when a rule changes features, forexample:
will delete the second +syll segment and impose its values for backand rnd on the first segment, so the other features of the firstsegment had better be the same as those of the second if truecoalescence is being modeled (the values for high and low get changedvacuously, but it looks nicer to leave them in). The compiler prints amessage about indirect insertion or deletion just in case it might beunexpected. See {},_ in variables.
If skp is on, the skipped elements will stay where they are andthe left-over non-corresponding indirectly inserted elements willfollow immediately after the last corresponding replacement. (If thisis too fuzzy an explanation, load swa.max, put in the rule joy-->prideand type <<#j1o23y45#. You'll see what I mean.)
Replacement Rule Messages:
No Surface Form -- continuing ...
The symbol ░ takes the place of the unrepresentable bundle
of features. Taking what form was changed and what changed,
you can use the compare and classify functions of the matrix
editor to determine what phoneme is missing or predicted.
Implied Insertion of Last N
Implied Deletion of Last N
The last N symbols in the replacement will be simply
inserted or deleted. This is provided as information.
3.4.2.2 Deletion Rules
A --> / C __ D
If A is to be deleted, no replacement is required. Either C or Dor both may be omitted, even though a rule of deletion without contextis pretty radical (I mean, wildly abstract!).
r --> / {+stri} {-cont} __
Deletion may be implicit in rules like A --> B where B is astring of symbols shorter than A. A message is given to inform you, incase this is not desired. This will occur in replacement rules. (See3.4.2.1)
3.4.2.3 Insertion Rules
--> B / C __ D
A may ONLY be omitted if either C or D IS present, e.g.-->t/{+voc}__{+voc}. Insertion rules without context (e.g. --> t)would overgenerate in an uninteresting way as would those wherevariables make the insertion point indeterminate.
Whatever is inserted in this way should not be a partial featurespecification unless some form of recovery is planned by means of alater rule which will finish specifying the phoneme so that it willhave a surface form in the current matrix. In the following rule noprintable form might exist, but a later rule might provide voice andnasality information that would lead to printing t, d, or n:
Unprintable specifications of phonemes are printed as ░ (ASCII176) and a warning is issued.
It should be noted that since the matrix currently is two-valued,the non-specified features are all set to -, so that it is sometimeshard to really underspecify elements, especially if you try tominimize the number of features. In the example above, you might get tif only voice and nasality distinguish the three. If you want to doso, sometimes it is useful to put the underspecified element in thematrix so it can be printed.
Insertions with variable features may be more useful as in:
which inserts y between i and u, o, a and w between u and i, e (usingthe supplied swa.max matrix). The -syll and -cons features could havebeen left out since all other features are - by default, but byincluding them the rule looks much more reasonable. If the allnegative default is bad, try defining a seriously unreal element (likeall pluses) in the matrix (use ASCII 177 ▒ for example) and startingfrom it. Don't use an all minus phoneme, because it is already used asa variable (namely {}) to match any phonemic element.
Insertions may sometimes be indirect as described in 3.4.2.1.
Insertion Rule Messages:
No Surface Form -- continuing ...
The symbol ░ takes the place of the unrepresentable bundle
of features. Taking what form was changed and what changed,
you can use the compare and classify functions of the matrix
editor to determine what phoneme is missing or predicted.
Unrepresentable Insertion!: X
What is to be inserted does not have a surface
representation in the current matrix, but the user may be
planning on finishing the specification in later rules, so
the rule is compiled.
Overgeneration: Indeterminate Insertion Point
This message is given when the environment for insertion is
undefined or bounded only by variables:
--> b / c ... __,
--> b / __ ... c,
--> b / c ... __ ... d
In such cases, the insertion point is considered to be
underdetermined and the rule is not compiled.
3.4.2.4 Permutation Rules
CABD ==> 1, 3, 2, 4
Permutation is supported with the transformational notation ==>and numbers set off by commas in the replacement (i.e. StructuralChange) corresponding to each segment in the target (i.e. StructuralDescription). In a non-standard way, the mixing of transformationaland context sensitive notation is permitted so that
AB ==> 2,1 / C __ D
is a valid rule in Fonol with the meaning CABD ==> 1,3,2,4. All thismeans is that you are dispensed from writing a list of numbers whichincludes all the non-moving context (merely a notational variant). Thecontents of the target are currently restricted in the same way asordinary rules, meaning that, while the items which are moved do nothave to be neighbors (i.e. ABCD ==> 4,2,3,1 is OK), parenthetical,variable and curly brace items are not currently permitted between thepermuted elements. These conflations are permitted in the contextparts of the hybrid notation. (See 3.4.4)
Index numbers start at 1 and are currently supported up to 10 (10is purely arbitrary). [In a future version, 0 will be used fordeleting segments in transformations.]
For those cases where the number of distinguishing features doesnot exceed the number of Greek letter variables, feature bundles maybe used in an interesting way to achieve permutation by rules of theform: {αfeat}{ßfeat} --> {ßfeat}{αfeat} where ß could be -α. The samething could be done with specified +,- features. Note that these ruleswork as replacement rules, the segments on the right hand side areactually in the same order as those on the left hand side.
][skp will work with these permutations, but the skipped partswill simply stay where they were.
Permutation Message:
Segment Miscount in Transformation -- SD: N SC: M
Segment to index mapping is one-to-one to avoid mix-ups. Try
to count segments beforehand. If things are still strange,
try putting blanks around all the segments you believe to be
present or do d/symbols and look for confusable sequences.
3.4.2.5 Transformational Rules
Transformational rules are not yet fully supported in Fonol4.0.0, but the phonological rules discussed above are not asrestrictive as is ordinarily the case for phonological contextsensitive rules. The target portion may include some of theenvironment and some multiple 'simultaneous' operations may beperformed as noted in the discussion of coalescence. The currentsystem may be suitable for your purposes. Experiment.
3.4.3 Types of Filters and Conditions
Filters or conditions are specialized types of rules whichconstrain the operation of other rules. They are related to flow ofcontrol in that they affect whether the derivation continues, whethera rule is applied, and whether a successful application of a rule isvalid. The types provided for are the usual star which blocks thederivation, negative and positive input conditions which determine ifa following rule may be applied (blocks the rule), conditions on validcontents for a variable in the rule, and a negative output conditionwhich undoes the result of the preceding rule (blocks the rule postfactum). When several of these conditions precede or follow a rulethey are automatically treated like a disjunctive block of rules (see{[, ]})
There are currently six types of condition: Positive InputConditions, Negative Input Conditions, Negative Output Conditions,Positive Indexed Variable Conditions, Negative Indexed VariableConditions, and the Star Condition. Star Conditions are totallyindependent of rules, naturally, since their scope is the derivation.Other conditions have a rule or disjunctive block of rules as theirscope. Input Conditions may be mixed in any order and are placed abovethe rule. Indexed Variable Conditions may be mixed in any order andfollow the rule. Output Conditions follow the rule and should followall Indexed Variable Conditions present. This is because the VariableConditions determine if the rule really applied, but the OutputCondition determines if the rule should have applied. A fulldescription of each type of condition follows.
Conditions are treated like the environment portion of rules andso may contain any sort of conflation. (See 3.4.4)
Note: The conditions allowed here only express one relationship:the subset relationship. Without constraints of some sort, conditionswould totally destroy any restrictiveness built into the ordinaryrules of a theory. Unfortunately, there is no source for determiningwhat relations should be expressed by conditions (e.g. a set of stonetablets) and many conditions have been written quite innocently whichwould make hash of any notion of restrictiveness in grammars. Pleasethink about this and give me your opinions.
3.4.3.1 Star Filter
** string
This symbol is placed before a description string to define atrue filter. If string is found, then the derivation will stopimmediately and the intermediate form will be starred.
** {αcons ßvoc} {αcons ßvoc}
means no clusters of consonants, vowels or glides!
** {+cons +nas} {| {+cons} |}
{| # |}
means a nasal consonant never either precedes another consonant or aword boundary.
3.4.3.2 Input Conditions on Rules
+i* string
This symbol is placed before a description string to mark aPositive Input Condition. If the condition is false, the next rule ordisjunctive block of rules will be skipped over. All other conditionsassociated with the rule or disjunction of rules are automaticallyskipped and the derivation continues. For example,
+i* [N...+...]
means the next rule applies to nouns with internal morpheme boundariesonly and
+i* {-cons -voc}+Past
would mean that the following rule applies only to forms with a stemending in a glide before a past tense marker.
-i* string
This is placed before a description string to mark a NegativeInput Condition. If the condition is true, the next rule or block ofrules will be skipped over. Other conditions are skipped and thederivation continues. For example,
-i* +
means the next rule does not apply to forms containing morphemeboundaries and
-i* {+syll}({-syll}({-syll})){+syll}
would mean that the next rule does not apply to any form with two ormore syllables (i.e. only to monosyllables).
All input conditions should be put in a group before the rule ordisjunction of rules they apply to. They should not be put in adisjunctive block. They will be applied like a disjunctive block inthat only one need apply to block the rule.
3.4.3.3 Output Conditions on Rules
-o* string
The Negative Output Condition is symbolized by placing -o* beforea description string. If the pattern of the description stringmatches, the result of the previous rule is undone and the derivationcontinues. For example, -o* #(C)V(C)# means the previous rule cannotapply to produce monosyllables.
Sets of Output Conditions are applied disjunctively, that is, assoon as one applies, all other following conditions are skipped.Conditions should not be put in a explicit disjunctive block.
Negative Output Conditions inherit the bindings accomplished byany variable features in the rule itself. Values that are bound by anoutput condition are not passed on to subsequent conditions.
{-syl αvce} --> {-αvce} / __{αvce}
-o* {-syl αvce ßhigh} {-syl αvce ßhigh}
-o* {ßlow ßant +vce -syl}
In the fictitious sequence above, the α value will always be thatresulting from the application of the rule, but the ß values are notshared by the conditions. This is, I think, correct, since (1) OutputConditions hold on rule results and (2) sequences of Output Conditionsare treated as disjunctive blocks and as such should never accumulatevalues.
3.4.3.4 Conditions on Variables
+v*N string
-v*N string
Conditions may be placed on indexed variables in rules as totheir contents. +v* N string means that the variable indexed with N inthe preceding rule must contain string somewhere if the rule is to bevalidly applied. -v* N string means that string must not be found inthe variable. If the variable condition does not hold, the changeaccomplished by the rule is undone and the rule is reapplied until itfails completely or all variable conditions are satisfied. Variableconditions are applied conjunctively: all must be satisfied (even ifvacuously) for the derivation to continue. The ordering of variableconditions should not be crucial, but they should precede all outputconditions.
Both positive and negative variable conditions inherit thefeature variable bindings of the rule, but do not pass bindings on tosubsequent conditions.
Negative Indexed Variable Conditions complement conflation byadding a logical not to the normal and applied to segments to bematched (including ordinary variables) and the varieties of orexpressed by parentheses and curly braces. (See 3.4.4) It is hard tothink of any equivalent to these sorts of condition. See below for anexample in the alternate syntax.
Positive Indexed Variable Conditions are, however, oftenequivalent to putting the same string in the rule. For example,
a --> b / c ...2 d __
+v* 2 z
versus
a --> b / c ... z ... d __
However, this equivalence does not hold if there are several positiveconditions with overlapping descriptions. There is also a differencein inheritance of variable feature bindings between a positivecondition expressed in the rule and expressed as a condition (as notedabove). All these factors should be considered and tested whendeciding if a Positive Indexed Variable Condition is appropriate.
In the type of positive condition where the variable containsonly certain sequences, a solution is to create an abbreviation for alarge enough parenthesized expression to cover the expected cases.(This is not quite cheating. It is the same trick used by sometheoreticians to remove recursion from syntax.) For example,
would create an element for use in rules which only contains nasalsegments. Alternatively, the same effect is gotten by putting in avariable and applying a negative condition like:
-v* 7 {-nas}
Alternate Syntax
where N contains string
where N does not contain string
An alternative syntax for v* is allowed, using the strings'where', 'not', and 'contain'. These strings must be in alllower-case, the first non-blank string must be 'where', a number isexpected somewhere after 'where' and the pattern to be matched will beeverything remaining in the line after the first blank following thestring 'contain', so that 'where 7 is currently containing {+vce}' and'where the variable X7 contains: {+vce}' are both equivalent to '+v*7{+vce}'. Remember that blanks can be used to indent these conditionsto increase readability. For example,
][X==...
[> Iterative Nasalization of Vowels
{+voc} --> {+nas} / {+cons +nas} X1 __
where X1 does not contain {+cons -vce -cont}
<]
means nasalize every vowel between a nasal consonant on the left and avoiceless stop on the right.
Variable Condition Messages:
Variable Condition Without Variable Index
No number was found.
Variable Index Out of Range (1-9)
If a number character follows the index, make sure a blank
separates it from the index number. Otherwise, zero is the
index of all unindexed variables and I hope 9 is enough!
Variables are described in 3.4.4.2.
3.4.4 Rule and Filter Conflation
Rule sets related by having the same target and replacement andsimilar environments may be conflated by the use of parentheses (,)for optionality, curly braces {|, |} for a list of choices,undistinguished variables ... over segments, and disjunctive blockmarkers {[,]}. These may all be used together in the same rulenaturally. Conflation also takes place by the use of feature bundlesand variable signs, but those forms of conflation are treated in thesection 3.3.1 above on feature bundles. The curly brace, variable(except the unit variables {} and _), and parenthesis conflations arenot allowed in the target and replacement parts of the rules. Theorder of actual matching for curly brace, variable, and parenthesisconflations is generally like this: Parentheses shrink. Variablesgrow. Curly braces make choices from top to bottom and then from leftto right. The order of match operations is designed not to overlookany of the possible patterns represented in the conflation, especiallybecause of one pattern being a subset of another. The order ofapplication should be what is normally expected. If the orderingbetween rule subparts is crucial for any reason and it appears thatordinary conflation is not applying in the right order, thedisjunctive block should be used instead of the other conflations totest for a problem. Also note that disjunctive blocks are notequivalent to other forms of conflation since the rule writerdetermines the exact order of application of rule 'parts'.
Indexed angled braces <, > -- as used in SPE -- are not supporteddirectly, partly due to compilation difficulty and partly due toreadability on a character oriented display. The same effect can behad with disjunctive blocks, and on going to paper, you can 'fix' itup pretty. [Honestly, though, without constraints, what sort ofnaturalness can you expect from a notation like that? There, I saidit!]
Conflation Messages:
Rule Too Conflated -- Too Many ...,(,),{|,|}
The stack for keeping track of conflation symbols has
overflowed. Reduce conflation in the current rule
(disjunctive blocks {[, ]} can be used) and let me know if
the limit is set too low. This is a run time error, not a
compile time error.
Meaningless Conflation -- Variable or Parenthesis on Rule Edge
This conflation will not be able to make any difference to
the applicability of the rule.
Conflation Used Improperly Outside of Environment
Some conflation has been used in target or replacement parts
of the rule, so that the operation of the rule is not
clearly defined.
Overgeneration: Indeterminate Insertion Point
This message is given when the environment for insertion is
bounded only by variables:
--> b / c ... __,
--> b / __ ... c,
--> b / c ... __ ... d
In such cases, the insertion point is considered to be
underdetermined.
Too Many Open: X
Too Many Close: X
There is a mismatch in the conflation symbols X.
3.4.4.1 Parenthesis
A --> B / (C)(D)E __ (F(G(H)))I
Parentheses may be used in the context part of the rule foroptional parts. The form the rule may take is as above.
If parentheses are used in the target (i.e. A) or replacement(i.e. B) parts of the rule, they will be not be recognized and therule will not work. This is to distinguish the contextual parts of therule from the target sequence and the replacement or change that is tobe performed on it. Note that the order of application starts with thewidest environment (i.e. including the parenthesized portions) andthen narrows by excluding parenthesized portions if they cannot bematched. All potential patterns created by parentheses are found.
Superscript/Subscript Notation
This notation is not directly supported, but assuming V for{+voc} and C to represent the feature bundle {+cons -voc}, the Csuperscript 3 subscript 1 notation would be (C(C))C or C(C(C)) asshown below:
V --> {αhigh ßlow} / __ C (C (C)) {+voc αhigh ßlow}
One way of making this neater (?) is to use abbreviations:
][C31==C(C(C))
3.4.4.2 Variables
...
A --> B / C ... D __ E ... F
The variable ... will match anything from the null string on up.It may only be used in the context part of the rule, just like parentheses. A rule with variables in the target or replacement partsis currently considered indeterminate. Variables may be used initerative loops to achieve the effect of 'smearing', for example, tonasalize all vowels preceding a nasal consonant:
[>
{+voc -nas} --> {+nas} / __ ... {+cons -voc +nas}
<]
Variables on the extremities of the context are useless:
A --> B / ...C__D... is equivalent to A --> B / C__D
Note that the order of application with variables is first thesmallest environment (... equal to the null string) and then wider environments with ... including more and more of the string. Since matching goes left to right, each new variable will begin with null and grow to the right.
The symbology for variables was chosen to leave the user incontrol of all characters which might be used to represent phonemes. It is a simple matter to use ][X==... to make a more conventionallooking variable name.
...N
Indexed variables are used with conditions on variables. Theyfunction just like variables, but their contents are kept untilanother regular rule applies. A variable condition (e.g. +v*, -v*)following the rule can be applied to the contents of a variable byreferring to its index. The index N must be a number from 1 to 9immediately adjacent to the variable. (If a number character is beingused in your rules next to a variable, but not as an index, then use ablank to separate it from the variable.) Once again an abbreviationcan be used: ][X==... to make X1 work in your rules. See 3.4.3.5.
{}
{} is a variable which will match any one phoneme.
_
_ is a variable which will match any one non-phoneme.
Both _ and {} can be used in the target part of the rule. Theyare mainly provided as a replacement for the feature segment which hasbeen used to integrate true phonemes with some relevant non-phonemesin a feature representation--this way you don't need to put everythingin the matrix. Use with care! (Remember ][skp+)
skp
Speaking of ][skp+, remember that this convention is like havinga variable containing any number of non-phonemes stuck between everyitem named in your rule.
α feature
Variables for signs of features hold their values within rulesand conditions. Also, like indexed variables, when they are bound in arule with --> or ==>, they hold their values through all the variableand output conditions which may follow that rule.
3.4.4.3 Curly Braces
A --> B / {| C |} __ {| D |}
{| E |} {| F {| G |} |}
{| H |}
Curly Brace notation for conflating rules is also supported ({|,|} for lack of a more attractive alternative). These are a disjunctiveset, an or. Curly braces are only allowed in the context orenvironment portion of the rule. The braces {| and |} must line upvisually to work. If some segment, like D above, is to be followed byother deeper curly brace options, it must be on one of the topcorners, like a funnel.
A --> B / __ {| C |} K
{| D {| E |} F |}
{| G {| H |} I |}
{| J |}
This example conflates the patterns:
ACK
ADEFK
ADGHIFK
ADGJIFK
If you violate the 'funnel' or 'visual lineup' principles, yourrules will not work right.
One last example,
A --> B / __ {| C {| D |} |}
{| {| E |} |}
{| F {| G |}|}
{| H |}
This example conflates:
ACD
ACE
AFG
AFH
Were you to line up the G and H pieces with the D and E pieces,you would add the patterns ACG and ACH producing unexpected results,but it might take a while to notice! Note also that the outer curlybraces on line two could not be omitted if F is ever to be found. Butthe outer curly braces on line four may be omitted. Visual continuityor a funnel is the shape to look for.
Note that you can orphan a section of your total logical rule ifyou interrupt the line sequence in curly braces (e.g. with a commentline). For purposes of numbering, editing, etc., the two examplesabove would be four lines or four 'rules' each to Fonol, but forpurposes of application, it is one rule, indivisible.
Note that the order of application of rules in curly bracenotation is from top to bottom and left to right, as in the exampleabove. This should normally yield the expected SPE order of subcases,but in case of doubt convert to the disjunctive block alternative andsee if there is any difference. (But remember that sets in curlybraces are multiplied!)
Note also that empty braces are ignored. If you want a true zero choice use parentheses, i.e. ({| a |}) not {| a |}
{| b |} {| b |}
{| |}.
The all braces notation will find either a or b or fail, the combinedparenthesis/curly braces notation will find a or b or neither. Thereis no provision for absence!
3.4.4.4 Disjunctive Blocks of Rules
{[
]}
These symbols, placed on lines by themselves, mark the beginningand end of a set of disjunctively ordered rules. If one rule in theset applies, then all the remaining rules are skipped. (Normally allrules are applied one after another, conjunctively, to produce anacceptable derivation.)
The rules in the block behave as if they were one rule. Inputconditions placed before the disjunctive block and variable and outputconditions placed after the block will apply to the whole block (i.e.to whichever of the rules happens to apply). Rules inside adisjunctive block may have their own conditions and conflations,however disjunctive blocks may NOT be nested. Comment lines areallowed in the usual way. Comments may also be written after the blockmarker as a label for the overall logical rule (so long as the blockmarker is the first symbol on the line). Disjunctive blocks can beused when the other types of conflation do not work correctly due toorder of application of subcases and when the rules to bedisjunctively ordered do not have enough in common to be conflated.For example, here are the cases for Swahili Class 1 (human) subjects:
{[ Negative Prefix Insertion
NEG+1stSgCl1 --> si
NEG --> h / __ + {| 2ndSgCl1 |}
{| 3rdSgCl1 |}
NEG --> ha
]}
Note please however that disjunctive blocks are NOT automaticallyequivalent to conflations with variables, parentheses or curly braces.
{[
a --> b / c__d
a --> b / e__f
]}
lacks two of the cases (ead, caf) found in
a --> b / {| c |} __ {| d |}
{| e |} {| f |}
(I wouldn't mention this except it is one of my own careless errors!)
Note that conditions and filters are automatically treated asdisjunctive blocks without requiring explicit block markers wheneverthey would result in the blocking or reversal of a rule. If you putexplicit block markers around them, the interpreter may lose track ofparts of your rule.
3.5 Loops: Cycles, Iteration
[> type
<]
These symbols, placed on a line by themselves, mark the beginningand end of a block of rules which are to be distributed over theirpotential contexts in the base form. With these it is possible todefine a set of cyclic rules as well as pre- and post-cyclic rules anditerative rules. Type is one of the two main types of loop (iterativeand cyclic) described below. Declarations are provided to producesubtypes of loop.
Nesting is permitted to a depth of 5, although it is hard toimagine any useful nesting beyond two. Any type of loop may be nestedin another type, but again, it only seems reasonable to includeiterative loops in (syntactic) cyclic loops (see explanation infollowing sections).
Sequential loops seem a reasonable way of handling the sort ofmodularity where groups of rules apply one after the other,iteratively or based on some sort of boundary (syntactic cycles).
Loop Messages:
** Loops Nested Too Deep **
There is no fix, but I would be surprised if you needed to
exceed this limit. Write me.
** More Loop Ends Than Starts **
The loop ends order a pop of a loop start stack. This is
detected at run time. Check for miscounts on loops by using
d/[> and d/<]. An imbalance in favor of starts is not
detected.
Loop halted. Limit exceeded between N and M
The loop has run past the limit (currently 30 iterations)
and the possibility is strong that it is infinite.
Use d/N M to see the affected part of your rules and look
for rules that undo one another's effects or create their
own context. Usually the problem will be obvious if you have
been watching the screen. (Turn off /[hide!) The program is
designed so that many vacuous rules in loops terminate
successfully, but this is the safety net.
Note on Rule Reapplication
The repeated application of rules can be thought of as looping oras the distribution of a rule over its contexts in an intermediateform. Some effort has been put into ensuring proper distribution ofthe rules over contexts. This is especially a problem in iterative oracross-the-board blocks where rules are to be applied to exhaustion(note: across-the-board has been used with other meanings, soiterative is most often used here). Currently rules are allowed toapply only once to each context they describe. This may not always becorrect -- for example, should an insertion rule like --> b / c...__dapply once or twice to the string /cacad/? Currently it applies oncelike non-insertion rules would. Some rules that create their owncontext simply overgenerate (i.e. -->b / b__ or __b), because I don'tbother to trap them, since I don't think they will arise in the rulesets you actually write. Please write me if rules placed in loops seemto apply too much or too little.
3.5.1 Iterative Loops (Across-the-Board Rules)
[> iter
This is the minimum for declaring a loop to be iterative. ([>defaults to iter.) The loop end is always <]. Rules in an iterativeloop apply in order until they cannot apply anymore. Any rule can bedefined as iterative by placing it within these block markers. Anycomments are allowed so long as [> begins the line and the sequenceiter is found somewhere on the line, e.g.:
[> Nasalization is Iteratively Applied to the Left
{+syll} --> {+nas} / {+nas} (C(C)) __
<]
is valid.
3.5.2 Syntactic Cyclic Loops
[> syn cyc
This is the minimum for declaring a loop as a syntactic cycle.Each rule within a syntactic cyclic loop is applied in order one timefor each pair of [,] in the base form. The [,] in the base form mustbe paired and, naturally, may be labeled on the inside (i.e. [N xxx ]can be used by rules referring to nouns, N[ xxx ]N would have the Nsexcluded until the next higher cycle). The [,] are the limits of thebase form examined on each cycle. Declarations like ][mcpi+, ][ssc+,][ats+, ][atdf+, ][rbi!, ][dbc+, ][cyccat:[XXX may be used to modifythe behavior of syntactic cycles so that rules are applied in widelyvarying ways (see following discussion).
Note that such cycles do not have to be actually syntactic,merely bounded by [,].
Any commentary may be placed after [> so long as the twosequences syn and cyc are included in this order, for example:
[> Main Syntactic Cycle for English
[> Stem Oriented Syntactic Precycle
[> Totally Other Type of Cycle [syncyc]
are all valid.
Types of Syntactic Cycles
By using the various rule application declarations (see 3.1.3)with syntactic cycle blocks, it is possible to create a fairly largevariety of rule application schemes. One fixed point which must beremembered is that the brackets must be present in the underlying formif applications are to be made based on them. Syntactic cycles willapply once to material outside the highest brackets.
The brackets do not all have to be in the original base form:free-form syntactic cycles are possible through the ][rbi! and ][dbcdeclarations. In such cases, erasure of brackets by rule is the onlycriteria for moving through widening (or changing) stretches of thebase form.
In the following paragraphs, I will try to describe the varietiesof directly supported syntactic cycles systematically.
1. If you use syntactic cycle block markers by themselves with alldeclarations off, you get a system in which the rules in the block areapplied once for every pair of brackets ([,]) to the part of thestring which is bracketed. If you have skp on (][skp+) and mcpi on(][mcpi+), then the cycle will behave like that of SPE. Alternatively,if you have skp and mcpi off, then you must delete the brackets andother non-phonological stuff to get the same effect.
2. If you place ssc+ before the block, no rule will affect anythingin an embedded bracketed area. It does not matter if you erase thebrackets or not. skp and the presence or absence of brackets will onlyaffect the potential environments of rules, not the potential targets.Naturally preceding or following rules outside of a strict cyclicityblock (ssc+, ssc-) would apply to the whole string. Apart fromsyntactic cycle blocks, ssc has no effect. I recommend putting thedeclaration ssc before and after the syntactic cycle block markers tokeep the scope clear.
3. If ats+ is placed before a syntactic cyclic block, then the ruleswill only apply in the minimal bracketing ([X] where X does notcontain [,]). A reason for putting the syntactic cycle block markersaround the rules is to guarantee that the rules will apply to allminimal bracketings (i.e. in [ab[cd][ef]gh] to cd and ef). Once again,I would suggest using the ats + and - around the syntactic cyclicblock to make the scope clear.
4. If atdf+ is placed before a syntactic cyclic block, the rules inthe block will apply only in bracket pairs which contain other bracketpairs ([X] where X contains some [Y] but not individual unpaired [ or]).
5. If Cyclic Category:[ is used the cycle will be constrained tothose bracketings labeled according to the declaration.
6. If dbc+ is placed before a syntactic cyclic block, the rules willbe applied first just as in ats+ to all minimal bracketings, then thebase form will be scanned for brackets, new minimal bracketings willbe detected and the rules will be applied again. This will go on until(1) there are no more brackets or (2) the bracketing is extremelyconfused. The first halting case should be normal. The second mayoccur if your rules are capable of inserting or deleting brackets inan unpaired fashion.
If you insert brackets during a cycle, they will not be madeeffective until the rules have been distributed over all currentminimal bracketings. This may look strange for a while on screen. Anddon't forget to turn it off after the cycle block (][dbc-).
7. The rbi! declaration has a safe use before a cycle block. That isa first set of rules (in a block or free standing) inserts or deletesbrackets in the form being derived or changes the size of the originalbracketed form. Then rbi! sets up the form for a following syntacticcycle block.
rbi! will work inside a cycle, but it is totally up to the userto manage the brackets. The loop will stop after about 30 tries if norules apply to change the bracketing. Good luck!
Combinations:
Type 5 above may be mixed with any of the other types. Types 3and 4 are mutually exclusive. Type 3 with type 2 is overkill. If type2 is not mixed with type 4, rules may apply to stems (defined asminimal bracketings). If type 2 and type 4 are used together, no rulesof that cycle will apply to stems.
If you put a type 3 cycle before a type 4+2, you have a modelwhere there is a group of rules that apply only to stems followed by agroup of rules that apply only to derived forms. Type 3 followed bytype 4 means that there are some rules that apply only to stems andothers that apply to derived forms in the SPE fashion. Naturally youcan have other fantastic combinations where all the noun stem rulesapply first in a block followed by all the verb stem rules, orwhatever. The combination of declarations and sequencing of blocksallows for many different and complex models of rule application.Remember that iterative blocks may be included in syntactic cyclicblocks, where they will apply to whatever is the current bracketing.(As a matter of fact, some Lexical Phonological cycles I've seen looklike they could be modeled in Fonol by putting iterative block markersimmediately inside syntactic block markers so they include all therules). Remember the scoping of declarations and block markers canmodularize your rules in many ways. Rules outside of blocks will applyto the whole string once, so you can have postcyclic or precyclicrules, adjustment rules, and so on. Putting these declarations insideof blocks will work, but it is not altogether clear what the resultswould be. Let me know if the possible combinations (or theirdocumentation) are inadequate. On the restrictive side, it is just amatter of not using what is provided.