{
  "title": "Programming Languages",
  "desc": "Programming Languages",
  "build_dir": "Books",
  "code_dir": "SourceCode/",
  "code_lang": {
    "Pseudo": {
      "ext": [
        "txt"
      ],
      "label": "Pseudo",
      "lang": "pseudo"
    }
  },
  "lang": "en",
  "build_JSAV": false,
  "suppress_todo": false,
  "dispModComp": true,
  "glob_exer_options": {
    "JXOP-debug": "true"
  },
  "chapters": {
    "Preface": {
      "Intro": {
        "long_name": "How to Use this System",
        "sections": {}
      }
    },
    "Grammars": {
      "PL/Grammars1": {
        "long_name": "Derivations and Parse Trees",
        "sections": {
          "Parse Trees": {
            "parseTree4": {
              "long_name": "parseTree4",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/AV/parseTree.css",
                "AV/PL/main.css"
              ],
              "scripts": [
                "AV/PL/AV/parseTree4.js"
              ],
              "mod_name": "Grammars1"
            },
            "NumParseTreeNodes": {
              "long_name": "Determine Number of nodes",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/NumParseTreeNodes.html",
              "mod_name": "Grammars1",
              "threshold": 1
            }
          },
          "Strings Generated by a Grammar": {
            "StringGenFromGmr": {
              "long_name": "String Generated By a Grammar",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/StringGenFromGmr.html",
              "mod_name": "Grammars1",
              "threshold": 1
            }
          },
          "Characterizing a Language: Example 1": {
            "CharacterizeLang1": {
              "long_name": "Characterizing a Language, Problem 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CharacterizeLang1.html",
              "mod_name": "Grammars1",
              "threshold": 1
            }
          },
          "Characterizing a Language: Example 2": {
            "CharacterizeLang2": {
              "long_name": "Characterizing a Language, Problem 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CharacterizeLang2.html",
              "mod_name": "Grammars1",
              "threshold": 1
            }
          }
        }
      },
      "PL/Grammars2": {
        "long_name": "Ambiguous Grammars",
        "sections": {
          "Second Sample Grammar": {
            "parseTree5a": {
              "long_name": "parseTree5a",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/AV/parseTree.css"
              ],
              "scripts": [
                "AV/PL/AV/parseTree5a.js"
              ],
              "mod_name": "Grammars2"
            },
            "parseTree5b": {
              "long_name": "parseTree5b",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/AV/parseTree.css"
              ],
              "scripts": [
                "AV/PL/AV/parseTree5b.js"
              ],
              "mod_name": "Grammars2"
            }
          },
          "Ambiguity in Grammars": {},
          "Ambiguous Grammar - Part 1": {
            "NumParseTrees1": {
              "long_name": "Number Of Parse Trees, Problem 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/NumParseTrees1.html",
              "mod_name": "Grammars2",
              "threshold": 1
            }
          },
          "Ambiguous Grammar - Part 2": {
            "NumParseTrees2": {
              "long_name": "Number Of Parse Trees, Problem 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/NumParseTrees2.html",
              "mod_name": "Grammars2",
              "threshold": 1
            }
          },
          "Ambiguous Grammar - Part 3": {
            "NumParseTrees3": {
              "long_name": "Number Of Parse Trees, Problem 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/NumParseTrees3.html",
              "mod_name": "Grammars2",
              "threshold": 1
            }
          },
          "Discovering Ambiguity": {
            "DeterminingAmbiguities": {
              "long_name": "Determining Ambiguities",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/DeterminingAmbiguities.html",
              "mod_name": "Grammars2",
              "threshold": 1
            }
          }
        }
      },
      "PL/Grammars3": {
        "long_name": "Enforcing Order of Operations",
        "sections": {
          "Evaluation of Expressions": {
            "parseTree3": {
              "long_name": "parseTree3",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [],
              "scripts": [
                "AV/PL/AV/parseTree3.js"
              ],
              "mod_name": "Grammars3"
            },
            "parseTree3a": {
              "long_name": "parseTree3a",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/PL/AV/parseTree3a.html",
              "mod_name": "Grammars3",
              "threshold": 1
            }
          },
          "Expression Evaluation": {
            "EvalExp": {
              "long_name": "Evaluating Expression Based on Grammar",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/EvalExp.html",
              "mod_name": "Grammars3",
              "threshold": 3
            }
          },
          "Associativity": {
            "Associativity": {
              "long_name": "Associativity",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Associativity.html",
              "mod_name": "Grammars3",
              "threshold": 1
            }
          },
          "Precedence and Associativity": {
            "PrecedenceAndAssociativity": {
              "long_name": "Precedence and associativity",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/PrecedenceAndAssociativity.html",
              "mod_name": "Grammars3",
              "threshold": 1
            }
          },
          "Characterizing a Language Given a BNF Grammar": {
            "CharacterizeLang3": {
              "long_name": "Characterizing Language 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CharacterizeLang3.html",
              "mod_name": "Grammars3",
              "threshold": 1
            }
          },
          "Extended BNF": {
            "ExtendedBNF": {
              "long_name": "Extended BNF",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ExtendedBNF.html",
              "mod_name": "Grammars3",
              "threshold": 1
            }
          }
        }
      },
      "PL/Grammars4": {
        "long_name": "Parser Generators",
        "sections": {
          "Jison": {
            "Jison1": {
              "long_name": "Jison Problem 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Jison1.html",
              "mod_name": "Grammars4",
              "threshold": 3
            }
          },
          "More practice with Jison": {
            "Jison2": {
              "long_name": "Jison Problem 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Jison2.html",
              "mod_name": "Grammars4",
              "threshold": 1
            }
          }
        }
      },
      "PL/Grammars5": {
        "long_name": "Using Parser Generators to Interpret a Language",
        "sections": {
          "Annotating Jison Grammars": {
            "AnnotatingJison": {
              "long_name": "Annotating Jison",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/AnnotatingJison.html",
              "mod_name": "Grammars5",
              "threshold": 1
            }
          }
        }
      }
    },
    "Functional Programming": {
      "PL/FP1": {
        "long_name": "List Construction and Deconstruction",
        "sections": {
          "Constructing Lists with fp.cons": {
            "FPcons": {
              "long_name": "Using cons",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/FPcons.html",
              "mod_name": "FP1",
              "threshold": 1
            }
          },
          "Deconstructing Lists with fp.hd and fp.tl": {
            "FPHdTlCons1": {
              "long_name": "Head, Tail, and Cons 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/FPHdTlCons1.html",
              "mod_name": "FP1",
              "threshold": 3
            }
          },
          "Practicing List Manipulations with the fp module": {
            "FPHdTlCons2": {
              "long_name": "Head, Tail, and Cons 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/FPHdTlCons2.html",
              "mod_name": "FP1",
              "threshold": 1
            }
          },
          "fp.isNull, fp.isEq, and fp.isZero": {
            "FPisEq": {
              "long_name": "Using isEq test",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/FPisEq.html",
              "mod_name": "FP1",
              "threshold": 1
            }
          }
        }
      },
      "PL/FP2": {
        "long_name": "Developing Basic, Recursive List-processing Functions",
        "sections": {
          "Recursive List Processing Example: sum( list )": {
            "FP2Code1CON": {
              "long_name": "Illustrate Simple Recursion On List To Return Numeric Value",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP2CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP2Code1CON.js"
              ],
              "mod_name": "FP2"
            },
            "RecListProc1": {
              "long_name": "Recursion on Flat lists 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/RecListProc1.html",
              "mod_name": "FP2",
              "threshold": 3
            }
          },
          "Recursive List Processing Example: isMember( num, list )": {
            "FP2Code2CON": {
              "long_name": "Illustrate Simple Recursion On List To Define IsMember",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP2CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP2Code2CON.js"
              ],
              "mod_name": "FP2"
            },
            "RecListProc2": {
              "long_name": "Recursion on Flat Lists 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/RecListProc2.html",
              "mod_name": "FP2",
              "threshold": 1
            }
          },
          "Recursive List Processing Example: subst( new, old, list )": {
            "FP2Code3CON": {
              "long_name": "Illustrate Simple Recursion On List To Do Substitution",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP2CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP2Code3CON.js"
              ],
              "mod_name": "FP2"
            },
            "RecListProc3": {
              "long_name": "Recursion on Flat Lists 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/RecListProc3.html",
              "mod_name": "FP2",
              "threshold": 1
            }
          }
        }
      },
      "PL/FP3": {
        "long_name": "Recurring On Lists That Aren't Flat",
        "sections": {
          "Deep Recursion in FP": {
            "FP3Code1CON": {
              "long_name": "Illustrate Deep Recursion On List To Return Numeric Value",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP3CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP3Code1CON.js"
              ],
              "mod_name": "FP3"
            },
            "DeepRecur1": {
              "long_name": "Deep Recursion 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/DeepRecur1.html",
              "mod_name": "FP3",
              "threshold": 1
            }
          },
          "Deep Recursion on Binary Search Trees": {
            "FP3Code2CON": {
              "long_name": "Illustrate Deep Recursion On BST",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP3CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP3Code2CON.js"
              ],
              "mod_name": "FP3"
            },
            "DeepRecur2": {
              "long_name": "Deep Recursion 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/DeepRecur2.html",
              "mod_name": "FP3",
              "threshold": 1
            }
          },
          "Practice with Deep Recursion": {
            "DeepRecur3": {
              "long_name": "Deep Recursion 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/DeepRecur3.html",
              "mod_name": "FP3",
              "threshold": 1
            }
          },
          "More Practice with Deep Recursion": {
            "DeepRecur4": {
              "long_name": "Deep Recursion 4",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/DeepRecur4.html",
              "mod_name": "FP3",
              "threshold": 3
            }
          }
        }
      },
      "PL/FP4": {
        "long_name": "Using Helper Functions with Accumulators",
        "sections": {
          "Using Helpers to Write reverse and split Functions": {
            "FP4Code1CON": {
              "long_name": "Illustrate Use of Accumulator in Developing Reverse Function",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP4CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP4Code1CON.js"
              ],
              "mod_name": "FP4"
            },
            "FP4Code2CON": {
              "long_name": "Illustrate Use of Accumulator in Developing Split Function",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP4CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP4Code2CON.js"
              ],
              "mod_name": "FP4"
            },
            "SplitAndJoin": {
              "long_name": "Split and Join with accumulators",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/SplitAndJoin.html",
              "mod_name": "FP4",
              "threshold": 1
            }
          },
          "Using the split Function to Develop a Sorting Function": {
            "QuickSort": {
              "long_name": "Using split to define quick sort",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/QuickSort.html",
              "mod_name": "FP4",
              "threshold": 1
            }
          },
          "Additional Practice with the Accumulator Pattern": {
            "AccumulatorPatternPractice": {
              "long_name": "Accumulator Pattern Practice",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/AccumulatorPatternPractice.html",
              "mod_name": "FP4",
              "threshold": 3
            }
          }
        }
      },
      "PL/FP5": {
        "long_name": "Scope, Closures, Higher-order Functions, Static vs. Dynamic Binding",
        "sections": {
          "Scope, Closures, Higher-order Functions": {
            "FP5Code1CON": {
              "long_name": "Illustrate Scope",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP5CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP5Code1CON.js"
              ],
              "mod_name": "FP5"
            },
            "FP5Code2CON": {
              "long_name": "Illustrate Variable Hoisting",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP5CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP5Code2CON.js"
              ],
              "mod_name": "FP5"
            },
            "FP5Code3CON": {
              "long_name": "Illustrate Nested Scopes",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP5CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP5Code3CON.js"
              ],
              "mod_name": "FP5"
            },
            "FP5Code4CON": {
              "long_name": "Illustrate Static vs Dynamic Binding",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP5CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP5Code4CON.js"
              ],
              "mod_name": "FP5"
            },
            "FP5Code5CON": {
              "long_name": "Illustrate Closures",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP5CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP5Code5CON.js"
              ],
              "mod_name": "FP5"
            },
            "HigherOrderFuncs1": {
              "long_name": "Higher Order Function 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/HigherOrderFuncs1.html",
              "mod_name": "FP5",
              "threshold": 3
            }
          },
          "Practice with Higher-order Functions and Anonymous Functions": {
            "HigherOrderFuncs2": {
              "long_name": "Higher Order Functions 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/HigherOrderFuncs2.html",
              "mod_name": "FP5",
              "threshold": 1
            }
          },
          "More Practice with Higher-order Functions and Anonymous Functions": {
            "HigherOrderFuncs3": {
              "long_name": "Higher Order Functions 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/HigherOrderFuncs3.html",
              "mod_name": "FP5",
              "threshold": 1
            }
          },
          "Practice with Static vs. Dynamic Binding Rules": {
            "StaticDynamic": {
              "long_name": "Static vs. Dynamic Binding",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/StaticDynamic.html",
              "mod_name": "FP5",
              "threshold": 1
            }
          }
        }
      },
      "PL/FP6": {
        "long_name": "Procedural Abstraction: Map, Curry, and Compose",
        "sections": {
          "The Mapping Pattern": {
            "FP6Code1CON": {
              "long_name": "Illustrate Mapping Pattern",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP6CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP6Code1CON.js"
              ],
              "mod_name": "FP6"
            },
            "Map": {
              "long_name": "Mapping Pattern",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Map.html",
              "mod_name": "FP6",
              "threshold": 1
            }
          },
          "Function Composition": {
            "FP6Code2CON": {
              "long_name": "Illustrate Function Composition",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP6CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP6Code2CON.js"
              ],
              "mod_name": "FP6"
            },
            "Compose": {
              "long_name": "Function Composition",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Compose.html",
              "mod_name": "FP6",
              "threshold": 1
            }
          },
          "Currying": {
            "FP6Code3CON": {
              "long_name": "Illustrate Currying",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP6CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP6Code3CON.js"
              ],
              "mod_name": "FP6"
            },
            "Curry1": {
              "long_name": "Curry and compose 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Curry1.html",
              "mod_name": "FP6",
              "threshold": 1
            }
          },
          "More currying": {
            "Curry2": {
              "long_name": "Curry and compose 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Curry2.html",
              "mod_name": "FP6",
              "threshold": 3
            }
          }
        }
      },
      "PL/FP7": {
        "long_name": "Procedural Abstraction: The Filtering and Folding (or Reduce) Patterns",
        "sections": {
          "The Filtering Pattern": {
            "FP7Code1CON": {
              "long_name": "Illustrate Filtering Pattern",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP7CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP7Code1CON.js"
              ],
              "mod_name": "FP7"
            },
            "Filter": {
              "long_name": "Filtering Pattern",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Filter.html",
              "mod_name": "FP7",
              "threshold": 1
            }
          },
          "The Folding/Reduce Pattern": {
            "FP7Code2CON": {
              "long_name": "Illustrate Reduce/Folding Pattern",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP7CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP7Code2CON.js"
              ],
              "mod_name": "FP7"
            },
            "FP7Code3CON": {
              "long_name": "Illustrate ReduceRight Pattern",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP7CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP7Code3CON.js"
              ],
              "mod_name": "FP7"
            },
            "Reduce1": {
              "long_name": "Reduce 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Reduce1.html",
              "mod_name": "FP7",
              "threshold": 1
            }
          },
          "Practice with the Mapping and Reduce Patterns": {
            "Reduce2": {
              "long_name": "Reduce and Map",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Reduce2.html",
              "mod_name": "FP7",
              "threshold": 1
            }
          },
          "More Practice with the Reduce Pattern": {
            "Reduce3": {
              "long_name": "Reduce 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Reduce3.html",
              "mod_name": "FP7",
              "threshold": 3
            }
          }
        }
      },
      "PL/FP8": {
        "long_name": "Combining Map and Reduce",
        "sections": {
          "The MapReduce Paradigm": {
            "FP8Code1CON": {
              "long_name": "Illustrate MapReduce Pattern",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP8CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP8Code1CON.js"
              ],
              "mod_name": "FP8"
            },
            "MapReduce": {
              "long_name": "Map Reduce",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/MapReduce.html",
              "mod_name": "FP8",
              "threshold": 3
            }
          }
        }
      },
      "PL/FP9": {
        "long_name": "Continuations and Continuation Passing",
        "sections": {
          "Tail recursive functions": {
            "TailRecursion": {
              "long_name": "Tail Recursion",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/TailRecursion.html",
              "mod_name": "FP9",
              "threshold": 1
            }
          },
          "Continuation-Passing Style": {
            "FP9Code1CON": {
              "long_name": "Illustrate Continuation Passing",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP9CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP9Code1CON.js"
              ],
              "mod_name": "FP9"
            },
            "FP9Code2CON": {
              "long_name": "Compare CPS with non-tail recursive and accumulation",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/FP/FP9CON.css"
              ],
              "scripts": [
                "AV/PL/FP/FP9Code2CON.js"
              ],
              "mod_name": "FP9"
            }
          },
          "Continuation-Passing Style Practice Problem (Part 1)": {
            "ContinuationPassing1": {
              "long_name": "CPS Style 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ContinuationPassing1.html",
              "mod_name": "FP9",
              "threshold": 1
            }
          },
          "Continuation-Passing Style Practice Problem (Part 2)": {
            "ContinuationPassing2": {
              "long_name": "CPS Style 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ContinuationPassing2.html",
              "mod_name": "FP9",
              "threshold": 1
            }
          },
          "Continuation-Passing Style Practice Problem (Part 3)": {
            "ContinuationPassing3": {
              "long_name": "CPS Style 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ContinuationPassing3.html",
              "mod_name": "FP9",
              "threshold": 1
            }
          },
          "More CPS Practice": {
            "ContinuationPassing4": {
              "long_name": "Randomized CPS practice",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ContinuationPassing4.html",
              "mod_name": "FP9",
              "threshold": 3
            }
          }
        }
      }
    },
    "Lambda Calculus": {
      "PL/Syntax": {
        "long_name": "Syntax of the Lambda Calculus",
        "sections": {
          "Lambda Calculus": {
            "parseTree": {
              "long_name": "Slide show for how to build a parse tree",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/AV/parseTree.css",
                "AV/PL/main.css"
              ],
              "scripts": [
                "AV/PL/AV/parseTree.js"
              ],
              "mod_name": "Syntax"
            }
          },
          "Practice with Lambda Calculus Syntax": {
            "LambdaCalcSyntax1": {
              "long_name": "Lambda Calc Syntax 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/LambdaCalcSyntax1.html",
              "mod_name": "Syntax",
              "threshold": 3
            }
          },
          "More Practice with Lambda Calculus Syntax": {
            "LambdaCalcSyntax2": {
              "long_name": "Lambda Calc Syntax 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/LambdaCalcSyntax2.html",
              "mod_name": "Syntax",
              "threshold": 3
            }
          }
        }
      },
      "PL/Semantics": {
        "long_name": "Semantics of the Lambda Calculus",
        "sections": {
          "Semantics of the Lambda Calculus": {},
          "Practice with Lambda Calculus Semantics": {
            "LambdaCalcSemantics": {
              "long_name": "Semantics of lambda calculus",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/LambdaCalcSemantics.html",
              "mod_name": "Semantics",
              "threshold": 1
            }
          }
        }
      },
      "PL/FreeBoundVariables": {
        "long_name": "Free and Bound Variables",
        "sections": {
          "Free and Bound Variables": {},
          "Identifying Free Variables": {
            "IdentifyingFreeVars": {
              "long_name": "Identifying Free Variables",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/IdentifyingFreeVars.html",
              "mod_name": "FreeBoundVariables",
              "threshold": 3
            }
          },
          "Identifying Bound Variables": {
            "IdentifyingBoundVars": {
              "long_name": "Identifying Bound Variables",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/IdentifyingBoundVars.html",
              "mod_name": "FreeBoundVariables",
              "threshold": 3
            }
          },
          "Formal Definition of Free Variables": {}
        }
      },
      "PL/AlphaConversion": {
        "long_name": "Alpha-Conversion",
        "sections": {
          "Alpha-Conversion Rule": {},
          "Practice with Alpha Conversion": {
            "AlphaConversionNew": {
              "long_name": "Alpha Conversion",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/AlphaConversionNew.html",
              "mod_name": "AlphaConversion",
              "threshold": 3
            }
          }
        }
      },
      "PL/Substitution": {
        "long_name": "The Substitution-Based Model of Evaluation",
        "sections": {
          "Substitution Algorithm": {},
          "Identifying Substitution Subcases of Case 1": {
            "SubstitutionCase1": {
              "long_name": "Identifying Substitution Subcases of Case 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/SubstitutionCase1.html",
              "mod_name": "Substitution",
              "threshold": 3
            }
          },
          "Identifying Substitution Subcases of Case 2": {
            "SubstitutionCase2": {
              "long_name": "Identifying Substitution Subcases of Case 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/SubstitutionCase2.html",
              "mod_name": "Substitution",
              "threshold": 3
            }
          },
          "Identifying Substitution Case 3": {
            "SubstitutionCase3": {
              "long_name": "Identifying Substitution Case 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/SubstitutionCase3.html",
              "mod_name": "Substitution",
              "threshold": 3
            }
          },
          "Identifying Substitution Cases and Subcases": {
            "Substitution1": {
              "long_name": "Identifying Substitution Cases and Subcases",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Substitution1.html",
              "mod_name": "Substitution",
              "threshold": 3
            }
          },
          "Performing the Substitution Algorithm": {
            "Substitution2": {
              "long_name": "Performing the full substitution algorithm",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Substitution2.html",
              "mod_name": "Substitution",
              "threshold": 3
            }
          }
        }
      },
      "PL/BetaReduction": {
        "long_name": "Beta-Reduction",
        "sections": {
          "Beta-Redexes": {},
          "Identifying Beta-Redexes": {
            "BetaRedex1": {
              "long_name": "Identifying Beta Redexes 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/BetaRedex1.html",
              "mod_name": "BetaReduction",
              "threshold": 3
            }
          },
          "Beta-Reduction is a Substitution": {},
          "Some Beta-Reductions Require Alpha-Conversion": {
            "BetaRedex2": {
              "long_name": "Identifying Beta Redexes 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/BetaRedex2.html",
              "mod_name": "BetaReduction",
              "threshold": 3
            }
          },
          "Performing Beta-Reductions": {
            "BetaReduction": {
              "long_name": "Performing Beta Reductions",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/BetaReduction.html",
              "mod_name": "BetaReduction",
              "threshold": 3
            }
          }
        }
      },
      "PL/ReductionStrategies": {
        "long_name": "Reduction Strategies",
        "sections": {
          "Applicative Order": {},
          "Normal Order": {
            "LCPractice": {
              "long_name": "LCPractice",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/PL/LCPractice.html",
              "mod_name": "ReductionStrategies",
              "threshold": 1
            }
          },
          "Beta-Reduction Order (1)": {
            "BetaReductionOrder1": {
              "long_name": "Beta Reduction Order 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/BetaReductionOrder1.html",
              "mod_name": "ReductionStrategies",
              "threshold": 3
            }
          },
          "Beta-Reduction Order (2)": {
            "BetaReductionOrder2": {
              "long_name": "Beta Reduction Order 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/BetaReductionOrder2.html",
              "mod_name": "ReductionStrategies",
              "threshold": 3
            }
          },
          "Applicative Order Proficiency Exercise": {
            "applicativeOrderPRO": {
              "long_name": "Applicative-order reduction Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/PL/applicativeOrderPRO.html",
              "mod_name": "ReductionStrategies",
              "threshold": 1.0
            }
          },
          "Normal Order Proficiency Exercise": {
            "tempNormalOrderPRO": {
              "long_name": "Normal-order reduction Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/PL/tempNormalOrderPRO.html",
              "mod_name": "ReductionStrategies",
              "threshold": 1.0
            }
          }
        }
      },
      "PL/ChurchNumerals": {
        "long_name": "Church Numerals and Booleans",
        "sections": {
          "Church Booleans": {
            "church_boolCON": {
              "long_name": "Church boolean slide show",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/AV/church_string.css"
              ],
              "scripts": [
                "AV/PL/AV/church_boolCON.js"
              ],
              "mod_name": "ChurchNumerals"
            }
          },
          "Encoding If-Then-Else": {
            "ChurchIfThen": {
              "long_name": "If Then Else in Church Encoding",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ChurchIfThen.html",
              "mod_name": "ChurchNumerals",
              "threshold": 1
            }
          },
          "Encoding OR": {
            "ChurchOR": {
              "long_name": "Church Encoding for OR",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ChurchOR.html",
              "mod_name": "ChurchNumerals",
              "threshold": 1
            }
          },
          "Church Numerals": {
            "church_numeralCON": {
              "long_name": "Church numeral slide show",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/AV/church_string.css"
              ],
              "scripts": [
                "AV/PL/AV/church_numeralCON.js"
              ],
              "mod_name": "ChurchNumerals"
            },
            "church_multCON": {
              "long_name": "Church multiplication slide show",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/AV/church_string.css"
              ],
              "scripts": [
                "AV/PL/AV/church_multCON.js"
              ],
              "mod_name": "ChurchNumerals"
            }
          },
          "Church Numerals with Addition and Multiplication": {
            "ChurchNumerals": {
              "long_name": "Church Numerals",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ChurchNumerals.html",
              "mod_name": "ChurchNumerals",
              "threshold": 3
            }
          }
        }
      },
      "PL/RecursiveFunctions": {
        "long_name": "Recursive Functions",
        "sections": {
          "Fixed-points of Functions": {},
          "The Y Fixed-point Combinator": {},
          "Using Y to Implement Factorial": {},
          "Identifying Fixed Point Combinators": {
            "FixedPointCombinators": {
              "long_name": "Identifying Fixed Point Combinators",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/FixedPointCombinators.html",
              "mod_name": "RecursiveFunctions",
              "threshold": 3
            }
          }
        }
      }
    },
    "Interpreting the Functional Language SLang 1": {
      "PL/SLang1": {
        "long_name": "Defining SLang 1",
        "sections": {
          "Syntax of SLang 1": {},
          "Concrete Syntax of SLang 1": {
            "ConcreteSynSLang1_new": {
              "long_name": "SLang 1 Concrete Syntax",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ConcreteSynSLang1_new.html",
              "mod_name": "SLang1",
              "threshold": 3
            }
          },
          "More Practice with the Concrete Syntax of SLang 1": {
            "ConcreteSynSLang1": {
              "long_name": "More SLang 1 Concrete Syntax",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/ConcreteSynSLang1.html",
              "mod_name": "SLang1",
              "threshold": 3
            }
          },
          "Abstract Syntax of SLang 1": {
            "AbstractSynSLang1": {
              "long_name": "SLang 1 Abstract Syntax",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/AbstractSynSLang1.html",
              "mod_name": "SLang1",
              "threshold": 3
            }
          },
          "Curry in SLang 1": {
            "CurryInSLang1": {
              "long_name": "Curry in SLang 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CurryInSLang1.html",
              "mod_name": "SLang1",
              "threshold": 3
            }
          },
          "Semantics of SLang 1": {
            "SemanticsSLang1": {
              "long_name": "SLang 1 Semantics",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/SemanticsSLang1.html",
              "mod_name": "SLang1",
              "threshold": 3
            }
          }
        }
      },
      "PL/Environment": {
        "long_name": "Environment-based Model of Evaluation",
        "sections": {
          "Environment Data Structure": {},
          "Determining Values Bound to a Variable": {
            "Environment1": {
              "long_name": "Determine values bound to a variable in environment",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Environment1.html",
              "mod_name": "Environment",
              "threshold": 3
            }
          },
          "Evaluation of Expression Within an Environment": {
            "Environment2": {
              "long_name": "Expression Evaluation within Environment",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Environment2.html",
              "mod_name": "Environment",
              "threshold": 3
            }
          },
          "Determining Denoted Values in SLang 1": {
            "Environment3": {
              "long_name": "Denoted Values in SLang 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Environment3.html",
              "mod_name": "Environment",
              "threshold": 3
            }
          }
        }
      },
      "PL/SLang1withLetExpressions": {
        "long_name": "Let Expressions",
        "sections": {
          "Let Blocks": {},
          "Let Blocks As Syntactic Sugar": {
            "LetSynSugar": {
              "long_name": "Let As Syntactic Sugar",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/LetSynSugar.html",
              "mod_name": "SLang1withLetExpressions",
              "threshold": 3
            }
          },
          "Nested Lets": {
            "LetNested": {
              "long_name": "Nested Lets",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/LetNested.html",
              "mod_name": "SLang1withLetExpressions",
              "threshold": 3
            }
          },
          "Nested Lets with Closures": {
            "LetNestedWithClosures": {
              "long_name": "Nested Lets with Closures",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/LetNestedWithClosures.html",
              "mod_name": "SLang1withLetExpressions",
              "threshold": 3
            }
          }
        }
      }
    },
    "Interpreting the Imperative Language SLang 2": {
      "PL/SLang2": {
        "long_name": "Defining SLang 2",
        "sections": {
          "SLang 2: An Imperative Language": {},
          "Output of SLang 2 Program": {
            "OutputOfSLang2Prog": {
              "long_name": "Output of SLang 2 Program",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/OutputOfSLang2Prog.html",
              "mod_name": "SLang2",
              "threshold": 3
            }
          }
        }
      },
      "PL/SLang2TTK": {
        "long_name": "Tying The Knot",
        "sections": {
          "Implementing Recursion Efficiently": {},
          "Practice TTK": {
            "TyingTheKnot": {
              "long_name": "Tying the Knot",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/TyingTheKnot.html",
              "mod_name": "SLang2TTK",
              "threshold": 3
            }
          }
        }
      }
    },
    "Variations on Parameter Passing": {
      "PL/SLang2ParameterPassing": {
        "long_name": "Parameter-Passing Mechanisms",
        "sections": {
          "Call By Value vs. Call By Reference": {
            "paramPassingByVal": {
              "long_name": "paramPassingByVal",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/PL/paramPassingByVal.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1
            },
            "paramPassingByValPRO": {
              "long_name": "Pass-by-value Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/PL/paramPassingByValPRO.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1.0
            },
            "paramPassingByRef": {
              "long_name": "paramPassingByRef",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/PL/paramPassingByRef.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1
            },
            "paramPassingByRefPRO": {
              "long_name": "Pass-by-reference Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/PL/paramPassingByRefPRO.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1.0
            },
            "CallByValVsRef": {
              "long_name": "Call By Value Vs Reference",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CallByValVsRef.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 3
            }
          },
          "Copy-Restore": {
            "paramPassingCopyRestore": {
              "long_name": "Copy Restore Slide Show",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/PL/paramPassingCopyRestore.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1
            },
            "paramPassingCopyRestorePRO": {
              "long_name": "Copy-restore Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/PL/paramPassingCopyRestorePRO.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1.0
            },
            "CallByValVsRefVsCR": {
              "long_name": "Call By Value vs Reference vs CR",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CallByValVsRefVsCR.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 3
            }
          },
          "Macro Expansion": {
            "paramPassingMacro": {
              "long_name": "Macro Slide Show",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/PL/paramPassingMacro.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1
            },
            "paramPassingMacroPRO": {
              "long_name": "Macro Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/PL/paramPassingMacroPRO.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1.0
            },
            "CallByRefVsCRVsMacro": {
              "long_name": "Ref vs CR vs Macro",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CallByRefVsCRVsMacro.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 3
            }
          },
          "Call By Name": {
            "paramPassingByName": {
              "long_name": "By-name Slide Show",
              "required": false,
              "points": 0.0,
              "type": "ss",
              "av_address": "AV/PL/paramPassingByName.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1
            },
            "paramPassingByNamePRO": {
              "long_name": "ByName Proficiency Exercise",
              "required": true,
              "points": 2.0,
              "type": "pe",
              "av_address": "AV/PL/paramPassingByNamePRO.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 1.0
            },
            "CallByCRVsMacroVsName": {
              "long_name": "ByCR vs ByMacro vs ByName",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CallByCRVsMacroVsName.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 3
            }
          },
          "Comprehensive Review of the Five Methods Studied So Far": {
            "CallByAllFive": {
              "long_name": "ByVal, ByRef, ByCR, ByMacro, ByName",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/CallByAllFive.html",
              "mod_name": "SLang2ParameterPassing",
              "threshold": 3
            }
          }
        }
      },
      "PL/LazyLists": {
        "long_name": "Lazy Lists",
        "sections": {
          "Infinite Sequences": {
            "LazyLists1CON": {
              "long_name": "Illustrate Basic Lazy List Operations",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists1CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "LazyLists2CON": {
              "long_name": "Illustrate from operation in is module",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists2CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "LazyLists3CON": {
              "long_name": "Illustrate map operation in is module",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists3CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "LazyLists4CON": {
              "long_name": "Illustrate filter operation in is module",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists4CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "LazyLists5CON": {
              "long_name": "Illustrate drop operation in is module",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists5CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "LazyLists6CON": {
              "long_name": "Illustrate iterates operation in is module",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists6CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "LazyLists7CON": {
              "long_name": "Illustrate sieve of Erastosthenes with eager evaluation",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists7CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "LazyLists8CON": {
              "long_name": "Illustrate sieve of Erastosthenes with lazy evaluation",
              "required": false,
              "points": 0.0,
              "threshold": 1.0,
              "type": "ss",
              "links": [
                "AV/PL/LazyLists/LazyListsCON.css"
              ],
              "scripts": [
                "AV/PL/LazyLists/LazyLists8CON.js"
              ],
              "mod_name": "LazyLists"
            },
            "InfSeq1": {
              "long_name": "Matching sequence to code that produced it",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/InfSeq1.html",
              "mod_name": "LazyLists",
              "threshold": 3
            }
          },
          "Practice With Infinite Sequences": {
            "InfSeq2": {
              "long_name": "RP set #32, question #2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/InfSeq2.html",
              "mod_name": "LazyLists",
              "threshold": 3
            }
          },
          "Practice With Infinite Sequences (2)": {
            "InfSeq3": {
              "long_name": "Matching sequence to code that produced it (2)",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/InfSeq3.html",
              "mod_name": "LazyLists",
              "threshold": 3
            }
          },
          "Practice With Infinite Sequences (3)": {
            "InfSeq4": {
              "long_name": "Matching sequence to code that produced it (3)",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/InfSeq4.html",
              "mod_name": "LazyLists",
              "threshold": 3
            }
          }
        }
      }
    },
    "Type Systems": {
      "PL/TypeSystems": {
        "long_name": "Types in Programming Languages",
        "sections": {
          "Motivating Examples": {},
          "Type System: Definition": {},
          "Type System: Static Versus  Dynamic": {},
          "Type System: Safe Versus Unsafe": {},
          "Type System: Strong Versus Weak": {},
          "Type System: Typed Variables or Values": {},
          "Type System: Explicit Versus Implicit typing": {},
          "The Many Uses of Type Systems": {}
        }
      },
      "PL/TypeInference": {
        "long_name": "Type Inference",
        "sections": {
          "Type Environments": {},
          "Typing Rules Expressed as Post Systems": {},
          "Typing in a Scaled-down ML": {},
          "Using Post System Rules to Describe Type Inferencing in ML": {},
          "Parametric Polymorphism in ML": {},
          "Type inferencing in ML": {},
          "Type Inferencing Problem 1": {
            "Typing1": {
              "long_name": "ML type inferencing 1",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Typing1.html",
              "mod_name": "TypeInference",
              "threshold": 3
            }
          },
          "Type Inferencing Problem 2": {
            "Typing2": {
              "long_name": "ML type inferencing 2",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Typing2.html",
              "mod_name": "TypeInference",
              "threshold": 3
            }
          },
          "Type Inferencing Problem 3": {
            "Typing3": {
              "long_name": "ML type inferencing 3",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Typing3.html",
              "mod_name": "TypeInference",
              "threshold": 3
            }
          },
          "Type Inferencing Problem 4": {
            "Typing4": {
              "long_name": "ML type inferencing 4",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Typing4.html",
              "mod_name": "TypeInference",
              "threshold": 3
            }
          },
          "Type Inferencing Problem 5": {
            "Typing5": {
              "long_name": "ML type inferencing 5",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Typing5.html",
              "mod_name": "TypeInference",
              "threshold": 3
            }
          },
          "Type Inferencing Problem 6": {
            "Typing6": {
              "long_name": "ML type inferencing 6",
              "required": true,
              "points": 1.0,
              "type": "ka",
              "av_address": "Exercises/PL/Typing6.html",
              "mod_name": "TypeInference",
              "threshold": 3
            }
          }
        }
      }
    },
    "Appendices": {
      "PL/PL_Glossary": {
        "long_name": "GLOSSARY",
        "sections": {}
      }
    }
  }
}