You can dowmload this document as a PDF file.

Most people know about flowcharts. But there are other ways of representing data, states, actions or processes: UML, Sankey diagrams, decision trees, Petri Net, organizational charts, mind maps, Process Flow diagrams, Feynman diagrams, Data Flow diagrams, Concept Maps, OBASHI, Task Lists (or To-Do lists), Warnier/Orr diagrams and various other diagrams. More than we can list here. They have various uses, various strengths and shortcomings.

Most methodologies for representing states or flows were born out of specific needs and not to be used as generic methods for representing everything as simple as possible. What if there was a way to represent any state, set of things, actions, flows or transitions? What if the method was simple? What if it was also Turing complete?

Enter WOIM.

WOIM is the acronym for Warnier/Orr/Isene/Moeller.

It is a system for representing data. Any data. Static or dynamic. It can be used to describe any state; A thing or set of things, an area, a concept or collection of concepts etc. It can also be used to describe any action or plan, transformation or transition. In fact, it can describe anything - with one complete markup set. WOIM can be be used as an outliner on stereoids or a todo-list managing system with endless possibilities.

After searching for a complete markup methodology for both states or things and actions or transitions, I came across the Warnier/Orr diagrams. They seemed to be the best foundation for what I needed. The Warnier/Orr diagrams were expanded to be able to as easily as possible descibe anything. I removed the graphical parts of Warnier/Orr and expanded the methodology substantially. My collegue Egil Moeller helped in the refinements of WOIM.

The strengths of WOIM are many:

  • can represent any state or action with any amount of levels
  • Turing complete
  • text-based (which means it is wiki-able - i.e. it is easy to collaborate when creating WOIM lists)
  • not graphical (although it can easily be made graphical for ease of consumtion or for eye candy)
  • an easy syntax, humanly very readable
  • compact
  • can represent negatives (NOT, don't do the following actions)
  • can represent any number of choices in a decision (hard to do in a flow chart)
  • easy to do loop counts
  • easy to show attributes such as time or timing, location, responsibility etc.
  • potentially easy to map to other representation methods (graphical or not)

In its simplest form, a WOIM list is just a list of items - like your regular shopping list - but it can be so much more if you need it. A couple of examples will give you the basic idea.

An example of describing a state:

 Car (not complete example)
    Exterior
       Paint
       Chrome decor
       Windows
          Robber linings
       [4] Wheels
    Interior
       Seats
          [2] Front
          [3] Back
    Mechanics
       Motor
          [6] Cylinders
          [24] Valves
       Breaks

A transition example (task list):

 Walk the dog
    Check the weather
       [?rain] AND/OR:
          Get rain coat
          Get umbrella
       Dress for the temperature
    Get chain
    Call for the dog
    OR:
       Go through the woods
       Walk the usual track
    AND: (concurrency)
       Ensure the dog has done its "tasks"
       Ensure the dog is exercised
          [5+] throw the favorite stick
    Walk home

And this can all be done in collaboration on a wiki. States are described, processes are mapped, plans and todo-lists are forged. It's rather easy, and WOIM can accomodate for any level of complexity.

Let's go through the various parts of WOIM and all its possibilities.

A WOIM list

A WOIM list consist of one or more WOIM items.

A WOIM item

A WOIM item is a line in a WOIM list. It can have "children". Children are WOIM items indented to the right below the item.

A WOIM item consists of an optional "Starter", an optional "Type", "Content" and a "Separator" in that sequence. All the various parts of a WOIM item is described below and in the sequence they appear in an item.

Starter

A WOIM item may begin with a "Starter". A "Starter" can be either an "Identifier" or a "Multi-line Indicator".

An Identifier is a number that can be used in referring to that item. The numbering scheme is X.Y.Z. i.e. the first item in a WOIM list would be 1. (note the period after the number). The second item would be 2. etc. A child to the second item would be 2.1. and the second child of 2. would be identified as 2.2. whereas the cild of 2.2. would be 2.2.1.

An item that spans several lines must have a Starter. The second line of an item will be indented to the same level as the first with an added space in front

You don't have to use an Identifier just because an item spans several lines. You may use a "Multi-line Indicator" instead. Just prefix an item with an asterisk ("*"), and it shows that the item spans more than one line.

If you use a Starter on one item, then all the items in that same group of items on the same level/indent must also have a Starter.

Type

If it is not obvious or for clearity and strictness, prefix an item with "S:" if the item is a static or state-item (something which does not denote action). Use "T:" for a transition item (an item indicating action). The Type indicator comes after the optional starter.

.

Children of a certain type (state or transition) inherit their parents type unless otherwise specified.

Item content

A WOIM item must have some sort of Content. The Content can be an "Element" and/or and "Additive"

Elements

Elements are either an "Operator", a "Qualifier", a "Tag" or a "Description". Let's treat each one of these concepts.

Operator

An Operator is anything that operates on an item or a set of items. It can be any of the usual logical operators. It can also be other operators such as "EXAMPLE:", "EXAMPLES:", "CHOOSE:", "ONE OF THESE:", "IMPLIES:", "CONTINUOUS:" (makes an item or set of items run continuously), etc. An operator is written in capital letters and ends in a colon.

Qualifier
A Qualifier does as its name suggest, qualify an item. The format is "[count?condition]". The usage is best described by a few examples:

  • Do item 3 times = "[3]"
  • Do item if "the mail has arrived" = "[?the mail has arrived]"
  • Do item 2 times while "foo=true" = "[2?foo=true]"
  • Do item from 3 to 5 times while "bar=false" = "[3,5?bar=false]"
  • Do item 1 or more times = "[1+]"
  • Do item 1 or more times while "Bob is polite" = "[1+?Bob is polite]"
  • Do item up to 4 times only while "zoo=0" = "[<4?zoo=0]"

The question mark is read "if".

To indicate that an item is optional, use the short form "[?]".

Tags

A Tag is any attribute describing the Content. It ends in a colon.

Examples of tags could be: "Location = Someplace:", "Responsible = Someone:", "Strength = Medium" and "Color = Green".

A timestamp is a usual Tag with date and time format as "YYYY-MM-DD hhmmss", conforming to the standard ISO-8601. The time/date format can be shortened to the appropriate time granularity such as "YYYY-MM-DD hhmm", "YYYY-MM-DD hh" or "YYYY". One can add a time stamp such as "Time = 2012-12-24 17:" or simply just "2012-12-24 17:"

Time stamp tags may be relative such as:

  • Time relative to previous item = "+YYYY-MM-DD:"
  • Less than a certain time after previous item = "<+YYYY-MM-DD"
  • More than a certain time after previous item = ">+YYYY-MM-DD"
  • Time relative to next item = "-YYYY-MM-DD"
  • Less than a certain time before next item = "<-YYYY-MM-DD"
  • More than a certain time before next item = ">-YYYY-MM-DD"
  • Time relative to other item, example = "+YYYY-MM-DD#otheritem:"

The last example introduces a new concept, the "Reference". References will be discussed later.

Other obvious time tags may be used, such as:

  • "+1 week:"
  • "-2 Marsian years:"

Some practical examples:

  • Wait one month before doing the item = "+YYYY-01-DD:"
  • Do item less than 4 days before next item = "<-YYYY-MM-04:"
  • Wait one year and two days after item X = "+0001-00-02#X:"
Description

The Description is the main body, the "meat" of the item. Although an item may not have a Description, such as a line containing only the Operator "OR:", most items have a description. Many items have only a Description such as a simple todo-list.

Additives

Additives can be used alone or in combination with Elements.

An Addition can either be a "Reference", a "Comment", a "Quote" or a "Change Markup".

References

A "#" followed by the name of an item, list or anything else is a Reference. An example would be a Reference to a website such as "#http://www.isene.com/". A Reference with spaces must be enclosed in single quotation marks - "#'This is a reference'" as opposed to "#Reference".

There are three types of Reference:

  1. A redirection or hard reference
  2. A soft reference

An item consisting only of an Reference is a redirection. For a transition item this means one would jump to the reference and continue execution from there. If the redirect is to jump back after executing the Reference (and its children), then add another hash at the beginning such as "##ref". This makes it easy to create more compact WOIM Lists by adding a set of commonly used subroutines at the end of the list. For a state item, a Reference means one would include the referenced item (and its children) at the Reference point.

There are two special redirections for transition items:

  • An item consisting only of the key word "SKIP" ends the current WOIM level
  • An item consisting only of the key word "END" ends the whole WOIM list

If the Reference is only part of an Item, it is a "soft reference". It indicates that one would look for more information at the referred Item. An even softer reference would be to put the Reference in parenthesis such as "(#ref)", indicating only an apropos. Parenthesis is used for Comments and discussed later.

If you reference an item higher up in teh WOIM List, a simple reference to the item is all that is neede. One would refer to the Identifier or to the appropriate Content, usually the Description. It would make sense to use an Identifier for an Item if the Description is long if you would want to refer to that Item. If you refer to an Item further down the hierarchy, you would use a forward slash ("/") to separate each level (like the "path" used in a URL). If you want to refer to an item where you first need to "climb the tree" and then go down another "branch", you start the path with the highest common level and reference the path from there. An example of a reference with a path would be "#'Somewhere higher up/one level down/referred item'". You may use a unique concatenation of the path to shorten it, such as "#'Somewhere higher up/one lev.../ref...'". The three periods indicate concatenation.

Comments

Anything within parenthesis is a comment. Comments are are not executed as WOIM commands - i.e. they are not actions in a list of transition items.

Quotes

Anything in quotation marks is a quote. Like a Comment, a Quote is not executed as a WOIM command.

Change Markup

When working with WOIM Lists, especially on paper, there may come a need to mark deletion of items and to show where an item should be moved to. To accomodate for this need, Change Markup is introduced.

If "<<" is added at the end of an Item, it is slated for deletion.

To show that an Item should be moved, add ">>" at the end followed by a Reference showing to which Item it should moved below.

To indent an item to the left, add "<-". Indenting an item to the right is marked by "->". It is quite possible to combine moving and indenting an item such as moving an item and making it a child of another: ">>#ref->".

Separator

A Separator separates one Item from another. A line in a WOIM List is usually one Item, and Items are then usually separated by a "newline" (hitting the "Enter" on the keyboard). But it is possble to string several Items together on one line by separating them with semicolons.

By separating an Item by a newline and then indenting it to the right, you create a child Item. A child adds information to its parent.

If the parent Item contains a Description, a separator is read as "then". A newline and indent to the right (a children) reads "with" or "consists of". If the parent Item does not contain a Description, the separator is read as "applies to:". A couple of examples should suffice:

A kitchen
   Stove
   Table
      Plates
      Knives
      Forks

This would read: "A kitchen with stove and table with plates, knives and forks".

Time = 2010: 
   Olympic Games
   Soccer world championship

This would read: "Time = 2010: applies to: Olympic Games and Soccer world championship".

Walk the dog
   Check the weather
      [?rain] AND/OR:
         Get rain coat
         Get umbrella
      Dress for the temperature
   Get chain

And this would read: "Walk the dog consists of Check the weather consists of: If rain, AND/OR: apply to children: Get rain coat, Get umbrella, then Dress for the temperature, then Get chain". Or more humanly: "Walk the dog consists of check the weather which consists of either or get the rain coat and get umbrealla. Then dress for the temperature and then get the chain."

WOIM is self describing

Now that we have covered all the possibilities in a WOIM list, it should be obvious that WOIM could extend into a vast array of descriptions. It should even be possible to write a parser or compiler for WOIM and use it as a programming language.

Would it be possible to compact the descriptions above into a WOIM list? Yes indeed. The WOIM system is self-describing. The following list shows the legal structure and syntax of a WOIM list. It cover all you have read above:

WOIM list (2009-11-03)
   [1+] WOIM item
      [?] Starter; OR: 
         Identifier (use numbers, "X.Y.Z... ending in a period and a Space)
            [?Multi-line item] The Identifier serves as an "*"
               #1.
         Multi-line indicator = "*"
            1. Following lines are of same indent with a "space" before
             the text
            * If one item on a certain level/indent is multi-line, all items
             on the same level/indent must start with an "*" or #Identifier
      [?] Type
         OR:
            State = "S:"
            Transition = "T:"
         Children inherit Type from parent unless marked with different type
         Can be skipped when the item is obviously a state or transition
      Content; AND:
         [?] Element
            Operator
               Anything operating on an item or a set of items
               Can be any of the usual logical operators
               Is written in capitals ending in a colon
               EXAMPLES: "AND:", "OR:", "AND/OR:", "NOT:", "OPTIONS:", "IMPLIES:"
               To make the item run continuously, use "CONTINUOUS:" 
                  Item is done concurrent with remaining items
                  The operator can be combined with a time stamp tag
                     EXAMPLE: "CONTINUOUS: YYYY-MM-07:" = Do the item weekly
            Qualifier
               Format = "[Count?Condition]"; EXAMPLES:
                  Do item 3 times = "[3]"
                  Do item if "the mail has arrived" = "[?the mail has arrived]"
                  Do item 2 times while "foo=true" = "[2?foo=true]"
                  Do item from 3 to 5 times while "bar=false" = "[3,5?bar=false]"
                  Do item 1 or more times = "[1+]"
                  Do item 1 or more times while "Bob is polite" = "[1+?Bob is polite]"
                  Do item up to 4 times only while "zoo=0" = "[<4?zoo=0]"
               Optional item = "[?]"
            [1+] Tag
               Any attribute to the #Content, ending in a colon
                  Time stamp = "YYYY-MM-DD hhmmss:"
                     Shorten the format to the appropriate granularity
                  Time relations
                     Time relative to previous item = "+YYYY-MM-DD:"
                     Less than a certain time after previous item = "<+YYYY-MM-DD"
                     More than a certain time after previous item = ">+YYYY-MM-DD"
                     Time relative to next item = "-YYYY-MM-DD"
                     Less than a certain time before next item = "<-YYYY-MM-DD"
                     More than a certain time before next item = ">-YYYY-MM-DD"
                     Time relative to other item, example = "+YYYY-MM-DD#item:"
                     Other obvious time indicator may be used; EXAMPLES:
                        "+1 week:"
                        "-2 Marsian years:"
                     EXAMPLES:
                        Wait one month before doing the item = "+YYYY-01-DD:"
                        Do item less than 4 days before next item = "<-YYYY-MM-04:"
                        Wait one year and two days after item X = "+0001-00-02#X:"
                  Any other tag
                     EXAMPLES: "Location = Someplace:", "Responsible = Someone:"
            Description
               The main body of the WOIM item, the "meat" of the line
         [?] Additive
            Reference
               * A "#" followed by the name of an item, list or anything else
                EXAMPLE: Reference to a website = #http://www.isene.com/
               * A Reference with spaces is enclosed in single quotation marks
                (#'This is a reference' as opposed to #Reference)
               * There are two types of references; OR:
                  Redirection (hard Reference)
                     An item consisting only of an reference is a redirection
                        For a transition item = Jump to reference, continue execution
                           * If the redirect is to jump back after executing 
			    the reference (and its children), then add another 
			    hash at the beginning (##ref)
                              * EXAMPLE: Use this when creating subroutines at 
			       the end of the list
                        For a state item = Include the referenced item
                     An item consisting only of the key word "SKIP" 
		        ends the current WOIM level
                     An item consisting only of the key word "END" 
		        ends the whole WOIM list
                  Soft reference
                     Reference is part of an item
                        Look at referred item for info only
                     Even softer reference = have the reference in "()"
                        An apropos
               * A reference to any line upward in the WOIM list is simply a
                reference to the items #Content
               * A reference downward needs a "/" to separate each level (to
                make a "path" (like a URL) to the item
                  EXAMPLE: Reference from here to #Element/Starter/Identifier
               * For long items in a reference, concatenation can be used
                  The concatenation must be unique
                  EXAMPLE: Reference from here to #Comment/Anything...
            Comment
               Anything within parenthesis is a comment
               Is not executed as WOIM commands
            Quote
               Anything in quotation marks is a quote
               Is not executed as WOIM commands
            Change Markup; OR:
               Deletion
                  Remove the item by adding "<<" at the end of the item
               Motion; OPTIONS:
                  Move the item by adding ">>#Ref"
                     This moves the item just below the referenced item
                  Move the item one level in by adding "<-" at the end of the item
                  Move the item one level out by adding "->" at the end of the item
               EXAMPLE: Move an item as a child to Reference = ">>#Ref->"
      Separator 
         OR:
            Semicolon
               A semicolon is used to separate two WOIM items on the same line
            Newline
               Used to add another item on the same level
               Indent
                  Used to add a child
                     A child adds information to its parent:
                     A child is another regular #'WOIM item'
         Definition
            A separator and no indent reads "then:"
            [? parent contains #Description] 
	       The separator and right indent reads "consists of:"
            [? NOT: parent contains #Description] 
	       The separator and right indent reads "applies to:"

Read and re-read the WOIM list above, and you will be a WOIM master after a while. It's all there. The whole markup. You may download the WOIM definition above as a text file.

If you use VIM as an editor, you can use the vim plugin I made for creating and viewing WOIM lists. It highlights correct WOIM lists. TABs are used for indenting and SPACE folds/collapses or opens a branch/sublist. \0 collapses the whole list, \1 collapses to level 1, \2 collapses to level 2 etc. Normal collapse commands also work.

There will be more on the WOIM methodology in the book I'm writing. This book will cover many related subjects such as something I call Dynamic State Modelling (DSM - a way to apply transitions to states to arrive to new states). I will keep you posted on the progress of the book.