This example generates fault trees. Fault trees are a reliability modeling
language in which models capture the relationships between low-level failures
in a system. (They're actually directed acyclic graphs.) For example:

  system_event = id_1 ;
  id_1 or id_2 id_3 ;
  id_2 be ;
  id_3 be ;

states that the overall system (id_1) will fail if id_2 or id_3 fails.
Normally the basic event failures would be modeled with probability
distributions, so that the overall probability of failure could be computed.

This example demonstrates:

- An input .yg that is exactly the same as the Bison input file, except for
  the addition of unaction blocks.
- Sophisticated unaction blocks that remove elements from the global data
  structure.
- The use of sophisticated constraint checks during generation, such as
  disallowing fault trees containing cycles.
- The use of a lot of user-defined code. (The Fault_Tree data structure and
  supporting types.)

Run it with:

$ yagg -m -u user_code fault_tree.yg fault_tree.lg
$ ./output/progs/generate 12
