From e966ab1e3ceab475eff8475ebea5d9e42ba9bbc7 Mon Sep 17 00:00:00 2001 From: nvitucci Date: Sun, 18 Apr 2021 18:35:20 +0100 Subject: [PATCH 1/2] First pass --- doc/sphinx/Makefile | 20 + doc/sphinx/make.bat | 35 + doc/sphinx/source/PyCon2008-paper.rst | 598 ++++++++++++++++++ .../source/about_pyke/cooking_functions.rst | 160 +++++ doc/sphinx/source/about_pyke/index.rst | 144 +++++ .../source/about_pyke/installing_pyke.rst | 186 ++++++ .../source/about_pyke/modifying_pyke.rst | 283 +++++++++ .../source/about_pyke/steps_to_using_pyke.rst | 87 +++ doc/sphinx/source/about_pyke/what_is_pyke.rst | 99 +++ doc/sphinx/source/conf.py | 58 ++ doc/sphinx/source/copyright_license | 22 + doc/sphinx/source/examples.rst | 164 +++++ .../source/images/PyCon2008/bc_rules2.png | Bin 0 -> 35640 bytes .../source/images/PyCon2008/bc_rules5.png | Bin 0 -> 36522 bytes .../source/images/PyCon2008/bc_rules8.png | Bin 0 -> 38384 bytes .../source/images/PyCon2008/bc_rules9.png | Bin 0 -> 46704 bytes .../source/images/PyCon2008/client1.png | Bin 0 -> 15313 bytes .../source/images/PyCon2008/client2b.png | Bin 0 -> 29020 bytes .../source/images/PyCon2008/client2d.png | Bin 0 -> 29533 bytes .../source/images/PyCon2008/client3d.png | Bin 0 -> 48857 bytes .../source/images/PyCon2008/client3e.png | Bin 0 -> 49292 bytes .../source/images/PyCon2008/client3f2.png | Bin 0 -> 53765 bytes .../source/images/PyCon2008/client3g.png | Bin 0 -> 50533 bytes .../source/images/PyCon2008/client3h.png | Bin 0 -> 54626 bytes doc/sphinx/source/images/backtracking.dia | Bin 0 -> 2103 bytes doc/sphinx/source/images/backtracking.png | Bin 0 -> 27401 bytes doc/sphinx/source/images/bc_backtracking.dia | Bin 0 -> 3149 bytes doc/sphinx/source/images/bc_backtracking.png | Bin 0 -> 40243 bytes doc/sphinx/source/images/bc_rules.dia | Bin 0 -> 2845 bytes doc/sphinx/source/images/bc_rules.png | Bin 0 -> 48682 bytes doc/sphinx/source/images/header.gif | Bin 0 -> 13991 bytes doc/sphinx/source/images/plan1.dia | Bin 0 -> 1066 bytes doc/sphinx/source/images/plan1.png | Bin 0 -> 3893 bytes doc/sphinx/source/images/plan2.dia | Bin 0 -> 1200 bytes doc/sphinx/source/images/plan2.png | Bin 0 -> 5564 bytes doc/sphinx/source/images/plan3.dia | Bin 0 -> 1297 bytes doc/sphinx/source/images/plan3.png | Bin 0 -> 7457 bytes .../source/images/rule_base_categories.dia | Bin 0 -> 2493 bytes .../source/images/rule_base_categories.png | Bin 0 -> 23617 bytes doc/sphinx/source/index.rst | 100 +++ .../source/knowledge_bases/fact_bases.rst | 78 +++ doc/sphinx/source/knowledge_bases/index.rst | 105 +++ .../source/knowledge_bases/question_bases.rst | 130 ++++ .../source/knowledge_bases/rule_bases.rst | 243 +++++++ doc/sphinx/source/knowledge_bases/special.rst | 250 ++++++++ doc/sphinx/source/links.rst | 188 ++++++ doc/sphinx/source/logic_programming/index.rst | 54 ++ .../pattern_matching/index.rst | 78 +++ .../pattern_matching/literal_patterns.rst | 47 ++ .../pattern_matching/matching_patterns.rst | 108 ++++ .../pattern_matching/pathological_answer.rst | 97 +++ .../pattern_matching/pattern_variables.rst | 125 ++++ .../pattern_matching/tuple_patterns.rst | 60 ++ doc/sphinx/source/logic_programming/plans.rst | 259 ++++++++ .../rules/backward_chaining.rst | 268 ++++++++ .../rules/forward_chaining.rst | 403 ++++++++++++ .../source/logic_programming/rules/index.rst | 140 ++++ .../source/logic_programming/statements.rst | 166 +++++ doc/sphinx/source/pyke_syntax/index.rst | 138 ++++ doc/sphinx/source/pyke_syntax/kfb_syntax.rst | 75 +++ doc/sphinx/source/pyke_syntax/kqb_syntax.rst | 512 +++++++++++++++ .../source/pyke_syntax/krb_syntax/bc_rule.rst | 216 +++++++ .../krb_syntax/compound_premise.rst | 288 +++++++++ .../source/pyke_syntax/krb_syntax/fc_rule.rst | 88 +++ .../source/pyke_syntax/krb_syntax/index.rst | 129 ++++ .../source/pyke_syntax/krb_syntax/pattern.rst | 75 +++ .../pyke_syntax/krb_syntax/python_premise.rst | 122 ++++ doc/sphinx/source/using_pyke/adding_facts.rst | 88 +++ .../source/using_pyke/creating_engine.rst | 150 +++++ doc/sphinx/source/using_pyke/index.rst | 164 +++++ .../source/using_pyke/other_functions.rst | 147 +++++ .../source/using_pyke/proving_goals.rst | 119 ++++ 72 files changed, 7066 insertions(+) create mode 100644 doc/sphinx/Makefile create mode 100644 doc/sphinx/make.bat create mode 100644 doc/sphinx/source/PyCon2008-paper.rst create mode 100644 doc/sphinx/source/about_pyke/cooking_functions.rst create mode 100644 doc/sphinx/source/about_pyke/index.rst create mode 100644 doc/sphinx/source/about_pyke/installing_pyke.rst create mode 100644 doc/sphinx/source/about_pyke/modifying_pyke.rst create mode 100644 doc/sphinx/source/about_pyke/steps_to_using_pyke.rst create mode 100644 doc/sphinx/source/about_pyke/what_is_pyke.rst create mode 100644 doc/sphinx/source/conf.py create mode 100644 doc/sphinx/source/copyright_license create mode 100644 doc/sphinx/source/examples.rst create mode 100644 doc/sphinx/source/images/PyCon2008/bc_rules2.png create mode 100644 doc/sphinx/source/images/PyCon2008/bc_rules5.png create mode 100644 doc/sphinx/source/images/PyCon2008/bc_rules8.png create mode 100644 doc/sphinx/source/images/PyCon2008/bc_rules9.png create mode 100644 doc/sphinx/source/images/PyCon2008/client1.png create mode 100644 doc/sphinx/source/images/PyCon2008/client2b.png create mode 100644 doc/sphinx/source/images/PyCon2008/client2d.png create mode 100644 doc/sphinx/source/images/PyCon2008/client3d.png create mode 100644 doc/sphinx/source/images/PyCon2008/client3e.png create mode 100644 doc/sphinx/source/images/PyCon2008/client3f2.png create mode 100644 doc/sphinx/source/images/PyCon2008/client3g.png create mode 100644 doc/sphinx/source/images/PyCon2008/client3h.png create mode 100644 doc/sphinx/source/images/backtracking.dia create mode 100644 doc/sphinx/source/images/backtracking.png create mode 100644 doc/sphinx/source/images/bc_backtracking.dia create mode 100644 doc/sphinx/source/images/bc_backtracking.png create mode 100644 doc/sphinx/source/images/bc_rules.dia create mode 100644 doc/sphinx/source/images/bc_rules.png create mode 100644 doc/sphinx/source/images/header.gif create mode 100644 doc/sphinx/source/images/plan1.dia create mode 100644 doc/sphinx/source/images/plan1.png create mode 100644 doc/sphinx/source/images/plan2.dia create mode 100644 doc/sphinx/source/images/plan2.png create mode 100644 doc/sphinx/source/images/plan3.dia create mode 100644 doc/sphinx/source/images/plan3.png create mode 100644 doc/sphinx/source/images/rule_base_categories.dia create mode 100644 doc/sphinx/source/images/rule_base_categories.png create mode 100644 doc/sphinx/source/index.rst create mode 100644 doc/sphinx/source/knowledge_bases/fact_bases.rst create mode 100644 doc/sphinx/source/knowledge_bases/index.rst create mode 100644 doc/sphinx/source/knowledge_bases/question_bases.rst create mode 100644 doc/sphinx/source/knowledge_bases/rule_bases.rst create mode 100644 doc/sphinx/source/knowledge_bases/special.rst create mode 100644 doc/sphinx/source/links.rst create mode 100644 doc/sphinx/source/logic_programming/index.rst create mode 100644 doc/sphinx/source/logic_programming/pattern_matching/index.rst create mode 100644 doc/sphinx/source/logic_programming/pattern_matching/literal_patterns.rst create mode 100644 doc/sphinx/source/logic_programming/pattern_matching/matching_patterns.rst create mode 100644 doc/sphinx/source/logic_programming/pattern_matching/pathological_answer.rst create mode 100644 doc/sphinx/source/logic_programming/pattern_matching/pattern_variables.rst create mode 100644 doc/sphinx/source/logic_programming/pattern_matching/tuple_patterns.rst create mode 100644 doc/sphinx/source/logic_programming/plans.rst create mode 100644 doc/sphinx/source/logic_programming/rules/backward_chaining.rst create mode 100644 doc/sphinx/source/logic_programming/rules/forward_chaining.rst create mode 100644 doc/sphinx/source/logic_programming/rules/index.rst create mode 100644 doc/sphinx/source/logic_programming/statements.rst create mode 100644 doc/sphinx/source/pyke_syntax/index.rst create mode 100644 doc/sphinx/source/pyke_syntax/kfb_syntax.rst create mode 100644 doc/sphinx/source/pyke_syntax/kqb_syntax.rst create mode 100644 doc/sphinx/source/pyke_syntax/krb_syntax/bc_rule.rst create mode 100644 doc/sphinx/source/pyke_syntax/krb_syntax/compound_premise.rst create mode 100644 doc/sphinx/source/pyke_syntax/krb_syntax/fc_rule.rst create mode 100644 doc/sphinx/source/pyke_syntax/krb_syntax/index.rst create mode 100644 doc/sphinx/source/pyke_syntax/krb_syntax/pattern.rst create mode 100644 doc/sphinx/source/pyke_syntax/krb_syntax/python_premise.rst create mode 100644 doc/sphinx/source/using_pyke/adding_facts.rst create mode 100644 doc/sphinx/source/using_pyke/creating_engine.rst create mode 100644 doc/sphinx/source/using_pyke/index.rst create mode 100644 doc/sphinx/source/using_pyke/other_functions.rst create mode 100644 doc/sphinx/source/using_pyke/proving_goals.rst diff --git a/doc/sphinx/Makefile b/doc/sphinx/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/doc/sphinx/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/doc/sphinx/make.bat b/doc/sphinx/make.bat new file mode 100644 index 0000000..9534b01 --- /dev/null +++ b/doc/sphinx/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/doc/sphinx/source/PyCon2008-paper.rst b/doc/sphinx/source/PyCon2008-paper.rst new file mode 100644 index 0000000..1037e18 --- /dev/null +++ b/doc/sphinx/source/PyCon2008-paper.rst @@ -0,0 +1,598 @@ +.. $Id: PyCon2008-paper.txt 057d79259b20 2009-05-14 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +========================================================================= +Applying Expert System Technology to Code Reuse with Pyke +========================================================================= +----------------------------- +PyCon 2008, Chicago +----------------------------- + +.. |bullet| unicode:: U+02022 +.. |copy| unicode:: U+000A9 + +:Author: Bruce Frederiksen +:Date: Fri, 14 Mar 2008 +:Web: pyke.sourceforge.net +:Copyright: |copy| 2008, Bruce Frederiksen + +Abstract +========= + +This paper explores a new approach to code reuse using a backward-chaining +rule-based system, similar to prolog, to generate a function call graph *before* +the functions are called. This is compared with current solutions which build +the call graph *as* the functions are called. + +This approach is introduced through an open source project called Pyke (Python +Knowledge Engine). + +Finally, the initial results show that the utility of this approach far +exceeds expectations; leading to something more akin to automatic +programming rather than adaptable libraries. A call for help is given to +explore the capabilities of this approach across different domains. + +.. contents:: + +The Thinking that Led to Pyke +============================= + +The Need for Code Reuse +~~~~~~~~~~~~~~~~~~~~~~~ + +At one of my contracting jobs, they had many clients running essentially the +same program, but each client needed minor code modifications. Their objective +was to maximize code reuse. + +What is Code Reuse? +~~~~~~~~~~~~~~~~~~~~~ + +The first question is what does "code reuse" mean? And the answer that seems +most logical is *function* reuse. Where code modifications are required, a +new function can be created incorporating those modifications. + +Then the remaining task is to bring the proper collection of functions +together for each client. + +This gets more complicated as several versions of many functions will be +produced for various clients that are all available for reuse by the next +client. So it's not simply the case that there will be one standard default +version of each function, and then several one-off customized versions that +each only apply to a single client. + +The result of this function combination exercise is a function call graph. + +Example 1 +--------- + +Let us imagine that we start out with two functions for client1: + + .. image:: images/PyCon2008/client1.png + :scale: 60 + +And then client2 comes along. + +Let us first suppose that we need a new version of function A, but can reuse +function B\ :sub:`1`: + + .. image:: images/PyCon2008/client2b.png + :scale: 60 + +This is easy in any programming language and leads naturally to the idea that +the functions to reuse are the lower-level ones, which can be placed into +libraries. + +But now let us suppose the opposite; that we need a new version of function B, +but can reuse function A\ :sub:`1`: + + .. image:: images/PyCon2008/client2d.png + :scale: 60 + +This is where we need help. + +Current Solutions +--------------------- + +The current solutions are all run-time solutions that trap the call from +function A\ :sub:`1` to some function B and figure out which function B to use +when the call is made. For example: + +* O-O Dynamic Binding +* Zope Adapters +* Generic Functions + +Current Solution Limitations +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +These solutions are all limited for the same reason. Let's look at another +example to see why. + +Example 2 +---------- + +Real world programs have many more than two functions, but we can start to see +the limitations of the current solutions by looking at a three function +example. + +We start with one client and three functions. + +When client2 was added, it could only share function A\ :sub:`1` and had to +have a new B (B\ :sub:`2`) that needs a new function with a different call +interface than C, so we'll call it D\ :sub:`1`. + +Then along comes client3. This time things are looking up, because all we +need is a new version of function D: + + .. image:: images/PyCon2008/client3d.png + :scale: 60 + +Now let's see what happens when we want to call the program for client3. We +know we need to start with function A\ :sub:`1`, since there is only version of +function A: + + .. image:: images/PyCon2008/client3e.png + :scale: 60 + +But at this point we have two choices for function B. All we know for client3 +is that we're supposed to use function D\ :sub:`2`, so we're left to guess about +function B. So we try the first one, function B\ :sub:`1`: + + .. image:: images/PyCon2008/client3f2.png + :scale: 60 + +It's not until function B\ :sub:`1` tries to call some function C that we +discover a problem. + +This is where the current solutions break down. + +Certainly for this example, it is easy to imagine a developer telling the +binding system: oh yea and client3 is going to have to use function B\ :sub:`2` +as well. But more realistic call graphs are much more complicated than this; +so the developer would have to specify which functions to use going back many +levels. + +And then when there is a change in these upper level shared functions later on, +it will affect the call graphs for many clients. + +So the current solutions don't scale well. + +Continuing on with our example; what we need to do at this point is back up +and try the other B function: + + .. image:: images/PyCon2008/client3g.png + :scale: 60 + +After doing this, we discover the solution for the final call graph: + + .. image:: images/PyCon2008/client3h.png + :scale: 60 + +What's Needed +------------------- + +By looking at this example, we discover two things about how to solve +this problem: + +#. Do function selection **prior** to calling any of the functions. + + We can't wait until one function calls another to figure out what to do, + because we may change our minds! + +#. Use a standard backward-chaining rule-based algorithm. + + The process of first trying function B\ :sub:`1`, then backing up and trying + function B\ :sub:`2` is exactly the process used in backward-chaining + rule-based systems like prolog. They call it *backtracking*. + +Applying Backward-Chaining to Code Reuse +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The next question is how do we use a backward-chaining system to produce +function call graphs? + +Let's examine, conceptually, what a set of backward-chaining rules would look +like to find a solution to this problem. Then we can determine how to turn +this into a function call graph. + +The following diagram shows *goals* as dotted line boxes around the *rules* +that prove that goal. In this example, some goals only have one rule and some +have two. + +We also see how *rules* link to other *goals*. For example, rule ``Use B1`` and +rule ``Use B2`` both prove the same goal: ``Find B``. But ``Use B1`` links to +the ``Find C`` goal, while ``Use B2`` links to ``Find D``. + + .. image:: images/PyCon2008/bc_rules2.png + :scale: 60 + +Now we can follow how these rules would be run by the knowledge engine: + +* The whole process is kicked off by asking the knowledge engine for a + solution to ``Find A``. +* There is only one rule for ``Find A``: ``Use A1``, so the knowledge engine + tries this rule. +* ``Use A1`` needs a solution to ``Find B``. +* The knowledge engine tries the first rule for ``Find B``: ``Use B1``. +* ``Use B1`` needs a solution to ``Find C``. +* The knowledge engine tries the only rule for ``Find C``: + ``Use C1``, which fails for client3! + +The situation now looks like: + + .. image:: images/PyCon2008/bc_rules5.png + :scale: 60 + +Continuing on: + +* Since there are no other rules for ``Find C``, the ``Find C`` goal fails. +* Which means that the ``Use B1`` rule fails. +* So the knowledge engine tries the next rule for ``Find B``: ``Use B2``. +* ``Use B2`` needs a solution for ``Find D``. +* The knowledge engine tries the first rule for ``Find D``: ``Use D1``, + which fails for client3. +* The knowledge engine tries the next rule for ``Find D``: ``Use D2``, + which succeeds for client3! +* The ``Find D`` goal succeeds. +* The ``Find B`` goal succeeds. +* And the ``Find A`` goal succeeds. + +When we achieve final success, we have the following situation: + + .. image:: images/PyCon2008/bc_rules8.png + :scale: 60 + +What remains is to translate this into a function call graph. + +It becomes obvious that we want to attach our python functions directly to the +backward-chaining rules: + + .. image:: images/PyCon2008/bc_rules9.png + :scale: 60 + +Pyke +===== + +Pyke KRB Syntax +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +How does all of this look in Pyke? + +Pyke has its own language for rules, which it compiles into python source +modules and then imports. This gives a performance boost by circumventing +nearly all of the inference engine interpretation logic. It also makes it +very easy to embed short python code snippets directly within the rules to +help out with the inferencing. This keeps the inference mechanism simpler as +it does not have to deal with things that are already easy in a procedural +language (like arithmetic and simple list manipulation). + +The Pyke rule source files are called *knowledge rule bases* and have a +``.krb`` suffix. + +We'll continue with the previous example here. + +First, let's look at the rules before we attach the python functions. +Here's three of the rules:: + + use_B2 + use find_B($client) + when + check_function($client, B, 2) + find_D($client) + + use_D1 + use find_D($client) + when + check_function($client, D, 1) + + use_D2 + use find_D($client) + when + check_function($client, D, 2) + +Note that Pyke uses a ``$`` to indicate pattern variables (anonymous pattern +variables start with ``$_``). + +The ``check_function`` goal checks to see what version of the indicated +function should be used for this client. If this is the incorrect version, +it fails. If there is no indication for this function, it succeeds to +allow guessing. + +Attaching Python Functions to Backward-Chaining Rules +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Here are the last two rules with the python code added. The rules have the +python function attached to them so that the function can be returned from +the goal as an additional parameter. Because this parameter does not affect +the inferencing process, it is a hidden parameter. + +These examples just show one line of python code, but you may have as many +lines as you want:: + + use_D1 + use find_D($client) + when + check_function($client, D, 1) + with + print "D1" + + use_D2 + use find_D($client) + when + check_function($client, D, 2) + with + print "D2" + +Pyke calls the function call graphs *plans*. This terms applies to both the +final top-level call graph, as well as intermediate call graphs. + +Calling Subordinate Plans +--------------------------- + +Now we do the same thing to add python code to the ``use_B2`` rule:: + + use_B2 + use find_B($client) + when + check_function($client, B, 2) + find_D($client) + with + print "B2" + +We have code for the B\ :sub:`2` function, but how does it call the plan +returned from the ``find_D`` goal? + +The most common way is:: + + use_B2 + use find_B($client) + when + check_function($client, B, 2) + find_D($client) + $$() + with + print "B2" + +In general, there may be many goals in the ``when`` clause that produce plans. +Each would have an indented line of python code under it with ``$$`` +indicating the subordinate function. These indented lines are combined with +the lines in the ``with`` clause to form the complete python function for this +rule (with the differences in indenting levels corrected). + +But in this case, this would mean that ``print "Dx"`` would be executed before +``print "B2"``, which seems backwards. + +To call the subordinate plan within the ``with`` clause, there is an alternate +mechanism:: + + use_B2 + use find_B($client) + when + check_function($client, B, 2) + find_D($client) as $d + with + print "B2" + $d() + +The ``as $d`` clause stores the plan function in pattern variable ``$d`` rather +than adding a call to it to the ``with`` clause. Then you can decide in the +``with`` clause whether to call it, when to call it, how many times to call it, +etc. + +Note that pattern variables in general can be used within the python code. +These are replaced by their final bound values (as constants) after the +top-level goal has been proven. Thus, the rules can also be used to determine +and set constant values within the plan functions to further customize the +code. This is the reason that the code for the attached python functions is +placed directly in the .krb file rather than in a separate python module. + +Some Final Points about Plans +------------------------------ + +* Function parameters are specified at the end of the ``use`` clause with an + optional ``taking`` clause:: + + use_B2 + use find_B($client) taking (a, b = None) + ... + +* A completed plan appears as a normal python function. +* Plans may be pickled and reused. + + * If you add functools.partial to copy_reg. + +* You don't need to import all of Pyke to unpickle and run a plan. + + * Only one small Pyke module is needed. + +Other Capabilities +~~~~~~~~~~~~~~~~~~~~~~~~ + +* Pyke also supports forward-chaining rules:: + + fc_rule_name + foreach + fact_base_name.fact_name(pattern...) + ... + assert + fact_base_name.fact_name(pattern...) + ... + + * Pyke runs all of the forward-chaining rules whose ``foreach`` clause + succeeds prior to running any backward-chaining rules. Thus, + forward-chaining rules can not call backward-chaining rules and vice versa. + But backward-chaining rules *can* examine facts asserted by + forward-chaining rules. + +* There are different kinds of knowledge bases: + + * Fact Bases: + + * simply store facts. + + * Rule Bases: + + * store both forward-chaining and backward-chaining rules. + * can use rule base inheritance to inherit, and build upon, the rules from + another rule base. + + * But only single inheritance. + * Thus each rule base has a unique root rule base. + * All rule bases that share the same root form a *rule base category*. + + * allow selection of which rule base(s) to use through rule base + *activation*. + + * But only one rule base per rule base category may be active at one time. + + * Extensibility. You can write your own knowledge bases. These might: + + * look up facts in a database + * ask users questions + * probe hardware/software settings + +Initial Results +================================ + +After writing Pyke's younger brother, it occurred to me that backward-chaining +could be used to automatically figure out how to join database tables together +and generate SQL statements. + +And if the backward-chaining rules could see which substitution variables are +needed by an HTML templating system, it could automatically generate the SQL +to get these data and build the code to update the template. + +It seemed that it would no longer be necessary to include anything that +looks like code in the HTML templates. The graphic designers could just add +simple attributes to their tags and the backward-chaining system would figure +out the rest. This would mean that the programmers don't need to modify the +HTML templates, and the graphic designers could maintain full ownership of +the HTML. + +I had a WSGI front-end that would simply assert the data passed to it as facts. + +The forward-chaining rules took these starting facts, parsed the cookie +information, form information, browser information, and url, determined whether +the user was logged in, figured out which client the request was for, +established all of this as additional facts and activated the appropriate rule +base for this client. + +Then the WSGI front-end simply asked for a proof of the ``process()`` goal and +executed the resulting plan function which returned the final HTTP status codes +and HTML document. + +For a page retrieval (vs. form action), the ``process`` goal used two sub-goals: + +#. A ``format_retrieval`` goal that read the HTML template, and built a plan + to render the template, given the needed data. This goal also returned a + simple descriptor of this needed data as part of its inferencing. +#. A ``retrieve`` goal then took that descriptor of the needed data, built + the necessary SQL statements, and cooked them into a plan to execute those + statements and return the needed data as a simple dictionary. + +Then the two sub plans were combined in the reverse order, to first retrieve +the data and then populate the template, for the final plan that went back to +the WSGI front-end. + +The Pyke examples/sqlgen and examples/web_framework are simplified examples +that you can look at. + +Now, as it turned out, the company had been running without a president for +quite awhile, and had finally hired a new president. + +So just as I finished the SQL generation logic to handle unique data (vs. +multi-row data) and was preparing to show some demonstrations; our new +president, coming from a java background and apparently never having heard of +python, decided to cancel the project. + +End of contract! + +Code Reuse through Automatic Programming +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The fundamental lesson learned was that this technique ends up being far more +capable than what I had first imagined. + +More than producing adaptable libraries capable of using B\ :sub:`1` or +B\ :sub:`2` at some point in their call graphs, this approach leads to +something more akin to the back-end of a compiler -- except that the compiler +front-end does not target a textual language that needs to be written and +parsed; but is rather a simple observer of already known facts: + + Show me your schema, and I'll build your SQL statements. + + Show me your HTML templates, and I'll build the code to populate them for you. + +This seems to change the whole concept of *code reuse*; elevating it from the +realm of static *libraries*, to the realm of dynamic *automatic programming*. + +Going Forward +=============== + +Thinking that others might find this useful, I've re-implemented the underlying +knowledge engine from scratch, with numerous improvements gained from the +experience of the first attempt, and made it open source. + +With the backward-chaining rule base system, many applications are possible: + +* Complicated decision making applications. +* Compiler back-ends. + + * The .krb compiler uses Pyke. + +* Automatic SQL statement generation. +* Automatic HTML generation/template processing. +* The control module for a web framework tool. +* Incorporate new custom functions into a large set + of standard functions, which may change the + selection or configuration of standard functions + in other parts of the program. +* Automatically re-distribute the modules of a system + over different programs and computers to meet a + wide range of performance and capacity goals. +* Diagnosis systems. + + * E.g., Automated customer service systems. + +* Program or library customization for specific uses. +* Instantiate, configure, and interconnect networks of objects to meet a + specific need or situation. + +Up to this point, I've been flying solo. For this project to move forward +to fully explore its capabilities, I'm going to need help! + +I'd like to see several early adopters run with this and try it out in different +domains. Pyke is in alpha status now and is ready to start to lean on. + +.. raw:: html + +
+ + Creative Commons License + + +This paper is licensed under a `Creative Commons Attribution 3.0 Unported +License`__. + +.. __: http://creativecommons.org/licenses/by/3.0/ + + diff --git a/doc/sphinx/source/about_pyke/cooking_functions.rst b/doc/sphinx/source/about_pyke/cooking_functions.rst new file mode 100644 index 0000000..fe46c78 --- /dev/null +++ b/doc/sphinx/source/about_pyke/cooking_functions.rst @@ -0,0 +1,160 @@ +.. $Id: cooking_functions.txt abb78effaba9 2009-03-25 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=========================== +Cooking Python Functions +=========================== + +"Cooking" a Python function means customizing it. And you customize it by +cooking certain parameter values into it as constant values. + +Cooking a single parameter value +================================ + +First you define the function that you want to cook with an extra parameter +at the start: + + >>> def foo(cooked, standard): + ... print("foo called with cooked: %s, standard: %s" % + ... (cooked, standard)) + +Now you can call this function with two parameters: + + >>> foo('a', 'b') + foo called with cooked: a, standard: b + +But your real intention is that it appear to be a function taking one +parameter, with the first parameter cooked in. + +This is done with the ``partial`` class of the functools_ module in the +standard Python library. + + >>> from functools import partial + +And then using ``partial`` to cook the first parameter: + + >>> cooked1 = partial(foo, 'cooked_value1') + +Now ``cooked_foo`` is a function that takes one parameter: + + >>> cooked1('value1') + foo called with cooked: cooked_value1, standard: value1 + >>> cooked1('value2') + foo called with cooked: cooked_value1, standard: value2 + +And you can make other cooked functions from foo with other cooked values: + + >>> cooked2 = partial(foo, 'cooked_value2') + >>> cooked2('value1') + foo called with cooked: cooked_value2, standard: value1 + >>> cooked2('value2') + foo called with cooked: cooked_value2, standard: value2 + +And you can still use the first cooked function, so now you have two functions +for the price of one! + + >>> cooked1('value3') + foo called with cooked: cooked_value1, standard: value3 + >>> cooked1('value4') + foo called with cooked: cooked_value1, standard: value4 + >>> cooked2('value5') + foo called with cooked: cooked_value2, standard: value5 + >>> cooked2('value6') + foo called with cooked: cooked_value2, standard: value6 + +And you can keep going with this to make as many functions as you care to +from your single starting function. + +Cooking a Function Call Graph +============================= + +This same technique can be used to cook a function call graph, by making the +subordinate function a cooked parameter: + + >>> def bar(child_fun, a): + ... print("bar called with:", a) + ... return child_fun(a) + +And now you can cook which function ``bar`` calls the same way you cook any +other parameter: + + >>> bar_float = partial(bar, float) + >>> bar_float('123') + bar called with: 123 + 123.0 + >>> bar_min = partial(bar, min) + >>> bar_min((3,2,5)) + bar called with: (3, 2, 5) + 2 + +And, of course, you can use cooked functions as these subordinate functions +too: + + >>> bar_cooked1 = partial(bar, cooked1) + >>> bar_cooked1('abc') + bar called with: abc + foo called with cooked: cooked_value1, standard: abc + +Which means that you can create function call graphs to any depth: + + >>> bar_bar_min = partial(bar, bar_min) + >>> bar_bar_min((3,2,5)) + bar called with: (3, 2, 5) + bar called with: (3, 2, 5) + 2 + +Cooking Several Parameters +========================== + +In general, you may want to cook several values for each function. Some of +these values may specify which subordinate functions to call, others may just +fix certain constant values for the function. + +Pyke does this using a single extra parameter called ``context``, which is a +read-only dictionary. It can then prepare this dictionary with as many values +as it needs and then cook the whole dictionary into the function using +``partial``. + +Pyke translates each individual access to a cooked parameter into a dictionary +lookup on ``context`` that looks up that parameter name:: + + context['parameter_name'] + +The Need for Pyke +================= + +Now that you understand how Pyke cooks Python functions, you should be able +to understand how this technique can achieve the "order of magnitude" +improvements to Adaptability/Customization, Performance and Code Reuse +discussed on the `About Pyke`_ page. + +You should also now see the need for a tool like Pyke to assemble all of +these functions to fit specific situations and use cases. + +.. note:: + Pyke calls a customized function call graph a *plan*. Plans_ are explained + later, after you've been introduced to `Logic Programming in Pyke`_. + +And, finally, you should start to get a sense for how "programming in the +large" with Pyke dovetails with "programming in the small" with Python. + + diff --git a/doc/sphinx/source/about_pyke/index.rst b/doc/sphinx/source/about_pyke/index.rst new file mode 100644 index 0000000..f7c7137 --- /dev/null +++ b/doc/sphinx/source/about_pyke/index.rst @@ -0,0 +1,144 @@ +.. $Id: index.txt f00035e4dab4 2009-11-02 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + cooking_functions + what_is_pyke + steps_to_using_pyke + installing_pyke + modifying_pyke + +============ +About Pyke +============ +------------------------- +What Does Pyke Do for Me? +------------------------- + +Pyke was primarily designed to allow you to "cook" your Python_ code. You +write Python code, and then you write Pyke code to cook that Python +code -- i.e. to assemble the Python functions that you've written and +customize them for a specific situation or use-case. + +Pyke can also be used for difficult decision making applications where each +part of the problem has multiple possible solutions and the selection of a +solution to one part of the problem affects whether another part of the problem +can be solved or not. + + +Cooking Your Python Code +======================== + +Cooking your Python code is a form of meta-programming, or writing programs +that manipulate other programs. I.e., it's a means of `programming in the +large`_. + +Thus, Pyke provides a way to directly "program in the large", which dovetails +with using Python to "program in the small". Pyke supplements but does not +replace Python! + +Pyke helps programmers to achieve order of magnitude improvements in: + +- Adaptability/Customization + + - Using Pyke allows your Python code to be combined into thousands of + different configurations. + + - Thus, your application or library takes on the characteristics of a + Domain Specific Language to achieve an order of magnitude increase in + adaptability without a corresponding increase in your program's "surface + area" to your users. + +- Performance + + - Thinking of your application or library as a Domain Specific Language + (DSL), you're using Pyke to "compile" rather than "interpret" your DSL to + achieve an order of magnitude improvement in performance. + +- Code Reuse + + - Making your code an order of magnitude more adaptable and an order of + magnitude faster allows it to be (re)used in a correspondingly broader + range of situations. + + +Examples of Cooking Python Code +=============================== + +Database Access Library +----------------------- + +You're writing a library package to make it easier for Python programmers to +access relational databases. You write Python code that deals with the +mechanics of accessing relational databases, and then you write Pyke code to +make a cooked version of this code for each database access with your user's +application. + +You might also use Pyke to provide help installing and configuring the +database and help creating the schema. + +By taking this approach, your library will be an order of magnitude faster +than competing database access libraries because you've used Pyke to +essentially compile custom code for each database access. + +The sqlgen_ example demonstrates this approach. + + +HTML Templating Library +----------------------- + +Or you're writing an HTML templating package to make it easier for Python +programmers to generate HTML. You write Python code that deals with the +mechanics of HTML, and then you write Pyke code to make a cooked version of +this code for each HTML template. + +By taking this approach, your library will be an order of magnitude faster +than competing HTML templating libraries because you've used Pyke to +essentially compile custom code for each HTML template. + +The web_framework_ example demonstrates this approach. It uses the sqlgen_ +example to make a little web framework. The 2 HTML templates in this example +were also done in `TurboGears 2`_ and then a siege_ benchmark test done on +both: + +- TurboGears 2 ran 75.83 transactions/sec +- The Pyke example ran 791.01 transactions/sec + + +Linux Configuration Program +--------------------------- + +Or you're writing a new Linux configuration program. You write the Python +code to query and set the various system configuration options, and then you +write Pyke code to ask the user what he wants and build a cooked version of +your code to make the necessary changes. + +In this case, you're not looking for performance. You use Pyke to handle the +complicated decision making and use its plan_ facility to postpone making any +configuration changes until your program is sure that it's "dotted all of the +i's and crossed all the t's". + + + diff --git a/doc/sphinx/source/about_pyke/installing_pyke.rst b/doc/sphinx/source/about_pyke/installing_pyke.rst new file mode 100644 index 0000000..aefcc12 --- /dev/null +++ b/doc/sphinx/source/about_pyke/installing_pyke.rst @@ -0,0 +1,186 @@ +.. $Id: installing_pyke.txt 70f7f9ee163a 2010-03-11 mtnyogi $ +.. +.. Copyright © 2007-2009 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=================================== +Installing Pyke +=================================== + +Index to This Page +======================= + +* Licensing_ +* `System Requirements`_ + + * `Other Required Packages`_ + +* Installation_ +* `Run the Examples`_ +* `Viewing the HTML Documentation`_ +* `Repository Directory Structure`_ + + +Licensing +================ + +This software is licensed under the MIT license:: + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + +System Requirements +==================== + +Pyke is 100% Python, so it should run on any platform supported by Python. +So all you'll need is `Python`_ 2.5, 2.6 or 3.1. + +Other Required Packages +----------------------- + +No other packages are required to develop, run and distribute an application +using Pyke. But there are package requirements to do the following additional +things: + +.. table:: + :class: table-offset + + +--------------------------------+------------------+------------------+ + | If you want to | you also need | minimum version | + +================================+==================+==================+ + | run the web_framework example | HTMLTemplate_ | 1.5 | + +--------------------------------+------------------+------------------+ + | run the unit tests | `doctest-tools`_ | 1.0a3 | + +--------------------------------+------------------+------------------+ + | rebuild the html documentation | rest2web_ | 0.5 | + + +------------------+------------------+ + | | docutils_ | 0.4.1 | + +--------------------------------+------------------+------------------+ + +If the docutils package is not part of your standard Python installation, +there is probably a package for it in the package index for your Linux +distribution. + +All of the other packages can be installed as the administrator using +pip_ or easy_install_. For example:: + + # pip install HTMLTemplate + + +Installation +============ + +The source code for the latest release can be found on the `Pyke project +download page`_ as ``pyke-.zip`` (for Python2) and +``pyke3-.zip`` (for Python3). After unzipping these, go into the +directory and run:: + + $ python setup.py build + +And then as administrator, run:: + + # python setup.py install + +The sources include a complete copy of the project directory, including the +documentation, unit tests, and examples. + +If you want to clone the source code repository to contribute to the project +development, or to use the latest developer version, read `Modifying Pyke`_. + +Run the Examples +================ + +There are several examples that are contained in the source directory. Each +example is in it's own subdirectory under the ``examples`` subdirectory, and +each has it's own README.txt file that explains how to run it. + +The web_framework example requires the HTMLTemplate_ package, version 1.5 or +later. This can be installed as administrator with pip or easy_install:: + + # pip install HTMLTemplate + +See also Examples_. + +Viewing the HTML Documentation +============================== + +This HTML documentation may be viewed directly from your hard drive. The HTML +files are in the ``doc/html`` directory. Start with ``doc/html/index.html``. + + +Repository Directory Structure +============================== + +You'll see the following directories. + +* ``doc`` + + - the ``html`` directory has all of the HTML documentation ready to browse + off of your hard drive. Start with doc/html/index.html. + - the ``source`` directory has all of the sources that were used to + generated the HTML documentation. See `Rebuilding the HTML Documentation`_. + - the ``examples`` directory just has a copy of the examples used by the + .txt files in the ``source`` directory so that the doctests will work on + the ``source`` directory. You should be able to skip this unless you + change an example in one of the ``source`` files. + - ``cheatsheets`` are a collection of text files with notes on various tools + used by Pyke, and processes used to maintain Pyke. + +* ``examples`` + + - There are several examples. Start with *family_relations*. Look at the + ``README.txt`` file for each example to see how to run it. See also, + Examples_. + +* ``experimental`` + + - This is a catch-all directory for various ideas that have been tried, but + that have not been incorporated into Pyke. You can safely skip over this + directory... + +* ``pyke`` + + - This is the top-level Python package directory for the Python sources. + This needs to be installed into a directory on your ``PYTHONPATH``. + The sources for the compilers are in the ``krb_compiler`` subdirectory, + which is expected to be a subpackage of ``pyke``. + +* ``Test`` + + - This is where the unit test scripts are stored. These use Python's + doctest_ package. Each test file has a .tst suffix. + - See `Running Unit Tests`_. + diff --git a/doc/sphinx/source/about_pyke/modifying_pyke.rst b/doc/sphinx/source/about_pyke/modifying_pyke.rst new file mode 100644 index 0000000..f995d9c --- /dev/null +++ b/doc/sphinx/source/about_pyke/modifying_pyke.rst @@ -0,0 +1,283 @@ +.. $Id: modifying_pyke.txt 70f7f9ee163a 2010-03-11 mtnyogi $ +.. +.. Copyright © 2009 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=================================== +Modifying Pyke +=================================== + +Index to This Page +======================= + +* `Mercurial Repositories`_ + + * `Mercurial Keyword Extension`_ + * `Which Repository Do I Use?`_ + +* `Compiling PLY Tables Files`_ +* `Compiling the Compiler.krb File`_ +* `Running Unit Tests`_ +* `Rebuilding the HTML Documentation`_ + + +Mercurial Repositories +====================== + +With Mercurial_, you clone the entire repository locally on your computer. +Then you can make changes and commit those changes to your local repository. +If you think those changes might be interesting to everybody, make your local +repository (or a clone of it) publicly available (either on your own server, +or on one of the `Mercurial Hosting Sites`_) and send me an email. I will +pull your changes, examine them, and push them to the master repository on +sourceforge. + +Mercurial Keyword Extension +--------------------------- + +The Pyke sources use the Mercurial `Keyword Extension`_ as a holdover from +when the repository used Subversion rather than Mercurial. + +The ``hgrc_keywords`` file has been provided to enable and configure this +extension for Pyke use. You can append this file to either your personal +.hgrc configuration file (which would then apply to all of your Mercurial +projects) or the project .hg/hgrc file (see `hgrc`_ in the Mercurial wiki). + +If you use a ``post-clone`` `Mercurial hook`_, or append ``hgrc_keywords`` +manually after cloning, the keywords won't be expanded properly when the +project is first cloned. But they will be expanded properly if the clone is +done with the -U option and then an ``hg update`` done in the newly cloned +repository (after the changes to .hg/hgrc have been made). + +The keyword expansions are only used by the tools that generate the html +documentation (see `Rebuilding the HTML Documentation`_, below). + +Which Repository Do I Use? +-------------------------- + +Normally, you will clone one of the following four repositories locally to +make a master copy of what's on sourceforge. Then you would clone your master +copy (which is very fast) to make separate clones for each development task +that you are working on for Pyke. + +So it is best to keep all of these clones together in a common directory. + +There are four repositories on sourceforge that you can start with: + +release_1 + Use this for bug fixes, code and documentation cleanup, and anything else + that would go into a point release for release 1. I merge the changes made + here into all of the other repositories. So this code goes into both the + Python2.x and Python3.x versions of Pyke. + +pyke + Use this for major new features that would result in a major new release + (e.g., release 1.2). I merge the changes made in release_1 into the pyke + repository (but maybe not the other way around). And I merge the changes + made in the pyke repository into the pre_2to3 repository. So the code here + goes into both the Python2.x and Python3.x future versions of Pyke. + +pre_2to3_r1 + Use this for bug fixes, code and documentation cleanup, and anything else + that would go into a point release for release 1, but only apply to the + Python3.x version of Pyke. I merge the changes made in release_1 into the + pre_2to3_r1 repository (but not the other way around). And I merge the + changes made in the pre_2to3_r1 repository into the pre_2to3 repository. + So changes here only go into the next point release of the Python3.x version + of Pyke. + + .. warning:: + This code is maintained in a state just prior to running Python's + 2to3_ tool on it. So you can't just run the code here directly. + + The ``run_2to3`` script runs 2to3 on the current copy of the sources. Do + **not** run this in a repository clone that you still want to use to do + commits! Instead, commit all of your changes, then clone the repository + and do ``run_2to3`` in the clone. If anything doesn't work, go back to + the first repository to fix it, delete the clone, and repeat the whole + process. This was done to minimize merge conflicts caused by the 2to3 + changes. + + The ``run_pre_test`` script will: + + * clone the current repository + * then in the clone do: + + * ``run_2to3`` + * ``testpyke`` -3.1 + * python setup.py -q sdist --formats zip + * insert '3' after 'pyke' in the name of the source distribution zip + file. + + ``Run_pre_test`` assumes that you either have the keywording options set + in your personal .hgrc file, or have clone hooks in place to copy these + into the .hg/hgrc file of all clones within your pyke work area. See + `Mercurial Keyword Extension`_, above. + +pre_2to3 + Normally I merge changes from the pyke repository and the pre_2to3_r1 + repository into pre_2to3 so that nothing needs to be done in this repository. + Most major new features would be developed in the ``pyke`` repository and + merged into pre_2to3. Making changes to pre_2to3 directly would only be + done when those changes are for major new features that only apply to the + Python3.x version of Pyke. + +So, for example, if you wanted to work on the ``release_1`` repository, you +would:: + + $ mkdir pyke_repos + $ cd pyke_repos + $ hg clone -U http://pyke.hg.sourceforge.net:8000/hgroot/pyke/release_1 master + $ hg clone master task_1 + $ cd task_1 + +.. note:: + This assumes that you've added the `hgrc_keywords`_ file to your ~/.hgrc + file. See `Mercurial Keyword Extension`_, above. + + +Compiling PLY Tables Files +========================== + +Pyke uses PLY_ (Python Lex and Yacc) as it's parser generator. PLY compiles +the Pyke grammars into a set of three tables files: + +- kfbparser_tables.py (from kfbparser.py) +- krbparser_tables.py (from krbparser.py) +- scanner_tables.py (from scanner.py) + +A copy of PLY is included in the source directory (pyke/krb_compiler/ply) so +that there there can be no version mismatch between the version of PLY used to +compile these tables files and the version of PLY installed on your machine. + +To regenerate these tables files, at the top-level source directory:: + + $ python + >>> from pyke.krb_compiler import kfbparser, krbparser, scanner + >>> scanner.init(scanner, 0, True) + >>> krbparser.init(krbparser, True) + >>> kfbparser.init(kfbparser, True) + +or just run the "testall.py" program from the doctest-tools package:: + + $ cd pyke/krb_compiler + $ testall.py + + +Compiling the Compiler.krb File +=============================== + +Pyke uses itself to compile your `rule base`_ sources (`.krb`_ files) into +Python source (``.py``) files. + +The knowledge base file that Pyke uses for this is +pyke/krb_compiler/compiler.krb. This gets compiled into compiler_bc.py, which +is stored in the source code repository. + +.. this code is hidden and will create the pyke/krb_compiler/compiled_krb + directory, if needed, for the code section following: + >>> import os, os.path + >>> os.chdir('../../..') + >>> root='pyke/krb_compiler' + >>> dir=root + '/compiled_krb' + >>> os.path.isdir(root) + True + >>> if not os.path.isdir(dir): os.mkdir(dir) + +To recompile the compiler_bc.py file, from the top-level source directory:: + + $ mkdir pyke/krb_compiler/compiled_krb + $ python + >>> from pyke import krb_compiler + >>> krb_compiler.compile_krb('compiler', 'pyke.krb_compiler.compiled_krb', + ... 'pyke/krb_compiler/compiled_krb', + ... 'pyke/krb_compiler/compiler.krb') + ['compiler_bc.py'] + + $ mv pyke/krb_compiler/compiled_krb/compiler_bc.py pyke/krb_compiler + +.. this code is also hidden and deletes the + pyke/krb_compiler/compiled_krb/compiler_bc.py file and + pyke/krb_compiler/compiled_krb directory created above. + >>> os.path.isdir(root) + True + >>> os.remove(dir + '/compiler_bc.py') + >>> os.rmdir(dir) + +Running Unit Tests +================== + +The `doctest-tools`_ package is required to run the unit tests (see +`Other Required Packages`_ for more details). + +The ``testall.py`` and ``testdoc.py`` scripts from ``doctest-tools`` can be run +anywhere. + +In addition, the top-level directory contains a ``testpyke`` script that will +delete all of the compiled_krb directories, then run ``testall.py`` twice. The +first run must recompile all of the `knowledge base`_ sources (`.krb`_, +`.kfb`_ and `.kqb`_ files) into the compiled_krb directories in order to run +the tests. The second run reuses the files compiled in the first run. This +makes sure that all of the tests run properly whether they have to compile the +knowledge base sources or not. + + +Rebuilding the HTML Documentation +================================= + +The ``doc/html`` directory contains all of the documents that you are reading +now. These are ready to browse directly from your hard drive if you'd like. + +The documentation is generated using the rest2web_ package, which uses +docutils_ (see `Other Required Packages`_ for more details). + +The sources for the documentation are in ``doc/source``. Each .txt file there +is converted into an .html file in the doc/html directory by running:: + + $ cd doc/source + $ bin/gen_html + +This takes about 9 seconds. It: + +#. Temporarily appends hyperlink references onto all of the \*.txt files. +#. Runs ``r2w`` to regenerate the files in ``doc/html`` + + - except for those in ``doc/html/stylesheets`` and ``doc/html/images``. + +#. Strips all of the hyperlink references from the \*.txt files. +#. Creates a new sitemap.xml file with all of the dates that the files were + last modified. + +.. note:: + This process uses the date information expanded by the Mercurial `Keyword + Extension`_. See `Mercurial Keyword Extension`_, above. + +I've gone ahead and placed the generated html files in the source repository +so that you can browse the documentation locally without having to run +``bin/gen_html``. So you only need these procedures if you change the +documentation (i.e., change the .txt files in doc/source). + +To test all of the code examples in the documents, use the ``testall.py`` +command from the `doctest-tools`_ package:: + + $ cd doc/source + $ testall.py + + diff --git a/doc/sphinx/source/about_pyke/steps_to_using_pyke.rst b/doc/sphinx/source/about_pyke/steps_to_using_pyke.rst new file mode 100644 index 0000000..0b725c3 --- /dev/null +++ b/doc/sphinx/source/about_pyke/steps_to_using_pyke.rst @@ -0,0 +1,87 @@ +.. $Id: steps_to_using_pyke.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +==================== +Steps to Using Pyke +==================== + +#. You provide the following to Pyke's `knowledge engine`_: + + - A set of universally true statements_. + + - These statements are true for all time. + + - The text for all questions_ that you might want Pyke to ask your end user. + - Multiple sets of rules_. + + - Your rules may include both `forward-chaining`_ and + `backward-chaining`_ rules. + +#. Repeat for each specific use case: + + #. You provide a set of statements_ describing this specific use case to + Pyke. + + #. You select which set of rules apply to this use case. + + #. Pyke automatically runs all of the selected forward-chaining rules that + apply to the statements that you've given to it to deduce new statements. + + - Your forward-chaining rules may interactively ask your end user + `questions`_, or get information by executing `commands`_ (programs) + on the computer that it's running on to help in its decision + making. + + #. You ask Pyke a question by having it prove_ a goal_ (which is just + another statement). This goal may include `pattern variables`_ that + allow you to ask "for what values is this statement true?". + + - Pyke runs the selected backward-chaining rules against the statements + that it has in order to figure out the answer to your question. + + - Your backward-chaining rules may also ask your end user questions_ and + run commands_. + + - You may have written Python code at the end of some of your + backward-chaining rules. For each such rule, Pyke has compiled this + Python code into a Python function called a plan_ which it has attached + to the rule. + + - Once Pyke finds an answer to your question, it gathers all of the plan + functions of the rules that it used to find your answer into a + complete function call graph. The plan functions are linked together + mirroring the way that the rules were linked together to find your + answer. In this way, you can write high-level compilers that assemble + together and configure a set of Python functions to solve specific + problems. + + - Pyke returns the top Python function of this function call graph as a + standard Python function along with the answer to your question. You + may call this function as may times as you like. You may also pickle_ + the function so that you can send it to another program or save it to + disk. You only need one small Pyke module to load and run these + pickles. + + #. You reset_ Pyke to clear out all of these case specific statements and + prepare it for the next use case. + + diff --git a/doc/sphinx/source/about_pyke/what_is_pyke.rst b/doc/sphinx/source/about_pyke/what_is_pyke.rst new file mode 100644 index 0000000..b24d210 --- /dev/null +++ b/doc/sphinx/source/about_pyke/what_is_pyke.rst @@ -0,0 +1,99 @@ +.. $Id: what_is_pyke.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================= +What is Pyke? +============================= + +Pyke integrates a form of `Logic Programming`_ into Python by providing a +knowledge engine that can: + +- Do both forward-chaining (data driven) and + backward-chaining (goal directed) inferencing. + + - Pyke may be embedded into any Python program. + +- Automatically generate Python programs by assembling individual Python + functions into complete call graphs. + + - This is done through a unique design where the individual Python + functions are attached to backward-chaining rules. + - Unlike other approaches to code reuse (e.g. Object-oriented programming, + Zope adapters, generic functions), this allows the inference engine to + ensure that all of the function's requirements are completely satisfied, + by examining the entire call graph down to the leaves, before **any** of + the functions are executed. + - This is an optional feature. You don't need to use it if you just + want the inferencing capability by itself. + +The Knowledge Engine Supports: +======================================== + +- Multiple *fact bases*, each with its own list of facts. +- Both *forward-chaining* rules and *backward-chaining* rules. +- Multiple *rule bases*, each with its own list of forward-chaining + and/or backward-chaining rules. +- Rule base inheritance -- *activating* the derived rule base + includes the rules from the parent rule base. +- The inference rules are compiled into Python functions, allowing + Python code snippets to be used within the rules. + This greatly enhances the expressiveness of the rules. + +Automatic Program Generation: +======================================== + +- Calls the generated Python programs *plans*. +- Plans may be run multiple times without needing to rerun the inference + rules. +- Plans may be pickled and cached to disk to be used by other programs or + in later runs of the same program. +- Only one small Pyke module is required to run the plans. + +Potential Pyke Applications: +======================================== + +- Complicated decision making applications. +- The back-end (code generation and optimization) of compilers. + Pyke is used as the back-end of its own + compiler that translates rules into Python code. +- Automatic SQL statement generation. +- Automatic HTML generation and automatic HTML template processing. +- Automatic program builder to reuse a common set of functions for many + different specific situations. This could also easily + incorporate a new custom function into a much larger program, where the use + of the custom function might influence the choice of other standard + functions in other parts of the program. +- The control module for a web framework tool. +- A high-level planner to automatically distribute the + modules of a large system over several computers in a distributed system + to meet specific performance and capacity goals. This could be used to + automatically scale the same system code from a small one program, + one computer system + to much larger distributed systems to meet a wide range of performance + goals. +- Diagnosis systems, including automated customer service systems. +- Program or library customization for specific uses. +- In addition to being able to build programs, Pyke can instantiate, + configure and interconnect a network of objects to meet a specific need + or situation. + + diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py new file mode 100644 index 0000000..f51c836 --- /dev/null +++ b/doc/sphinx/source/conf.py @@ -0,0 +1,58 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'PyKE' +copyright = '2007-2021, Bruce Frederiksen' +author = 'Bruce Frederiksen' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'links.rst'] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinxdoc' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Example from https://stackoverflow.com/a/61694897 +rst_epilog = "" +# Read link all targets from file +with open('links.rst') as f: + rst_epilog += f.read() diff --git a/doc/sphinx/source/copyright_license b/doc/sphinx/source/copyright_license new file mode 100644 index 0000000..d1785c0 --- /dev/null +++ b/doc/sphinx/source/copyright_license @@ -0,0 +1,22 @@ +.. $Id: copyright_license 05a128b38e5d 2007-11-08 mtnyogi $ +.. +.. Copyright © 2007 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + diff --git a/doc/sphinx/source/examples.rst b/doc/sphinx/source/examples.rst new file mode 100644 index 0000000..40ddf06 --- /dev/null +++ b/doc/sphinx/source/examples.rst @@ -0,0 +1,164 @@ +.. $Id: examples.txt 6de8ee4e7d2d 2010-03-29 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + + +======== +Examples +======== + +.. this code is hidden and will change to the root directory and add '' to + sys.path for the code section following: + >>> import sys + >>> if '' not in sys.path: sys.path.insert(0, '') + >>> import os + >>> os.chdir("../..") # get out of documents directory back to root dir + >>> os.chdir("examples/towers_of_hanoi") + +Several examples are included to help you become familiar with Pyke. These +are all in an ``examples`` directory:: + + $ cd examples/towers_of_hanoi + $ python + >>> import driver + >>> driver.test(2) + got 1: ((0, 1), (0, 2), (1, 2)) + got 2: ((0, 2), (0, 1), (2, 0), (1, 2), (0, 2)) + +Each example is in its own sub-directory and has a README.txt file to get you +started. They all have `.krb files`_ and a Python module to run the example +that also demonstrates `how to call Pyke`_ from your Python program. + + +Family_relations +================ + +This is a very good basic example to start with. + +The family_relations example takes an initial set of facts_ about people +(stated in a `.kfb file`_):: + + son_of(david_r2, david_r, sarah_r) + daughter_of(shirley, david_r, sarah_r) + +And figures out how any two people are related:: + + david_r2, shirley are ('brother', 'sister') + +This same problem is solved in four different ways so that you can compare +them: + +- Forward-chaining_ only +- Backward-chaining_ only +- Backward-chaining only with a few rule optimizations that make the rules + run 100 times faster! +- A mix of forward-chaining and backward-chaining with some use of plans_ added + too. + +The driver.py program also demonstrates how to use krb_traceback_ and the +print_stats_ function. + + +Knapsack +======== + +At the `PyCon 2008`_ conference, somebody asked about the `knapsack problem`_. +We found a solution in Prolog here__ (starting on page 19), and rewrote it in +Pyke. This is a quick simple little example. + +.. __: http://www.ise.gmu.edu/~duminda/classes/fall03/set3.ppt + + +Sqlgen +====== + +Pyke was originally developed as the control component for a web framework. +This example shows how Pyke can automatically generate SQL SELECT statements, +given a set of tables that the calling program has keys to and a tuple of the +desired column names. Column names specified at the top-level in this tuple +are expected to have a single value each. Nested tuples are used when +multiple rows are expected. The column names in nested tuples make up the +columns in the result rows. + +The top-level goal returns a plan_ that takes the key values for the initial +set of tables given to the goal and returns an immutable dictionary mapping +the column names to the values retrieved from the database. The plan may be +used repeatedly without re-running the rules each time to figure out the +SELECT statements. Thus, this acts like a SELECT statement compiler resulting +in queries with virtually no extra overhead. It is *not*, however, an Object +Relational Mapper (ORM). + +The data model used for the requested columns is that tables inherit the +columns from tables they link to. So if there is a 1-many relationship +between tables A and B (1 A row has many B rows), the B table inherits the +columns from the A table through it's link to table A. The Pyke rules will +automatically figure out the table joins for this. + +The program automatically introspects the schema information. For this +example, it assumes that ``id`` is the primary key for each table, and that +when one table links to another, it uses the target table name suffixed with +``_id`` as the column name. + +This example was originally done using MySQL_ and includes the .sql files to +create the database, tables, and example data. The example has since been +converted to use the Sqlite3 database to make it easier to run, as Sqlite3 +does not require any setup (the Sqlite3 database file is included in the +example). + +Sqlgen lacks more general capabilities that would be required for real use, +but may serve as a starting point for another project that's more complete. + +This example also has much more elaborate rules than the prior two examples +and is a very real example of generating plans_. + + +Web_framework +============= + +This example completes the Python web framework demo by adding rules to +automatically generate code to render HTML templates from the HTMLTemplate_ +package (you can run ``pip install HTMLTemplate`` or ``easy_install +HTMLTemplate`` to install the HTMLTemplate package). This example uses the +sqlgen_ example, above, to generate the SQL statements. + +An HTMLTemplate does not include anything resembling program code in it, so +that your graphics designers can completely own the html files without the +developers having to modify them in any way. + +Note that the code generated here is fully cooked_ code, custom built for +that specific schema and HTML template. This runs extremely fast because +there is nothing left at run-time concerning parsing and figuring out the +HTML template, or constructing the SQL statements. + +A test was done comparing this web framework example to the same example +done in `TurboGears 2`_ running against the same MySQL database. The results +of the siege_ benchmark tests show that Pyke is just over 10 times faster than +TurboGears 2:: + +- Pyke: 791 trans/sec +- TurboGears 2: 76 trans/sec + +The demo is packaged as a WSGI_ application. It also demonstrates the use of +multiple `rule bases`_ by using the sqlgen example above, as well as the +caching and reuse of plans_ to achieve the order of magnitude improvement in +performance over current practice. + + diff --git a/doc/sphinx/source/images/PyCon2008/bc_rules2.png b/doc/sphinx/source/images/PyCon2008/bc_rules2.png new file mode 100644 index 0000000000000000000000000000000000000000..787494c3041e41525ae4a8fadf2ae34d9607c44b GIT binary patch literal 35640 zcma&O1yEf<(=Ccya0u@1E`i_#_ux+O;1&o@AVBco7Tn$4LU0J~PH-o{Sj2Z$0!r~vLHSiJ9L0a1x0s?;Q8o`cRKDxM%#o2dwsVT$KIQD8;vMhqwwtm%M3FnxulfQDlPj(6 zp_^d4N@^Xs!DM5RdUDdFl*;7Lo3&Sl0JNj~3HlQ7S|=bM)tSxM(WnSkVVYYg!qWM9;g6J-I}d zX@Oe>UkSNLPAf^`*QsjNeKyRDyo~C8y97$!EDPvq{xqxjHn98I!W(j zWI}?2gQck`qLLC5caDyhG5R<-#t^1U%M{cYrk9qMCMG8O`U=3wq2W=9-Z+p2bSj@W z_M)U@OJd{T_}m{gEY{mv+t|dV%2XJ%ng32=cU*r*5Rrc>A4hrod7n0a>#KTBAXUfH zo%LZwt;^m7Dt|)s7s*0%TcmY|H^Pq>SQ(?5&%3=yDcLD7P@RMEjM_{I)xKTdzkjc- zsaPWta-|r>CdEsKnKkmCBruIWP(; z#Fv+slv0rbZpTF0#wI45mSdS;py6GQ7N$pDj>yrS#Q1nKQ_~;(pR7(++Un}+EK!;t z!#=k3sUJDmJHMjTZ}Z^h;n8S*SZZ?izQ3Bj`4f)J^((S4VsvMAc6MiLOTWd{7Topq z$ttZO0l&*`l}X=}{7*VjRW)rB6O+|;@5#wY>J}TG`v5c{t=7*~d3k1@_8;x+Rw_Sq z6|0vNmy~d)hKJTVkd$q8?a4~{{!Zq!sJ~@Riiw%P2<8N{|F)SYTDsQb(&~a4+}e9# z_zh?U6>f@XI(GKx(#i4h)0H+)r1pl^RLw!SkX)Sxrsu;C42Tvn9g%j~?%@ zdAYcDDd-^#a+K*Zyszft=vDh;jusmZ*hq~`d2HrH47jTr8aiB$bUuG>^gsFJ;v(R2 zv0ISgv+!Y_9?3(mtJ3%R>F&;Bpgt^YXn(pyP(XmHMau%&4|O<|H)@Hd;t4V{zqz@Y zwf)9_X}R)4KsA;R9rj=fw{-%mVfo%voXMu3os7&t=xau>3P*>Bc*sFzWwz4N{jKij z<$6uopQ$OLcW+KNR0|YQP*Lma>v=di&(F^f78_2kSA7lj^p+e4a_Vj7#q5-lIRZP4 zGHJ1N8|}R4>^XV(pmH zd(SZbE8hANtw0(@D_n$3tJ#GXH~Q*qWdQ&V@r=7 zZqKbW3dMWpH_kq{{^<&Cm}QbaX+4k3b*!ajW*+YDerG4x2A0&$ZpP?U7n5#%cxjWx zXu7Gpo*t3*QxC488Z`0ppx()peF2_sSk3`{UToPtk4YUuBkHFX)!fX1{ z*iC{=b3Ct)!E6kVj_x=$O;1l3D5epx89@---tJ^HX#SZl(H!6I`QxBbu9qAgtzu|s zsHy4p{PbuxlrTRxCvA`>;9d=Z)+ zu%NS-w7qREEG*1X3hwXq>(>(>^78UjR8%H{HI7W`5z`Ka&1(+!_xls~4-V#Scy9Oi zCJVSf>rp~SD8tH5(_n_Q-ygp{yMm7$_&qYB@!x4S>5HT;S!i{yNvYdQ7{6+Kg~MdY zTAh~%+r|iX72F=4i*#y6hM|Ijf@ht&y1Gn-P3a+g93(M0wcsTWHFcoZr(a(Y2?WYt zd=FGp-RbSa{{H@AgZ=Y~@AJV-86iQ3&!fjB7MtuCc6{InRI~F=^5ha@I%8>-dJVSDZ-F~8^;^n&6Gb9eJdY#!Ys7do?QJmZ4?)iaue!F? z0ukg0Wom|paRh$^6cj<%!=yVYUJZr^8MCR(eih_4`h~^CSoPP~*oE4ucK8-i_wyDR z1B!d=Jz=H}mX>r^3=76$Vq)00;a|RdA+Y(78$rk$^U1^AUB(a_Gvu9tfr067`;N!_ zB5^`|%dZT|SFDm*%K7ri@72_DpRyv7s(sb>d}Sq`;>YpC?L&7TO~i$Z*hX#}5fKrq zp`oCl`j2o~4U8%b+P#vOB<;!j*?b;82iB-U@uRpc)P9_>&XjB4=+{q5DiIFP$6!!o z!m(d%Zv(qE!}qC4nQqFK!_RbAp{lMfeu;;dch+clq2P!_vy&9ciiDbrOU>0UKK^x+ zzNThyo5%UKf>VoB6iFyi)$l2l)!@KDlgDMTX{uP3d>Vh8UBJzf^va;9i zVM{z^OwrO`Szw|Ro#S|H7r2}}`yz=Q?6T0pGcg!Sz$DQsrBl^BUM<>>vsz~|2CZN( zFD>;S6&Ew0%#?ZqCsB;(jg7{yrUl2z$vM33u>Bj~Df+#f+|cHxDSoF(Z#X#?9W%3_ z_g$@dEaXA~8rT{vEG*|cqlq>R_4Rg(^$HEQ5SM$c^sf6;Axl1g*S^46&j{^0F8UdC z|4d-Cj_N&O$;1slI5-&o{hRKnrn1t~%8FuR{8Zzo$euW*8pXGe*>;9BIJ>ve8adgo+CvdZ*+aU4BRP0M_S*;(L$YEz%9hlq&uZr za$X*FQyHx=lpnv#3N|GLMZbDgbxqCqd>0(N#}ZE_<=S}kDTn2i4!no<=jmc~Bt>#9 z5Rh+K@TzQfU#_lUXsBc-xBUt-ApbmHI!oDnI7Q<4>EV2opj2-W`+-L@_%2vA7tSn- zg7Rsu%4Acnv$HdFDoBxB^SmPTNg(%qQE0`Qs-B*FUi%Ybd~$M;A_4HbSx9OnDBi72 zS;D$yl)%%8Dkz|MINtyL(^WiOV>8cj8LI*hCa3%S)(aOG_iP%AR;gO19NZg`twh?(S|< zMn=Wdq6Eb_ZH8BNk*OM-pxxprqedy2;q-P5$BkEeP7bB^D6qFCSd3pKN(Euh!#>vBTvhj>y4GoRzj2rT@7dLtZ0w+d1Cp&;2>X|mSO6dZkiIr$* zXt+p$`vo6NGwF*4*fFg$H#e6{U@EGpNIXr*&(E*3p3PnjO_7!49^0rV^u63y zcPYbp`?f{BM8nM7oQI2RYIfGb)Rf7v{l`P_4-k1Ib?}-eB&@88k+?HQ6TxoI9Zbgi z=fZO9dwY8y9v%SJluzb>)n@`uS3pou|37i?)713z<`9!V^aNnc-{dA0s z*0#2`R#t<Ybzpojfd*z|Wcj|VsB2i&tWXZJve&{Zcj)W+E52ES-0TeW}ddWK`oZzot zzh6GwY(z24n#gBj6lbOonkWFwURq>$=ZjIphJ(5SDiO-e~wn45d^ z=8X#op1`vMyeWlyI>v1KFR_8}<1To~cWnJgaKYOcoQEeX7Z(>u7_zCckzk2q#L>S> zQ~koJ&wpP8cBf^CGM(4iCZdj5&bYt7{}|>Mk?-;GfeCDQ$Tn$gLKzupX%Pu*$@0Fw zzO`TbHnui5GpT84Xm(@e5&SJbejFGcmXOn8!r`9|CqrOKOifG-P5|S(ySvM#9v&VB zAw*nm&ZZtXf1Qb`skn@csDz~CeVZ!c{{{C-&b;Sa)%@D^!1m4 zrya*+WMn)`4}E8A%Y6G=AJN*{`r_j#jOY|NM_gPcH4hI@d3m{|%%@MEK7OPZMF$9W z*O&|3uBm9S3cwctkaCcdf9WxnL0kM#r8QT{cp=k+3AUV;yt?{p920x{s2=I|b`?82 zJ1yiHW(=4=2M1w2M*1A0=%S*cTJn;Ta5z{bB#}M21qCMT06%H{2C%Lwsj=}5(>6ex zTJiw0R3-r|V$3ccgxqPItEmv1Zg~&DvkCh~Z$y_daEeMy=7VwcTEDl4Q>&7+Ys^2e zgG{VsGtd2eI|LE}f^Peg?-(Qn1xgu;EIGc{$NEqZW~EwH#;5B&p}*&155RQ*v;=5K zQB3R?fbw6($nO}U`o!G=#mG~KCFPRjX|9~V4{hn_>gG`6;NZl^$6LyP32W}A5k)6L zg}>*!S?_suIQXTehV#n#@9p`{oH`aOE9>Eok%0k;D|i3usxT)f7PI@qjpJ;&{&)=7 zSSG^oC#xM%LJNUp-@su#Tb@PTV7D9^7A7v|adjB-NYv_e>jZ9oECy_Akj5b~^Lbt! zekT_nivgLQu`s;Sk2ma2o6@zWbCnK1u?3Uitnobp}%$-wTAI@`{4Pw`t zu6Kv*a@HaEgE-L#vM@ydB>qqPCmqjqZxfVo*>bM zfr8X=+8TU)aZ6!b^@fH94kdHkGLh9#QVz_-{l#8DLZuedVN)f*qc2-Sj)|GMD&qu1 z)42}Z;4VIo3p$;%v#lWvO36%WMMXuBT8qfZ%E^J96p_%_(sD9i1J6uPN0;=*kwRyE zVJx`9L0-ycL&&AQ-ff<}F(+y4l7Q?Dl z3BkNKp3{dW{NR_M*Wu$mo-JW1V`Fp3yXqB?0B#NO?d>7RwKNUA0}}vZbsdNSF5=>3 z)%W&n>#KZ)#}ddwMv~aYsW78if5u^E#(~c)`pqt2Lfwv+s;aBsH>Cp%4f_h`aH&bP zddP_F#!KjmnWn6+PTkc{i>cRm!RwVq|IYc=3?*?+kq6gn5TVoxrS9y@r3EM0L#J}g zk*_8I^n*hsk}i~D!l^Lq@BwxQrVK_DnVA1#rc5^?B0>vluElPtaopTfM8Cs_csXzK zRM(Rt8X+t?{SyN=QWc)At}av1=#B|Hm`5#nYimZFfaM7aglrJh!a9A5F=0BloT~8l z7&Cz{&Gtj}55$8}!Br$kCre7#*VhXR3xWB|HS7A59WOQIWWjXmX65E~kB-`dm6>B@V-Q7; zjEtNMB!h^HNl5`_#5gbHdN@~ayQo%}+uRJ2^Ksy6EI&v{1j3y`+rzUYzV*Iy$x^=A z9jCk~N|ePwfXR`J_*K4=n3x#$VGk;^5_l@GKp;Gq>(n7J7hu73{&8?USrG(P8nFMP z4IQ`$hNq`rx4rK)<*1VV$OS3^Z*+|9>{xgu@7|?$8X2*pqM~Xc#}0HGSBlodh$bZ^ z8L>}{MsRR*_kh2Q+x8j-WFz{sadLJUSL(WfFQlfLu+RBf_>(a)F;(K({NxlxPe@46 z3QtVL#W4YHffs~#Fv|v^Ju@>J$E))o%wSSB{RBy50svH*kYGYT$jTyl+{RP+}F6cz8B+Cn=Bclq@3ozCkvFQEy!$3&$K{7CtRWo^+=12 z6c7-QA>y4md{ zGA}MYJu;8^u~qA0&md-#l9F;96XZSmllkM87#J8YfxFv|d2;Wv3=Ehddb7X2|ymc+1#T8o-_04FVFoSo0Rg3-n? zK^kNe5uBe-YXkQsA_Aq} zM;zev`rd%DGGR#yJuG7m)1sR#>^x)+9cxpa=2@g{w9&$*CCSVU8cFX(> z@u2cRi2ZVK8Fzo%-L;Ho#6}7Pi4Fm`RUBL_OmA6H5%9hUy71;8t=mW5Dk&=iMZY5u z0H;P!TbT!kh64Qk`yH7v-?|;g{Z9Yoi!*M?)x^mT@l)F8KI~ogkADZSJBKE{Pab*% z5pc`Q%Av{0^No%hFV&6p)t(ay3W{7Q3A&zz1%hVXOl(@(0=HFfH;^jD=pzMUVq?FH z^tW=0mx92i6`WAe2AF&93`&3`s?(@YoB4AIfI|Z)2vu4SyI?;=kyL4w0{qBeAnxTQ zz!QA|P-v*Y*Vhm+V2*;jKGe*EpWE=H%I1N0+1_?wlo$S{h+O&>kjSY~QBhj^+PkvT z4!{yqQV42cg6N>lZf|bX)YY>XiDCl~*XBh5todKnYGT5q^21_S2y~b~YioYoR7pl~ z5D<9$JbcIyufy?y2MB2&Ds3JQF!HI0LlvuZCI1d?b2 zdRPd2D=Vu?+RqCM3$p1O4P1 z)Ya5BcXo1KBIiWZD;NmB27ICKXfx_?3|asv0L(HT1H#h7#iUZ`?9ZL^DstF~Q4=^3 zP*nZu?G086?;7R;zVr;?!XMNq>dT!#&?qfIj(c%KpcI=;T~t&=$YZ128ZAVR=+Gt~psQLBV$edCUgDQ+yLH=(7n zq(x3+G?RC_R#_TIq4K>By45TsAoJY9BAwlB7 zy*L7XbHyFUyJxco#`~KEPhC-a+q1impi$pg2b?$W60N~3{vW#p3uFO-l8{mA zwfix==~II4uZ^uuXTq~SZ<4M@n>LwgxL)^tnyAoIxx1(>&T}2y8>L!i7DYExU{!z1 zGo~BQT(@}@7_<1?_B8q2<3&X&1gf@teA;Q0)mlu`D>oZ$#HMa?=LIohxLD7{MLq1^T3pcbyF;x!*Uf$%%!O6YOO9vCs5sAt#aPnqw?#yy7KU- zF|e^IUvcsztlVrJT&xc0zY0o@dhJC@@ER`Or|kh!X-+m_3IEv*x5e*j9h6gLWo5@+ zG8RouO|iQB#zfi4furkY`J1d+i#y*8G`f=7J&Eq)@t9bBcJg+unDSu3K1N` zO8cnA0}B)-L@u!*`*Ph+_tR7vL;crLy|6H~_uLC47xxabW8WeW8Ns^T)FQYGUWNPW zrP0nm?%bl_3zma;8XvEo%1ZAIuSJE^!|!%*M6hRLu9T;&Daq=$Z5F5Zn`i|EzbA7d zz}7p~3$s+7$t6vNP`)r+#pkhQ?v}GC+_d9qY?+{hTE%%7FaIjPo}Fbm==Q>PjrV{* zXV&;fOHa$C1Gif)dfb-aO2CPDPIq>)JR*@|!330TYq0yZiaSa0#7-mguNf4yYuS2m z4jkkpLc3bMVd5K#&W-)nzG-*Ye4c^!N0&5=W7+xT$0iG^MLYAzW(7DGB8EUKdn;XK z!?PG&@4Aa)UkY>W-C?su(i3~y3SR!|BbQX<-8U@Tkx7v7FbqLGYk`l(5@1Wc8DIOUDVwd&~ zG}}I09`FHG38G(e`)XM0u;OA8KWOqfP9wS0LMd@#K@Bh+VYZJox9& zpBGRqV{T4^tO+N}=XLWJp47`Pfr^&a_xTZo3DBn%VPIhJ{}lfv1sni#j>UjHPnPH3 z9B0lpLaik4%(5gdH5n$WD;w$!lx-pD%pt21V#&Q#O?7DbN!K@WdMwz=yzG)zL`1x@ z!QrzfW_P}0VR_URRFb0P2pVTNM2|F^wgOw&KmslP)Pn?gh+d*V0WyFK|VP4QoK6qsZRkyH`*!y_- zi7Bt^QRc%({a6!@lN_J?_~t@1050pEi$FoM2qHwdCi44>_cRu36+GxqRB`^46r)E% zLZT%OZgE1LBQxMzclO;(FLWRQ8j8rilt7AD!nm>kD1_DfGl$Uh+ZNmwt)7ao7u&)-UAg<- zOGPSy41z4k(1A_a+pkVcWEXk)xvJGo`FwUCj(#}54}LK1oO=9jq^hb44-a44{p;7d z{P?8^A*q{XS0@4`1p$?JdoNgZ=$TsR?5a zuKX+6?0VnW(dpN4^1De%=t@F$Nr!gC^FKDad{Js%#XYisp|J^=wLX8Ja+XuV*4w|~ zGNb7-ubDsOF`SrO9I`Jk7aeL}n%q1N)-Q-zgg+bMs^!_Epr1C=5Hx$32)vb>3$Ky8 z_!CS!MusGM%VjJnyLO<9=xa_q{XwXj8Ci}TVI8)?t7HYm~zFr^dw#)FDOvv5oy`Xm^W!UBj}Z4P*0X^$W2mUwa|$ zS2|#AC-kj~cYmLr9HUdvbT4KQ9al3BtewF-4etr0FVQH;UMM$u8?nwF#~gXGW^|J# z3GGc4j1msIq`v;HF}u*X**m&=P`OHa0*h0L)w;9N zYkdXARu*)1!FhXa5tgq_uRWRE;<6;>`YxY$X=mkBWzCwI z-5>_X#$p9#cXZV(nsSw?i0-1O&?sEXIe}KAi8U7>w*aW)Plnlcf1}kTT;ln}uQgV^ zK6A&cgj&9LJHD$3ec{gH_a3 z$K7bY6T=7DE2T?-5}?rv?0mdL9x09MEr@ZjDiY43Tv4wZPAL$6^$iNn+BMJi#-_nlg$>pEUxhwhkq$l=Q z(E9;bTIfK>Rg7&3awOo!eEi6^!F;``Y_xG|8b(D%H zo%uFH4p*6S*^ut+`JII132m&0V9Wg)>4YXSw*pw|=tWg%sqfH&Prvz_OZz-IBz5+) zfJwGgN0|gB%ALGBBsrIuI+V~a!0*eJ=$#^XeXYA~;M7vF5|x)hz-2riVYsiexGP!_ zw{leF_HeNlZHB^XCAYe3glwsACT{(R^fmZZ`MHlL|;p$o*8VzfDmD~ zI^QR-c4DwG*p#-~UAcbEe_sUrkO*LN79 zIS+75t+mbCV`Avt=e=jnJ-qi#Qr4T93*(D*Ee(0PKHlsaD-@f|O-~&i&WevD9ZbK- z-_bUG{LWq{De(>QH0rwE{`orlRcvokSa|kCz6N;)qn=J9B<}d8s(XJ5@QPk3yhBvi#xs)RhE-Ek8y#DQ&`yJc?@E7cAWAV_#Tw4 z_v`FU#9Mg9PJ(y8{XCa8ZYyZ@y-Ba>7wU5_U5-6yKANPm68pH?T~A`g*vjSK&TkGM zEi*m}aMTr6$vYKfCCpYn%-jjDCzd2Vrq)}uwd?&jTqI4~we94RyE=NdxGE{aT}&sM zkcsl#oNwxzZsJ0UP|O>r<01%@Etn|8CWw&DQ{5fycCV#B{wmFcgYi{b{#$qAk+V?y z8FPeKo{Hr$j^c!1`8!E7*WatLI6(#I$Vi>GoZW1As@679B2+eOyn-d3J~3qb4cpMa#B7v7>3wynYb5 z8q2je#yJ`lWY$)+8J)zk_V6(ss(ybvhKW+9aPK_&y+t)Z(g;%3U-G-)@gIwweI3Fr zmb4s4*2Zb@;((%yo`E^__$x!B^26OXn1cINPj=mPy^7FT<{<-)Fn6w}IbF`j2u!C8 zD-onWH{QgLo#+(?1bpTGgQ<*fYkfik5N*p7Z$9Q&y2%8SNY@~@VI=UVe_u?o8n_Gc z*j0c>-L=6Es&4E*n^7-jsdTvR*+|{0kUZe4I?9KQh$FTi;L5=MYvsbL`SWdxuR+~L zHi&gGdR#OJzlJ9A8VH39GNW{JXFCFJnxIxz3M3n`>yx@N+fHng3Dy<{x&W7Fd0BrJ zpT5shCuf}whML-8Zv4YR-O{p^Qk%#U)6^$SS+)yFtth556IYKUXsG=K<(XR?6B|Z8+6FqJKvTI=3RvV7TSle+p zEx9bCF=MC^@K3spc75tY*2D9;85HHextS89EJWX|9z0`(qL_bEDym zeT!GWXwlBX&Bo=iD`50bm`A9^q8nVQ&S@K_4J~LJ>UVYK1qXNnGvyJxS?T5E5ec5A zk5FQCHF$?OtF6zVZCa-VYDvy&U2fTrIfbpge>gLxI@U_Q_nhP+yd92TN&%$}sk71N zH0Kz`wbQR<*2gwpYH2n0{YoD9%J1{SuLy6PGgtw{Y*u{tF=z!LnF~&7j$z(zlh^ur zB{?57esD^T%+!$^`@Ds1CXNee`=tg9SlXPME>KfPLLK*Tb}%u(YY)##%w(_}Chc|c z+8COrs;*N@jBbw0iv2>ur*BKg8#wbTm~1Nvc2z9PEQu@bm*up<9mls{Qi5j~f+>bt48UxwWy--R7X1<%gQgE&1^}PKj9rf402T?xuI)=cF9H z_L=l;M~3d){mYR;@cHi%LN^88GvQ#th}y|Xif0E_tc;Xs?ofW~rf_+@F6!sf`v`U- z*n}g8IRK+tp2txP(Ei!5n+!CL7NJ59l@O~^Cc{MPp%^bg$x^1m{1%N8t$b#frR73) zg6wWlsPIzRs<_^HnlV_o<4UoBDO1t*nIY*5e#WV1l;N=2zW3C%2nxR%8#J-3hC}@%y6K3N$w`cS#vdn#z~sTX_YRhKllf&Kukn^OU+Q|=yYSRJ z3tdgJr@1(2K$fX^vzT9stxJt#xR6)k1r^h!@Lvp^l z)aUSW9>$lrlol-leR^Oaz-!kDxbVid>?q{-U*S5Cr$tG*t+1ObPCvyf?9prz&?$J8 z!%oU~^78ym9k9jMB*1F(1RD{c+*V%Nqowmy+YuvrTaRQXkJFmwoeZgbW7ev@{7c(1 z(H!E%jMnyCz10QF%T&ygD;rNIX}hR{Dv6#?KjS~0Z4U6vs?#7CTg+6!`4Eoc=c;}@ z`IOvP+b8fU2wxOEFfj1>$e`8=X1kH85}#NDs%V1<$l2n;rZu z83ehbUZ>oEt6+yr$aY{jcA_9}m|`Bv`7!737Bo?GZSK+XxRo|NkDZL{11(iuS7&|U zs9liOTapKxDezR_)|40i?b0@@YYpleRU?)0<$4xFsW3=IEZJ@d_RM`{@}uQxX(w#t z$1F4pU^g@_@%j)04wsczBS)=dgm`e1V9`h{>ex2#GN|C2k9ch~J6c)o2cc9*9>wH@ zQk5z&wMX4!6PE1m>}cxhh9!W?x3y~{2iLEwZc4_t>8wq8bsJVopxa$U>16tX$ zfM8_#!Sy>c$7aRwE8?Sp5=N^U%y}qVFY}=Al^Ng5bGOknnT0n$b7*g4lF*;ejA(J9 z%4PD^JoXo3V`uz-XQ<*R&E3s*9Q>;7oB!=osCfcPb7-iKO%8Y3@lkoza@2cK#ZKdx z@T!Xnj~eNub+3=?>fm&8db194vT&&`6(r5-O}{60gHrW1Ez$RM0%d)D{Y#p|iLkp& zjQWC9akg85@B(hw#D!+qOb%Ng{IkyjrLUt$yLSINFFCY`RA*VJnKQmw`ayZ;omCNUSxH6TEF~;xtw!>nM zJT)igq)Wr(T4#nz#QIB=nzl7YN#2C_r!C|I%^m`zV9J#d2E)Ir7(U&k5%afl8PEGyvh*)zLMpm3 zHY2i{y=Q?&{q$fqwe;>}g+-@TKNK@m!dFm%5`ki+tnV=d-u!F$#GgrrEQ~?6hV##7 zjO!vR!n;x$gM+#qR!p=J*-^xAah7Lqng;{gJlG3e+NDL%yPI}+)29Wmt71C*R>8jA z2{Y91vryg(5ZF*tgdoNu7bFuJ;iib2lsVft)sQgP`Loq&MI`6A%ddKBC%816hV7M8 zk}U3fy{jsrN!_wojp~b4BYl2L4`|eA*3zJHw)}7dVMtZUUZscMW~9+?>HWE%?B%99 zusq)|G!xV$q_MWok1bp{pRk&{k(8X%j*3&pbuM%pn_c+d;%dma?xY*81a7RZFu>Yk zVy!>x-T%37(M^0ee3V2qEw)-y5b=eXVAE=wt$vbhAPF{0i|gdqASh_W3P!8Z;ec$` zpGf`9if<*qa0DkqM$F;_bE=qf`?nv0e>VGKmbEQ9T6xShrADE#zI}aLW2n@n?kc?! zmx*B-)xvl`H#<%`R>Y;SUC;{1C8$ILeqEc{L(zwHlKrjQiz z$iBDt550}GQBm%AtNtJCei zSt8<^6!Qps+h*ISlgoOYclM0H$?6qnNqRbK`=|CB8onGw*xgBoJ{N-A!)87juI)L+ zfPUvNunN>3*BX4usM%}w?~ejz3L|NR8e(*vE6xU@Eq0zp_!Lm!i4yD_$esm%=W;)vJmiOWII)1pRa}a?>&XvCkv0-SgVcB||JLoRrl%w1A&q+w&N& za=T;~O%cbS{k_MvsF^EDMSFf;IvE0CLS96OS(3g;sa!*+K^r!Hi!RsW;c{XWa5+L{ z^q(~hfxTBZ=hbVEQDBBKC7FYkR91ajc3KzMl;I$UM-#>3G> zLS4=lD`O~^Lw=8@p2?b)r*CnhEVj2w;c`q zx$dGV(u=n_~`{MsrIw+zLrxNgM_!P>Im|uwxd!SuT{AHF$65ZQcXxs3qS;c>D zklep5JgALoR-BYp-v=IsHGSuv|hQpzjy0)F#D~$LZG5!FwsT{D8KQE zi8<6WGc%Eqp;s);P!Y;3s?9PnO8(UW@|WKsh0D7=!b5&dRTUztj|n-dg@tzp3)Bh& zn-kJ*AQ;;|KdjN;nAn$Nx+tr*7Mqa4%!?g2%QK$s;7KPl7>v0KyLyM))3rtn&^1f7)n3ruMIb4b)#Q@hEJ{fal9= zzw%BF0MYF1Y?pYzv)CoS1M-S7Z$MHJWKo_0{l2_eb&cXa@0-8mJjOuEfgQvMod>vN z*tobk)PUt$UXCOfMgqa?ci$+&`c6Wkvw2Vi6f=mFo%PM6r22pYs5ZB{8WYelWN!~D zI`S3MLKEauxIUh55C3P@*UxW(jKUJ}g>ylT8B(c1h2H8x!yo?RMZ;Muy63FNAIQ_` z+b?IQ0PG)NX(}8Q`Y~I=g0p;CUu)LLBJN8`4y_y8Bi-z-LrZmXa~J(#e7yJV$b z0L}j$F#^LJ_vgRf$hJJEe!=;|jbeaYs)0t`RQsmJ`ByKv*DOQ?FJ}|BMthrp5^T0S zB+*jR6Jom^`^rWjuz5UfOl;U9#!o*WM)_qdL2D(PfWl znQhnRUD;}T-{oy+{{G?6@TG-pz3gvf-_Ro~tm4Ob?Uo7;J)7s@iJu$#hym3CL{9-` zJ+SxGhah&dnrDKXN9_%mniLXToDmW*NdFxbBN#0%d)dF52bT{GE#g&@m!H>uXBo7W zX3-Nw)A%^M+IC*i1`ouH{7^hflX80VT?nrC{0)%o7mL`74BWWQKlLgj0|gPUF;Ry+w9^gY=hY} zl;0)0+S@yFamnfedQ@%CR*#2vi2ifv9ZLyj636_>^LuRgV;F#K(0_FLB+g&nLXF_h zAaShw>ktZHJ%!^5I<>~S52mFG21;lq%6q=3dXzaY-x15Io&B!%K=8RG-{ErJqPf#0{b4{BY+aO3qk0cdE2N8d8 z7gqPqJMX|{;jhHz;qaq|Onc&6ZO=V^;>-^k&sUB5hfo01PbY6wIH?!wsnf*sY8ueB zQ`39{*%X5&)P-`b>fGdl{~w`K(9jDy3lMzl$zjZM19c|Nq2mL7+)NqoB?{fZhju#^ zuu#n-5(%IM@T#Zb^RJnMt!oLku-R{47vTl%>4>+Nc?XMXQdWbpZA5X90y(T_m@X%v z?b85H49EdqGb5s)9L?7hl%D~1mEc#mSuTPIJz{7GSU~Vq^w8hR@VS#YB{*Jb3q#Qf z`S#5Zw7%anFf#t5%6ocxDk&-TSbuNdhL1om%xnvSiLLu$@GT-D@TEhJN-9(ey6Qxz z1%OSfUtzr69)ve|HU!*pQ}Edj|%79t1(=* zU9U{O(93{0Sg-Xn1~cNTR|nH2iT{}=7{I6 zoWKQ6)mn^_02Tun+8Fg6=403hPJdVE*_eB83q(y^FPp?i5I9J!2bKw&#gB_JTE z!~=a#ru^b!q%fe~?lT6Ofhs&+US6hrAO{Nryw@IMU{+O0nVDovG?bLkVTfpGeZ~`$ zlT}HDg>+2YK*+5n4;05Z&QA~SO!) zmX%e>0_<0b2lgpbK421u0W>{d&Sd%PEZS(>^v%fPO9&!aA@v zEqTCN$Eops_8E`^3?ne8rluwsQ6P-qq@sdp;gOLxhi|(-Zh?kFCPVO7EU=%ihBfzs zhLyQ)#6|+FQ)Ye{IEYJ7=FC#^2&#CO`38s@T!6k`fS#Tnu)Mnid8OFflDDC?MR9|v(u@4^5KSj#4YkK?oq^chWXfu9lQYfR(Y{&wh@I~=J33tJq z%~h1}Q(<1KUsYvIP0qL_c%TH?H?Z~ZPE${jBOkfJG;mpqkyJ=)sAlC z+~6ZXpZ$-9ARMeB&c^z>f6p6!{+HglG~jAg;n~~UGxaVn6Ng2U@a=7F1@^$e!5OoI zF1nUH&_CmBoSXoO)T%Wg=Jy%{x^!jI*qAa?J_uu4@>*I+R5bkj&48&7c;p}`XgW*u zhT*aryS0L6VL$`O{~owbpeG)~#KleY^Mf!u09%2T{-r1td@vy52;^I84C-fs=4NJf z;NcKJgKlDIe00^wMR2re-x2Q(K@&^Q8#HV_6j4=K`JE6v*nyI_cV)%EE*wDgrI$U| z#Gam>?quTS?Y-3t0|V3l9|6H+o*Zry`wLrqp|0dGslQ*kDRDeI=jAZ#qq7G7`XB!c zFo~!1G?TlH*Z|jV923w62_k|Lq@O8j!P7fhjNx4Q$-QaBvy_2J^9Ayl06hgiU65?v zU_{oqCD5%T$GZqlgb~Wl=I9`&DJBwj8L@3XrR5#4b938PkN_Pqs0Y7&^XA>Vci{xw zKo}YET};$|A1ag4hKJBYFEbxF+Kf896hQR@zgU3KjQ_{Z{vVCs|NQd5l0Uo>jV#M8t7*AqXR*QjW1#m4lSZq%VAIB0cs0zYzUDtiXR?4uC`X$HrS) zUIvW)(1e%gB>Wp!F9Y=d?YK@i`l>#~V_{(xsoh8*#3`$(xja94*LF`%axyW=Yu-Zm zeW@B0Vf_g*8*i{&W6ln!FZcR?dTz^4EwfDAAT(0c7ltN~14R(=VKVQ5^)HWs6d?%z z?>&|OcYOaPxsPqUq&o``|NY3OfxjCFVhg|);OP`dFWD0?RRFf6| zoaO&(0@11vV14MYk($aHOdOFZWS9d0?JN*TTVDM?rM-1jmHqcEiU9(Gw2~r{0ul<6 z(ujh9NJ=W*2y8kbg+m7IY;fy)Hpu;Ob^-PT z{W~O6m|KAxh>MF$S#BmLG(Fs7m55|k49y$S0pE7=Rb zIZ=D4;1d!jgH92wL;C;ybGkS?=H%q8mhpaYRmM@^Grb;)Ucp;q1(BJti3!YsKp0a9 z^$6(SaO)yK1pvypp(^V|2_G_PUgF!Y$9;3 zPD)&*H0rXFP8#%k)VA#)jgsvj2f3OHD2zcZ z1%*R(^$A=_WDactMPQM3i{AkwsP0Hd$Dyf>U{coC)di{f(BL3a20l`(2O<8ZFl4ev zoSbE!1;edC>ILaSdIRLlZ@Cscj8MG=Z1Py?Me+`!)6-XX&i(!LS{S*ueJ z{8YaZp+DzG0mBvfTs?qfR(K!1fB(#U%%|-8pFav3^n+;o4Vgs8cO-P6Scc+DFV)kw z^~$v*BH#tx4e)f*b^8IjA>-N~lY5aWfd104}~#2o_a@Ri=bPm+wbebDh--xr)M;^(en8F7`T=gkqo$F9vC zKte85{!L5W8bp!Pjt9S|;G?ao$3f+AcxNfv2J-0i_>?^neEPre3sL*Ih+V2??eAp8HEjh}l6u|LB{0=klW^VEKZwGs5%`PBL_8#_6fo zxdY)@df@Nng<1u1F1KBcl#GmznSuz)fWWakkm_FDxeE6osC8linja#s)p_R7_kml= zwif9X9UkQ!5Zl|$5EK|Bi1JK%zMb7&R*hKfK zr=|EoDHd8wL_tZpxwMoS&T++WhwAJWD4L-2L-N@>Iy~ZS5)$#aVPjz-U3M6+MGS}=T}b_Fjc)efn8=(Ur^ z^8y3Ap?|dbhI5tQ=8m9e>R6mzSXclP07=${*P!XSvbxxxmUDp|6vJm{4lT~ecuaIO z1uvq#t4qrJ-B0A*MVVvcq#toW~^HxA)iAt6zh zkCe*sDGc~-fEuT!(ky#LvAdk?@mS8>jO~W&+%h1K8Qu{G(g@Ih|IXlC!h{f7#|Fs; zS!zAv=C+5_W(ZAVKzu$2JIMEfa7?nnlMe<9&>SLRZ-8~+|4^@gg2J_?#z|Xy268J@Pl{4P+k0%F0fv+T z5n*CtVtoAhg9i`bYdw4R7aED~&&K5cRZ{%$;)Ba4MD|~p$^TT4L3}1aziHS3tvn90 z?uOoYuUGIgi53cT=+mk@Z=qlTw(EFpVfOkyNvE^=)?W{6z%SmQC-%1K2M#PFOlPtX zSf79XaOGpf2L~xXjeR+qFCDu5%X>jS)7$pL19gPHa4@0trNA5L?|+Ez`!x`0sSxp0 zT)R@8#nzaS`o&2am(R7n8{kKx(q(F9HfZzq#}Cu7N<0&BQ1co89RaMNn`;t_QXsBr zI#<04Kj*TfSDVh`Uc)gcm0p2KI0UAyFA}? zQ~3qPWrg3c$)3Guha~qy8*GC-T2fO}-?Kxp->3~S&c6i|^*H_{?AkZ)TJJ5%F~2zZ zDF*%tjoN_x6n(pWkL5jkQBje~FPINNA8JFnIac+#1x)c!{T%>pze_+&%;4~dk56q( z0Ad)5dpYzFCOrbxeu<*&k=08-xA*ndG3eC;Av5fR?#Dk3iS#0#D*QJ2#2@~W0)D-~$EY)uL0 z;zC`fP}dm5)u+YcwE8!?!5r~+EQueyO)49K?1TxAkNMYC&85A1{a^Z zIyBi-R8+&LVQ}gp1BxIG8H-`c1l43!W#tkt-g`FNjWHgF9o^DqD7jz~g9It<1KVcH zN=vVNM*xsP#=+*jMt0H@=i=B^8Ol|<+$XfsDe*|YF>`H_|H!soo|HR;K?0KQ0rb^_|&Oeu!V%o zq47-io;nE1-l0Fd|9B#N>~w4qhGVyG-b5Z=UY0&gwQ^IcT*qB7d}|`%PYTJ+&4n*J zLw#{^0azranJzq*o)NSlS1o}&A&0vEsUDv4VnB{4LE7vdEic5B3j_MX{2eGrl4q}b zrKYFjM;fb^8iszSxQ7xk^^w~%$p1YmvON@fngnqL1tkUregZJ%&B`FSY82q;2XaY) zM%^bJjA(nBFJ8Rx)S_XGz_gC|q@+@!kNqKk2h1j@YmRQCSf!?=#dBL;r-XnI4W<_F z_EChc-b`WEL4LWVF;?66=*7Egm4_QA*hx|7MLUlT8G_dD;jMGO_Wpi0sIpW!W%EEd z?CASkY}#_UX_sf%Ki#Ms3XevqO2zvQzMQ|YkXJ4?ai9$qJKH^PsIM*wWSXlY;knCk z*FR~t{>6(?92tiCK-?7r!wQ4B>gn>Ioo2UqS(f&#Ruk&2^%PYV?}!){Oa1Z9P;Sph z&wQIYp41%1r+~Rnefe$@OY^%dHOo=~cI4#Ac7~IiWSatJgapmz|?x5aM;( z8v^>v`^FTR&9?9JpDc}I#&(GW_eh>@Qi_VJVOQ;=M090!Nuc}E&g329G{;}2b~$%T zWmR6nXDy7<_9d=wtJNp9?;ciR#_Me;&Q|;p5q`gNsL>*N|R zEIv-MGn%Q;A6huyytuYJf9%mZv)gOYT-Bl0lUrV{M1wy~4S}=I@{`ihM$IO=bwtC_ zj6cgFqru>u2CH<7rVN6Fr(TQ3yXUQxuRB)Wb#qP8>HM`O&UNhm_TFf>y6oAB2Di(# zk&>gA@83@WAVxGg3lJ}%hB8mi0{b%o!rdmrHa4#VbVvUeu3Z*9ZE3T=VkCC>Ho&w6 zs&S8CWT&l`t5y*N=Mhx))oYa_oDRd>!;Pm)ONoEpl0W!I-fMaPmL^9}+^F*>l}xGi zx#5U}gnBSkbk+s`3_n|ST6||ef3%o5 zIpurQZ<#@f`eXH{pV2{SkqYm#4Q*Ibi3FX*1Y6feYK`11eD5A@~B7ZC3s`4kngzbbRr{Pp*5 zBpcb+7b(JRsHz_z>%kj;7$tn8@bTjo0KQwH0N{ypJ+YX86ugj?&(J3UgDk~o=*TMv z@M);V^`(8l(csmQ|J|he-+5utR1cmA%djn>}wdevVU8#>ET@y$!XvYh$071J92FPLB>{8b*B&s2OZRiKMV+x&In zG&2&sb|`M%%g;dQ-_C-)XCzCC*&sc>ejxEHY?W-qL0UJ88pl}x6@?+IyzYZhfBHag z{(Z`lLHC}AHE}X8Lp(hgbd|4t72}Sk5e}nsHK8u33Z0CTKjp|<5tckYuZb984QpxC zD#l4zaa|=cwhH}OHnRStGTdzO$dLIJM4QE?foRU))a@KvJA<|YZlW5E z5>DH$ndY)^_3zr`-Zqzy!EXoh;E@mD%TP6COWnXsd4TENv(Pt!{_ZrUy7wbxAZ}+? z_hht-z1D{1a#dvi-)y-{mLo1(r_}KWRymIu86W;qwEg%Ij$dgbnE7H@M{t=AqYOlp z`LRUkcd|XvBgQV>J8pOTi?e*Hlx`Yvv2?aemXWAIF==tLiU@+xeLh<(O7@+n#8Iag zhHZtEO_5b(JT?Z@r-z%~HW5yE7V<+BcsUF9L9s4I;vcL@M0}X$TH>`F?M^=23%cR! z1qBL{kRWvq?hnZ0S)heOp==_DtLMwYO+ezvVPQB{00`c<$!-ya=Lx6mtp z7lZc{Ty>1zW7@ppp>G8CoOX9(1-HaKF2^r-`({g4(cCzCP4FXjPGm{zG(sKtFRfnK zn7fL8plqVeiC-@a-_%XjDH z%yN>h6f?im|IB=@eJUPci8=J!qe1rRm)}L~m$&(zWoR^uqK`8+99jrBiY@T@n{1w)*Ff!+eT-ZoUcR2Ja&ijCk{P7jmykMQF)1Py(Yk9Es<(_V(eluy!? z(rgD7^z~Z{{9zY1+&nyT46NhP={Y&KkwI;<{xn~?AZLs#7*SJv`LmU}bSiZQj3u90 zOaufUot!-MJRuovIq>IJ40+iOH*0cieBWuKAyz~%(Aqz8q6*qeaO7Py&eb0rO|U7< zuao1w!?8&zXju@NaP2^zR539v$D+5~&yxILFzGP7YtzNXpe^Uw{?9UtLM;)s$d-;_ zvrh}>MTx3Ur0J`~q^*2MLrzwe?KH=T%jZriK0Fh)HI*8?{7J~(%!{&GnWf01YcqCq zWIyr%p`Jt($^1^l7UOw8+;)7L&Thk3Jx6z+@kw*_>^4zV*)bgb+win9_T39Y zh!kbM>r?FmiTA_ZVDF3#MZsp*Qd(25*w7T!!yvnhW9%Ee{-E3QT35#_(BQ@0scby3 z#Y;YedO%{;-d&HYeWcAkO$0u~rc)P+ufR5lbZ1+_0FypFr7QH8q2CKJjO? z>b=!Raf$(S<9}oku^eCJBAha2T1o|&(ntQC(|7c8rIr{t1pEuNL8oda+Ueo1;jOq7 zqdmxBeBt|l3qCMMsUxbAZ`ugyn!66sf^X@(x4-z_v0zv!B+6_Sz9wP zm973tC5OW`Y~TAiC6s>QTrH%J<*n((S$A=O3>SlU;=8sr^Zp?bJSm#tZ_SG;poLhh zfBgXW$2&bZb&u6vsO&od&8*I_+UlEh-_JIKwAtr4K?2!KD)?-Ct(L^15(TGZzZ0m( zb2f;~@k$3ju0A!npXh44zZCATP8Cc)V<9;iD}VTH4ng_fT!6XZZ+WAITW@gQmHcXZ zc55T1`j~k13#!xa>Q2hz-V?q}z<~I(n4f1c$G_6?9K}K}!N4rRAT?Z0$q;zG3`z1DA%@5Ex}vP z5}wzEcv2caMSd*a*I0R5it>+uFnYX;t;>2m1!R@fjq87mA>PPNUmh;zPj;|~ISAjK zfX83Mb~ml}mRaLLmv~2%e;A&~2}d1UY|`?E&Ww7>zEQjzd2XA=U0-hYC=UjF8e#NT zH29vl&mvtzn{R2=#;?);c{YRj!0t{IGcth)QS$d!k@CcmHFRC}i7o%h>pnbS-AY(V z3Z;#MJoJq{V9y8(Eik{Jsc%ScX?2O+&@rpS?qK}_8-wQMgUE}^KfdzyY8AqXtx0b) z>u=H5t`xNU8I@Z%uUP8x`wBDT*|~)-Zm6qX&`dp64w^OKYG5^Fjy!*)-0sgR8N@27 z8DDH8zqHtYYXXmBE4GMTizY-mq(Je2JMM z{KfBXm}=9yhD>A`<3<;cXVZ*KTGwA21U(m7QV^cW88wSj+v{yoj$scVd@O2o!tva+ z=&RDTA@`n@1+rLFv*B;YE4yh$=U>{m@6^2cw$~ee+qcCoyV9nZM=x*CdPbR$o)ywMUr?RR*k>tBd0m1x zf^3$UWxWzT8EQ5?zWmihc26ioohK9yYO~htFXrFhPHbWqv|UWT^L%e;_Gz)Owacto zld_B@McPIk0r4t{mDgauWq6X}r%6#)re~3E^J1ZrTm@gpd7u~N-zug;-{?nI*+D6aN+Un+0a&i4B0#PJ+h4C7!F?d)>eShE!_^kGAg-^-4ZUT%0rnW8YP zUjE2svo%@DN%I%9r{KT%CD`7{iP{sw_pX>Tvti?uDfXpyE0fZ9XmNo=RN|x=Kz>a> zp`XM6Jvld~Z9Fb22)A*<3m21Z_YI;!0h6 z8(jRlnM2$X&Ry0u%`!Y&s^Tthh%~ppIbj!WguhZgx&*VMp$5eTq zGoz2^J?37H{EOsN+Cm26!(LbwWZbJWJ1NIexFYn4beXBMU={D+U{lQY#CG_n;NM*%HK*62EwRvR9w)R_~H7tDiUDNH79A*5TF@aBD@AC#K`fwpH30~8& z<l z98V-AzR@O&wSJxE?&Jm{J3bfgF`W7|9Sz3Et?aLtuWz~CD1N%wWcu0p^?2$m^gZ`5 zed*`Qw>}4vx9b+*XWwhMUq>FH?;}<9Dp-{EA8A-Dq0yl#Y*@|$A zPKDd3t=f2)Yz0jY+}y~NUURxG!##w z%+<6f@G_mc4pX_EZ)@pSh+DPO7j;E|wp>4&xitG$snqB#uTWCfDBd8Lia;5%6rL>R z)!kk;P)@TBPLrsvqi%2*6dOU)-1YDr9Ov(^TjX=eHsO#`zErH)SP0!nRr@6<%kup) z2;mlV!ZP+ur6&=3E{d+;$>@E%&QejUeuWLo^O8r4f%-{0xe{N2VUbBUEb6f+g&WtV&*$=iIjaHls z9?2biu6wN^y~j<6nQdm_ta7*~Y1s)S-uAiuX1h%>_ z@s9<@2kc|*8wK1I{x|UDdsj;bU&%%50uC?9X#FNv$$<1aNmYJQ5l!C8HIdBHGUK_9 zW9l^#{mNhx?RkstVz#6bRa7%5A?dNbM#>zNr8YDlSA8CL%%H=kFg7;0+=kGD z^dy$!uGW;-puD?<5T5x>zdg+Pw47yksJ)=3;XAs>QbC(R>OeY!&rWEA@d6q>Jv}A& zM-)onUODYbx76FfBx@;LR^X?^pVIst-Kb3Jl!{tFF8!0Rss8*hnXt0BjC4AkuWfPf zIRU8;bo6r;(eyJ~%(V_hTj^&UeC6}Y!|SFR`Wb?H{lpmIhmT*YP@kW9<5sI$-K(kn zPBQLhOe5k0C3=2uX#twckDuL%^uIkZ2;Ku>HSJ(yTuMb5pk_Cvf$GkWsjFck61?(X zeha2lU==RuhHd4jKd!3bw#-AEB}`&9x^zf7!Qc-z4{hOrGo@kMU}^`8Tz$Iv>c$3t zBqb}M|D0}rCa-1wZxfM;wn>yc4$SYr4g$v65RWdRm5aY|wEkS$gtjA3c058pc5?ST z+qb4@08#P#c3no80DZm`q#&)EkR6j&mt^exk6HGfj@Z!5RcglYLhIO1rrXBtWpTe; z-3;~My7`NsTQAH`Y}@JY-3~X8)YJXTpTEdCSiwc*89?#{p4=$$s`8xk(W;@;c=phF&Zy`17azhlxi1&guIf`TjER7UfRs#DlXKBNnP$ zquJ;AUivpg-MJR8@4}nQex{~)aYLe79@V#m<#Cj24R+DqbE2Aa#bCMXQ)M>+GfKkn zzMtqs{~=ES|or{^fDWDPa8nng$35<1wnDBci!yBplB@-@GzG9hpb5d1R3zj6PEI zSb_(OVv<$F_c1^@b;Hn06v;HjW3My#yzR)NtszfhdFWf2UY8&T8u#9id{Wt}%~GJj(+PzfVmz*6WCV;I*=;;9hlX)FkHtIEqrb^*i}wfbz0~rf zotas%a_&y5*kyMya{UqJK9bP7<4TJw0zj#!%^oc3VSuGP`-9h#lECI0)`U3E0pE71 z2QgpA(>764eaC6pVj=Y1uFC%YwVn5r*|;LTe%obMy&oiziN_v~d|{wnOaocIqS^1kUuqw{W-)S5>>Mw<9|wH84jWB+NRmH?xy@F>>S@%J)zynvGjGYF82*ONQFZ z(5do6l*iu6*zyQP3|GI_c^)K?moc=EJnJzeT4sMyRQc4H>29Nl}tAGUg^GO%kA4`LICPhgqWE zjgPMBh_W*2b~zrec>mfD8alcS2nCeBetyUSs|cB#IgC=!k-4=_CV~GIbR?1}Z*WWOWayQv zj-{ibjH6;tdTE`YSAojZ^RliAPcJVXKE7FM5N2FmL0D_#+rmnb40;Qs7pWKQ^8m`- z6g5n8kQ=Io_y6oB#xcHZ)?9g$*=MOme{CV*Fo*I3>!EmF;w+D*?>a;f6!-f)Cv*L= zQIXTs3Yg+p-hYRD!jso`)8DS8ePUVtt+vQa=*Gr?{F?ALzuMg)t0Cn%<2H@ z2yPB@H{KTWfNo9PSE~#Y8e@Io)#F93i48%y-~aXgA6B1a5oW7Ae1T3uT=ra0Rp`&dr^jepg3=UI>mQ%KsSg{nshInztc7+S=Y1 zyhuYmtF4>9P)#ZX{&^#z9gs1Qs4|d8eZ*Lwo1os8z#-%WnkSH2XQ;vCAI6NJ>H)on zyoOv-Fpy57{xfC-(#=)=0NEG3igQq=BL25yJ=sKo?#|9e31IgF$G0Q<*4|rK&j@1} zi9k|RMj#nTDRYnQiZE_@^h z29nA8-sxlM@Rg_46on^7x3R4X8ORj8JGhA)QX)QDTl@R_H%XkGX^z}*r^9F#fw9>` zLne#7p8ReAbZ7!=NO)wd{ogGS7<3gss1T`zRR}PWboOk~MouiJ;p=D@5mSEh?G%!O zI8*O@{6s+8#3X0wMeCIzI`JS8>Yt5QqSF;wH4U) zRgR<%rUy`cy(KK}o6gI=sMGk2ENqhQCH-&4cF8K9xQu3br2Cs5(0W6o|FC94=7+i- zoT<8qimcTjA4O&QO*;;IOUKVwv$d1bBA>BFUbuk}4L6?+cU~UsHK`1k%^*7v&MI0P z%pRb&3wcB16A*yq3@rL^w&hag%KyuO*M}kHdNtHBDe(#xLb^2N1qJKX75l(1)yz_n zBM+n+hF$S=;u>uj=G+{f>JU?q?KTwZSdWVHd-mn+I9=YQd5yULO6fU}noP{iTP1*t zehYcfzI`JWNDK~cZfk2o=p}_fQYE-66ciYU91FtZ283qaA;k?13a*lc-%iRyX-WbQ znyWS&m+6|xDy3YD!zX_G$Q0IpX*%&Lw96h#NjG~Ji3r&nvJLEX|^Btg?=uOV5MZWdq;2R5PVJ<4X{wwUCu?D0Su>9EaXn2ys`8%L))a*#=Dyex)j|FdzBZ_ zanhW-YScju@fxx8E?J_>X3vJXRgrwHCr0Mb6>=tc=(S_mnz`#DZ1cm&>3Jz=Per+jkoVKz`y&~lo) z{ndrQUdin7Hg>JPXJ2UTZtNFV6W~w7dx22zJ-ABR@Y(XU}eZQDh(h zPAA;-rDSmAo`9tVl*lzX2x=f?!7H0dGNtl+5Qco&dSItCX=i3Mn2QS_Xx`dK(u zWuq-VQ|MJ;F~y0ePv9AN$j?pcpgqxmin0E%WrMK#-QOYc4n?izkTQU_8o6{D|#6Tu08>wJ^@Exzl5weiyO5A zc5hKpY^aXifl0oFN1#dNKITx~TY%tAb7gfxRD6+h1~^XW#ak1EC(FgLtQx|m1m#*R zlJ)9e191B@mc2%9O50HqERyEQ4y+=m_bW{j@#q)c;);9FEH#K56&CIJ(+C{RtXF=K z@Oz?%<4@;e^^+n0!PduIpp&K;$Jjb?oIvVZ>gI$E0ZNB=hi2R@}6V6QTs zi#>qsno?zYW4j8Ap2wE1o*gAHZ?X* z`Jk0HLLZK-Aw+>=2@1p`pWxt~!_@5Hq68{smB$oZ7^*}|m1jz(%$LrO0<)jyYc*H8 z;-M!??4xpZJqhdVFCa|At==56vlZjP!YJBnxg|~VLZvNF)t*3bze4$CR(o?Rm6Gd! zO;b?}zhX3H=I)EPJvLs$%E*mn3#dM3k<~Gf)mcQHkZ-}?4(u<5C#vOM-I4l3 z;js1STbJbf6ate$X2)v{5geGL{-2p^YpSTtpbz5!k0svp2a=^Xw#%Cu(~C{g>^2qj z4Tk23IPMPZ#vrmdZl@#pc5x=Z#G*otU3Os73{=ESl&8J7%2<22^auGj7AUyUsn#^m zlTn`Hh#yL&y#ajh;hM-@TGw-@4Gg0#rQ_!!s^84synR=Vh*OB1sNvoC`>R3hQe*x8 zhkM!`9JDl*7bK!S=*^9b(t5qIok5FQcgnYT$ai(@5=e5%D=8uBaxng(!zD{}aut=K z`x$L8^pQ-?b-jc2^F3{y#?KabBGl_>It_8kEMe_Z@m z&6`@M3u8wbJFJv`fTri?H*MUBnHCsD8{#C2Pz?7D)Qf$NDyMYE*>0hwH;wfkUGA$O zzBzX%e)qf8@}Zoo{X3198@HeQeL6-~l|S&S&AJEgAsRx-Q=|Q3&8HF;7Qq-d3@XHq zkw`Be%ZJfgLh?WEN^g#b(EDyh0{{}sH0jM@WYaza>?z5``}B}qU8e`GpzWr8pjO_- zSJLUCfDoI5#gkqR*yY0hfyG6Rzk;2Ii%oX?h{~T+|e_y-h6kQ#& zWXV9N@NeR%aAP@Q=If+Y&};$o21V6|qCxV&|1H+7FUj}+3+vX+{lCDvqiY%q>GJBA zJCVdb_nYAw--7}sc6uTdAA3CWd;J{@_hMN@mW(?z)Ph#m zdG{!p+l^etn^tINufE1WKKBpWbfXxwjt#^|h z0jiw7Q>!^~^&dYYI{Ls@I^+Qtu3=Jtpp@e&JAOV{5K~FUCv8Vo*XNXNgOhJY?dkgK zNQ0MHcb-X5-U#{KlA1tp{np~U-FFle%$!$Z!U}KSZsEaJkDs4!H83`Kj|Gt91dQ$h z0K#&YZk)NRJ=a0K*CgA*LIj=UDOTV<)_FJomk})Db;5~wS`YsPT3v-j{lU5UK|xkS z#zz);&@dVjl>5_a-{9?fJvrRgZ01vT$x-p!*0jr9iF?rI58)73nB)L~r1>O+G?P(Q zu9<})(Z^*44VRb%j3yYQkM{QUbhrN=`lXS_wFy19BQHXf_aD4fg4sNf94!`je$f>s zCTsL^UBGO(-@lSj448Meyi!CwPAe8Ng?WDY0s=y38d_S^bfz0#uv5_( z5UHbfP!-gl?MQh&3kwN(P?KML!kho~|AaTky(NPFi*)$*&%v-7e}W;&w$0=22h2`c zaj>9_;ICqkpPvUcX&)viAOR{B#u@zc2gu>m)Hl!=8eZRAqRx*>m*G9clWmqj546Ob zR$)=S$}B=-cv6JFmb-VzY}V0TCvo5}GX8aoKM@3FcXiD!TZLWm;P zn{c3vxZ0nqEoVpnyen{zZcXWgWkMM?qX80(RjL3={}0)OuNBbzVz@1}-}Fhz)<5N> z70At#0`LxA*-V&*@xXj@cHOD21*9>%i3 zHy-#QkbD2T^UnpEF{1s~FK{7flz^49qN1YEduK+rDup7UYw(TO3ayxM1Sq->6C|K> z+nSD*`mkU0s#Mo!KIwbr-G~+($yPtS<`=a z#jbn45frUq@cy|I4t<^)Y-kK7CMA9Q-W9VC4Fq5K{w+r@!MflPAtq3pCo(~Il$#4A z(r3>=8mV;X+Lm}cB{J<#=6BZ3UoMfm!)cxI;Aq_?k0xp|)?s@WO|xWg9)_}Yv(LqU z2mS}68oAt>^uk~r{|s*Z%^wY20=Y>?37^?Gf74l7dhWUkOcRmc>py;h%hpn8)j7S` zNCScl-}$FYH}Nvbl$JT>xq>gCwIG@h!U5{(B^eo->d8wjRrc=oyjz)Zc;jz)`;y;q zdAT0cPrjZnzj1|Ka9-G5_L8M7qahZm42Hzn>Y5ERw*GXksbowi;(Rms_t^jw z00&@ngWhE*U!zF^jJ!a2F7uWrsbaLkf)Z{P(BnYb(1!^^koEQTqn9!=ci`L-TCEKi z0m*!Z8X#`13iEgovXN?=oVDssq}&a2<%WxIO${IXbJ$PF{ry_r8#y_u^-Ap`6&gUb zA11#6sx^aW*SwN~!W1>IgmsB-xHH2sEJZGbg*FQG)oQA$pv6k;b=zCQ8xjAcsoxXF z6Uh3n+JozYmZl*1$MEPJfFN1FSGcOoBU2&UtdUz zHal?ue6IwHyL+6lwQlzbqheMB)wMTONl8gp8W#|?x$bszLEWn>i)F=4E|S_s?kfg% zGM>S27zp9?+syg2%q%SEJ9|o|k%Fiy22|l-2eO4nK|%2>HZO=g`OPrs%!2z2K_HT5 z7$o$-(8NTZLqb_OszaACrfG3EP1c^!R}AF4@5)Wz$;thOPYJ8#jJ35rzH-9k2cC%Z zjEu$k`BxcLxQy45_`v^#*H;py?>cfEF!>AoS3U_n2z{wruz)`S%LOqo5WMjrqJ~81 zRNx6GBIDxnoT}~DuYeHI%GW-)#YII_bA&`hcvj#XC(%yzI!g%M!QLL%>OQ}{P&+7s zspr}+asa2Jn*+TWt`z{y7(Bpirk{h}1K$e7Wf(jF)p^FjTn*O>;8~$|9@jH&DtZ={ zpb+b&J}QwO`1}|=z@d)1@Y#9=I|o4?JAkhTLg~ap6SU7%>-8vz0l*-kkkXrl;?&R! z;BDk;*YO(Vlee<6$Ssv@)|d!y5d2(t3WMJAXnS_jaWxON+cFh#R76GH1O1-Xl%a(M z4%lokF*VgI>g>U5e}6j^25ODDPH3NhzGoxsp0=vuzmG!+Zb?I6=gg6jmlxQ($Q0A0 z`vkVHedhr&3#^f(1a)6^b+z9DSO(z=yeJtlZTy|Y#{(N&ABMjCO%9h3Zlt(1EM#hi zBg*UwW;P&eyr<>-L0h{R>8>Q7F*5*2W#3&`unBbZkRXsL%+A7+l;=qmY)@Bp1L^O0 zr;LTOA#7}5l@|I>@VxRBNd`=|`$(_2;=b8LZFES9m4GY+0N0xRT_ z`t~ZsGCq|7OzAx1nw!N$dSJSa&I70F;T(X3UqZqoBVV+WfYTopJt*Bmo|+D`i3F|H z_JG`)gp4dUCI$@^^|4y{YX(9kMMcoccYk9~0h=u;fc#3ml9Q*w%LOhF$a>*1gAq&8 z5VXIvVlbG}Jykz61Gw2O-4T{SgLd(aqe&7gpVgcXJo2`B$Y}8pRP_vxA3wL6Lywb1 z8#gdE_H&5`DZq2YQeQlu9r{2S;mq9JUK0+?WnqUT(2Es>Ba$p0{7Ml+-#&H*^5!ye zkcm*u(#i@ia%2F?Tu*<7V)RKX^e8V}5!kL7BKj@&pHUD9KB&AU(-=c_balnr0To$( z;{758&q|lxsLLD{B--*7-$ETBZ$!{|hUDj)NBv74Sk^Gl;Nt=PtH#A)qZJrRfJ4#p z(h@Oj?}QFqN@_l;uB8^tbp{6qVfooey-SUk*ArRaYcAmx6PyyG06!H(^iu%NS**dvqUKjLU;v;Ko?is`S~QQ|3Dl&Vu&5WF{{8jqwXRzf zb^xnGw1W3-b;Z1z#z+`ez&yqCovNprXBr-@6*@seO>~oX5ju}2MsNHAE*&GaCu}R1 zw8Fx|s{X~!!9g>JOUG~b)VpaKdALkF7TPuQA=W di;Q00z@*9>cTE3f4rv+XmAH&pzQ}uz{|DbObM*iK literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/PyCon2008/bc_rules5.png b/doc/sphinx/source/images/PyCon2008/bc_rules5.png new file mode 100644 index 0000000000000000000000000000000000000000..88ee09665ab1f56e038debc8660d9aeca36d6748 GIT binary patch literal 36522 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 DpS<&4 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/PyCon2008/client2b.png b/doc/sphinx/source/images/PyCon2008/client2b.png new file mode 100644 index 0000000000000000000000000000000000000000..405d9f856c01411f1f8acc0fdf157c75b4623ffa GIT binary patch literal 29020 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/PyCon2008/client2d.png b/doc/sphinx/source/images/PyCon2008/client2d.png new file mode 100644 index 0000000000000000000000000000000000000000..27c4f52ff37199132ee5c4a51dfe23824b488c96 GIT binary patch literal 29533 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 z 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 PB8V-Uwy}!L+|KdLwsHf%J( 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/PyCon2008/client3f2.png b/doc/sphinx/source/images/PyCon2008/client3f2.png new file mode 100644 index 0000000000000000000000000000000000000000..a846cdf0ec8fcdd3323724924dafa6337e4cdba9 GIT binary patch literal 53765 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୎=-n}4!XI>B7)vBbc(7n~R#FzOFbyVX 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/backtracking.dia b/doc/sphinx/source/images/backtracking.dia new file mode 100644 index 0000000000000000000000000000000000000000..dcb439cabb32d2f2a073f570c70e1075292e6b99 GIT binary patch literal 2103 zcmV-72*~#ziwFP!000001MQt#Z`(E$$KUfQJonXQc)!$5igv)ThXH$7_iV^E<7ic+ zK$4UCWuJYAlDovVoQo``QA`6ZV1eNw>BB#Nhdib~e)@iu3~p>*#94YaBnS@&Hl1bj zI9;3#|Ni>hdp-Pge)4f1M<3wdB9E>H@E2*}-kl9E%kuie>FMq5ElO5JRAxC!;w38V z>Az8uM5j>bba;L;7~HR59+i=MwtgCwWgbtLr5&Wvl|36yquIAbo-Nb)ur9SOH_MVN zAKXOA+3?*(^%|b8t2y1M=YhJfqlKO3Hu|=|Y78%9+EjgQ^X+P{uCpSBBIW9Or^udq z-2eB=tVzKGLZTQELJJs1=TX532>Ef}VX z{TP?$o14C@x#VTdFQTM)N(bu4|IfJR&fY~H&mW$=8zuJCavRUf%gJ|7!&TS5@>KgxT*TAFHnl!Z z%g(A_byNNJr&B5T-Jc)m4RvjMmx#Hx!iwiF5sPI!x5XoFwpnIRO_%Fpr;m;LcDbhx zO#NtU!LCds(aPrQ>c8AA)r0j1yjGlhqmWJiv9ogBy}!yRok#h6@P6>selLgj&|^4= z=V!w|@#gq!_XuhO>Dw8g>+H^pG%}i)5g|xzcYIei_Su+Dw@u{GizrQ$}`}iA|S#y4$s}wW&T2U@FFk z8G^NakzU#6kI$ydtJ>C6tu$)O^Jc(J)uin?aMu*}$i%82){4_!f=Cw<#I+s~iMV0J zvkFy~IN}n^N`|WU3K^xz>(`+#L5I56p+?^eQq)5!qFqQ46C+9x6P|Sl%n*YZS<{fD zV3s1ydO$u0AJqvbc04(-&-mqZC(UW_`&i(kaj^c^@%675sVn8d`u;x6cc9@e3-s|Iw_X3nYHuc z$RGvO#y6%kIiEjB*^=l0DV;%z=mJtyg$!C!>6cZ6a(0x&yh0Vt>Bz-Py6tNEEL3Ug zWHYg-s#&b{a0F}#*z#(zMRtHKs-8=RcomF0Ll_IkF2qpccK0NqCa}v)dh$6S$s*u-BURiChj40w%E1(yH2*%8rl|*=_mxeAjY&F#uU~k3B&>qB~gJ`j+AhO{ALVvu$_zXB=T_DJfF%VaMaTti&8Mc1Pdt@ z@CpySa^$>14$tHjNYvYv+G|)-o8ibP2x=gJ;7Uoi!y>d`ub)>gqBse#(tQR?qw{$~ zm2Hs@sL~m#kS_9hmBUsch4D-)Tvm9Zg>bN<1aWqyl;#CsWw(nDK#gfV76DoUw7gnq zp&dXAuV#|Q*!ZOuu;T(6h;b`wp+GGz#BLqg1ZsH;)Y9aA0b6>AEvy4Ideh{UieQlY6K0b7n9TX+}P zV(L^#;Tu~_orrR_bQBFaq=re zoVnnM8_M(;mO^Hz903_&OndO%>3o^klfXrOv}niu-U1Slqtl^-^LvSLixQQHdnFMV%|QZAslhNnIkTGa5}LZMr6j7JN$KCf1`jD5CX4iIfQs%2cw20#Lmk>mC%`MGt7>>I7hb@$JayOpK z*7AGfjN*z_dBjFm*W(c;M77Do+JDWe5uoB+P404~P@ zE_+1c@Qh*!Q;2)s`Gx345@&`HBDuT3*KjJUL><*OFaGJl&2A4HMFP8XS=IY%G{M)Y z25q2NF+(7j3?gy#(aqt>z6v4@>hfE)=OZF#h9RvKQ*IMPU`5;+r51fSt%k{&mm#R> zd^5Ju`@+Qzef-G*-oatDyZaq^zDLvj-T;I&6l91pMBJCQ8DjlNngL0;wRzZG@o_}G z?R!Cm`lv!(WD&co>Wt^ZX=ej-Cqixw2w93_>WVk%u$t hZ66Hh(?3;>>i5-;Se~D3{L1C|$$u>vF+mM`0058q7fS#D literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/backtracking.png b/doc/sphinx/source/images/backtracking.png new file mode 100644 index 0000000000000000000000000000000000000000..410b3df0a0bd58d97a2366e73e84a5d81b3754f8 GIT binary patch literal 27401 zcmbTdbx<5%6z@4W!QEYhySux)ySuw23=rHU!GgQHy9C!@!9s9%hu6Qi?``ewAG=jM zRWJoLJ>9qa+jARf+e(D z8u@;clAy4DI9E3$-PW8lipyTpu^#ud+o#?f0uf#wH*qtdoxNAYn@^b+1qJ0E<^JaJ zadK*EI@l%Q!P>`q^I;E7yl-G&fXJ`}rmk+$Q?UP@XTCPbC~Q@r5#oSfbdbZn;e2ph?VF4iZWnX{CO8rf+jjoE9fs)UJfx#oLs ztTsOUi=#xUg|>KQri!1V%jj}LnopB`Ob--70=eE^yni0t520`?QCQ5kpm@=JgG_3< zWQ2_iUYd?Yn-j*P9gc(*xA&=BJsS8AG4gU4&$h(3G_|9?I}>9Ex+52LwH7{H>>g

RAI6IR2V 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/bc_backtracking.dia b/doc/sphinx/source/images/bc_backtracking.dia new file mode 100644 index 0000000000000000000000000000000000000000..1c78bbe7f7a59dddc4fa7f6c42d4c3e901569017 GIT binary patch literal 3149 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/bc_backtracking.png b/doc/sphinx/source/images/bc_backtracking.png new file mode 100644 index 0000000000000000000000000000000000000000..de55603e0b486f3c6b9259b0a46afcab9aa96623 GIT binary patch literal 40243 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/bc_rules.dia b/doc/sphinx/source/images/bc_rules.dia new file mode 100644 index 0000000000000000000000000000000000000000..c3928ceb50c0ee7d4077bf88c7aee5d5e784c95e GIT binary patch literal 2845 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 literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/bc_rules.png b/doc/sphinx/source/images/bc_rules.png new file mode 100644 index 0000000000000000000000000000000000000000..ded9412c52a8c53987159b4bb3244336928f9e4d GIT binary patch literal 48682 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

#5*bC;4snOZF(JD@}o?fh(r7S6>ZT642gu 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 apkI_{f8>e081nt7Ebu&}IF5io>Hh%lS_7N_ literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/plan1.dia b/doc/sphinx/source/images/plan1.dia new file mode 100644 index 0000000000000000000000000000000000000000..c3038f2f083d9fc7aa66b5ace356cc15291f0362 GIT binary patch literal 1066 zcmV+_1l9W=iwFP!000001MOK$kK#BGzW1+)(pSdhfk`qwFwz`Gdl+dCyL(0^F~K{= zMviHk%l`H)l5|5}JQ9NXK%{=el)ukauBy)o-@d=CxbaF=!lam(HnL2Eicm&O#1r$M zzkh!5&F|BvZxJJ3;U`vPWxx!P?C&P#QtS2C;c&a%BECzAmI`sUK?xoHM>r=#FdCZE zC&M@fh=?Zpv3!(ht=N2{sUgUUPRuz8f5%F0L}X@Gxm_r^RK_de6Z3hIUgj`|85VF( zV6RC`=Zccw&CnKHLC^+zO;s6owU!A36TMqkOd4?ZzmIHks|1WhJbnH}wWjJhTUI`J zz^hwqBavPa6*E!gg81+(7!Ja2u)oH(k6p|0-1oR#PdC3W9ltM~x-T6|W^1XmB1~5) z=TdS?M8>MshPLNPLc$@%PPt{bM_(|l<(c&_2v06?ARGRuxNEC7RxCPQyakH}lr4+& za`x6!xH9xzPw1~KVRKIFR?mdK8T{@x@a5e}JNRLG$85;Z8YLp~DW>>(iHJ8WqRE*w zE7~+5EpxNsxu}=zE)7gJR1)lzf|DIpIsA`N;*ibQ(;E7+Bei*P~^$$~1o z;ly~N%{FPa6uORaKW;3@it!yR3|LJg(Yt*=fWpqE{z3UG)hr~(ZR`3KRPwBLbNphi zS)*>G#g z){ZUH%Se&!Lpu7F4vYfm2-ZV6?xq}0SLJ|HzvYbGUX=qx!W%oea@a0%9oO$&IXXIa znQ}NI4|jhMcqqpwRgQ?Jun*zrTR3bRjqyV|ZYUjpK?9D6ia4W09 zN8P{(`ys_K^>oGR`X58oxll4}8zxSF&q=f=bTx k=TXa#TK=eIr)w=|_vyDx)2G7MP}8UX0dR&|(XJu@0EuJ|>i_@% literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/plan1.png b/doc/sphinx/source/images/plan1.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee9ea6e090aa0a27e450124fb4bf05a5f2af1be GIT binary patch literal 3893 zcma)9c{r4B+kWhmlr>En%P)*=FcW3VlAmPD&e*q+eT%YY`w2-#$QC0^kt|svOZH{R zS_lz_B+|&1eSG)#e#i0s_a5(iAIEb)_gu&G9M9a>b)MIG-U){KH_tHhFhdY@Mq5k6 z7~Gq{6$qmRGyj8oSa72YP}eqv!C=#5gL&}tl%JMm00c3O{O?86khuIDg3eBAYg{)C z&izFQ*E7NLlML)pZy6j}#H0&M9~!Z+pA&)$YJTn2VZ5p*Fi$HVl75?Ql3wPDGX`EK zk3QW~opswejX}-^7Tx~f!apCO&Z&nI0*14?r^&TkZei%@GwaH`xnYsJHc=)|d|QvXz33v2Hf~m1e}U;$=PV5tjIP{OBzT?Urs+hpboQD% zBAAtsGBR6#eoZ@H)@#LUdhoJ-O8a6TfeKN=Au!06BN54;xxa}pp4Jp4C-fs31? z2C5su*LadN>)1ST%lN7pzUI3tpJJF;{Sb2Yr@GWb%i;)1J^qiAl6aLv$BvHBrfvQp zrmV!sHxhUAYLcdewDj`Uz8*5b%}q;)LqSPNNl}qGRy|goMrNiV;HCgurA1k1Jgcq{ z$6jYoPfvcn0C%D=8%$h6!d;dJzj#-XH=}HHMasTqjZAJQ`=zF)nu?D%HumnHWVGk; z(j~9lV+y)?^JY-cJM+>cJbq|!&`gwzIo9cfdc42CkN#U%S2rx|aAqb~OGrmoHzuL4 zudlniJ25fQ+uNH!ApF#k5))flU0tP6@}52O_wy4)p=_|3S59iXt0LGYzDHw%r>3Uf z3^q_$X(1#MdDX?F#Iz~!*FP7Eii>v=^pKoBTl+_wo10{^BT@Kpf4@0+gVv{i$)7KI z_hj{QO?z5eT6B5O{8Ruxj!Rlvx_)DOW%S`gn23l7Pg2j4e{pfKlrzD1imF~ zZ-4o@wUw2+y87OI>YG+-W5vM6#>V`-12V180ewwbnS5%fQYy@8T0zsm#>Pfpe`sBexRN4x6YS)v&Pxl_(9n?GZh2;ArXF(CqgIh{mUJiQO#KYU+6<bbl%jl9264`Qp-{0H&OedP4|Bf{Zw2g2L_Zg8JCrTs>V(5J*!UP3ePmTV zs-#R878X8y_%LWTB)*e;e~%nrRaJFScf?>yG}0_?EqW}+f!do{n4cou5ut{^&PJ!e zc%9`NoF4N8$JX_q1NnXQ8nioD6gQ@%u>UmOW;C3{-1^sWE}aZC z{Dh%WsUV@|ue3@`0|Nu4BqiHPw;*VCcGl6+5yjolTnkEQS-{=#gf|~YL`g|~|MsnI z+@6(JaeHm5=HMVSC@2Vmo)7!_`ifW!xC@Zr1q}_B0&Eb3Kp-mYTU+Yt7)Jpd1utEK zAU$Nwix>1g(Y|s|aMbR#wYAvO=N%9}!NI|R(v2)u<$qSkODoqC9zTBCzx3jV5c{{R z6C*5kd2x{rn)j2J^PL^@s6CNh2J|4;Xn_i_@~gZp()x5A-+l*y6;EFtBE--⁡|~ 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 KH7e8{{`ntqF=A2x literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/plan2.dia b/doc/sphinx/source/images/plan2.dia new file mode 100644 index 0000000000000000000000000000000000000000..4179f3bd48c7ccb9edaa921d77fb301134830685 GIT binary patch literal 1200 zcmV;h1W)@PiwFP!000001MON%kE1vczW1*{^flvv!C`aLV<$%2oB1fiGX*R+08fMZ#h}(@kLL8s&Z*FdokI zfBydd3F}{Pd{%#BQ&CmBTE_`fB67E`iL~fR{~yT|Qi&4c;q&7UDkT+< z`Lc?^gTAK4wgSl&5h3GsEajglcLoH=^3uyOF|rKkT6@1-54X54Ty$SJabGx=%-6Ay zf-qT!T*Pri3C~fb*wF4ciBBRGVyDb9yK8@8QpRW2|3aeV5(Dz#_l&zXdqcs3)5%+s zXwkA|fn3ht269)feK(NySC+6vM4ML6xV)MA-EGuYcPFdhhv_||A=lPQ5do%%qU$Ll z+^~QqXTq#3)1qlvh)vIVy()L9WAdR2VP_B#*-=rb|8}5it=QnA;v9J)Ui_rKEX?~J z#an+#gw#H1-{Lp@(0ZuGg9S7FPowOgszpkhDt$Evt>gD7vVmur5KSE5TBvGyy>7ID zEEZJ^q0AsWjOZQ*;~dAq=*cvI;hAuP)4Oh{G@`4y9}8Y@5^if=29#Bkx{3Qrf`Dmw z$Cup$Ye`wSltd7=upQF_c}6KXoHy^s})c4~17S=SP|OUs4I`+Vvj zGBF2|c;_X90gq^7iWfsGxNwl2WXMg7pq^mO7JV;KE_RPz_| z6>Z*9$~UV9-af_LP2|%?pwk0)bSD$DFPW&O-9{5t+?_$W1OnU3V348`2UxDF?qGU1 zB$f0x?h+=kfQunI$~AaTCb35*8JbD9OfCaKwj+rQO(Hh1t&~Je6SyOb+>J$GUlzdt zW!pA1jVK%wzVnER671Z8Ms8r;Wjq3H7xh0Rj6Cu|c_g5j+L1IZLqYLvPI3}7vfQL+OlqPiw^5iLk zL=zj}Ay0pOZMyIgqC38R`Ym5S!ST2^{HrH4v4Cg8@uYXBlb+MR5lrj0J0wjwz{ALc z3dZp~2dP7zhaH5|?+P%soxz*Hs)6l|VvjE!#`f=nwtuKk`)BlR|ML6nOQz?C(x*<( O5B~xBdhg;AEdT%dWsSmqD8bQ;fE-R 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 XQBlT<=kO3g{}s|wN2$G4v3vLrPs)*c literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/plan3.dia b/doc/sphinx/source/images/plan3.dia new file mode 100644 index 0000000000000000000000000000000000000000..60773894244eea7f5b37bbc1c3e15006c04646ae GIT binary patch literal 1297 zcmV+s1@8JEiwFP!000001MON%kE1vczW1*{^ff~;U<{K3?wlhhxCuMN zM8@fKF8kZJc%&0vc|geav_R^XAVqyHv z&A8y_gzq)=*<3LCtJ$>B_wCdh-4f#KAmdb)yfsyqWvmZQPfiPFleaw|86(nYTuY@EnF2 zzMdldP2jQk%rYz5G`D|Ls84O8$WJigPpz(fl8_ zka>9D!)Uu$QX!R3%D3oMJxC7_9)UMi|I~}~Q;rC{LFubZ&^mfsMV96|$iO44Sw=bV zYT0PQn9s`)0-~VY57`@xnZcN3f^-d8$QThgX@|)|wwf&>!K(`4rm>|sX(g$~x33~t zL%Mr>SRJsIEby1I84PKzUN}%Yuy`45XEoaKJSkp-vZkI_B*aoUx`x|%mh81MOXcEF zvT2%$R2CNON-7eB1CO7Xn9;@3Xb_VpDsU5>M_ksSCfAi`x(dP_3=WW0C6>FSR6x#W zxBkJx7bb%RJ+5fikD#*FY9EkOTyMJ74YXK|>av!A^0OgpZ4E>6c0(&t(}_Kdu6F|h z;pg)etAC`7Z&o#&eTuc~h^L7>#|PeMPb8=-kzmcX@W}0#MzDt61O!L~kO;vegnA~C zu5n#LA*Mzg10N-saZd`d1`6q$LbicidV+2T_P7^&fW{o?<9_sEbfph?UL<*LNm=ia zKoS^~!59-{X}X;-NT=FUN-zz9|G5n(5ePN+I?@ zA-AEBzn}_xRCvH3KLXBbD8%eaA$#g4n%Ugx@{s3`?g)c@(9y_cn$bh)Q zANyaFCFD$Acx9A!dzHhlFkfb69n{>6@|#idW~18XE{*6mX>I*BX>AeRaFVpfmTpdf z1#Hu@A&p#%nD#qK?maiPuQx+-f5hZA`bh5c+dh1QuAvQ^by)ql*S4XJ5){k9N#D@H zBQyEmbK9_6U>Eic$?&r2L%wVpUNqgKRftEx@&+09cz4?4**6e_Y4PrrE|MJ{b`8KW z9m~eqCJ#HwcLW3^VgFLF5@NGp#KSJ{qX|LWMF{Huj}RnX6I%zZku@!POl%+-oPwBm zVriz8zd!C(2zCwZG975Tcxd;3C?V)GnS5|G$iTj3ASl43)o-~&tN&gy(D_Yzf(CGd zOGwre#Are^TSvr#V(vIPa^6W#Fj>H@>19xXAF&-sx~jnJJpFq8>7np>`_sdJI(Dxh H1~&izh7F2e literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/plan3.png b/doc/sphinx/source/images/plan3.png new file mode 100644 index 0000000000000000000000000000000000000000..d6682430382b247a3924d504a7a0ab65b35cdcbc GIT binary patch literal 7457 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 E0C4?s6#xJL literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/rule_base_categories.dia b/doc/sphinx/source/images/rule_base_categories.dia new file mode 100644 index 0000000000000000000000000000000000000000..bfae3bc331bf939639ab158d7a71c1e2275021fc GIT binary patch literal 2493 zcmV;u2}1TCiwFP!000001MOW~bE7yGe(zu5a=*G2Bq5N-lT20b*3>+7)mF{SKD)3{ zY<4hsfn5ADzkMYjiMiQ;04G_wsxKk3J_I`7cXZAX{QS%F-k&}4DE7kOb`F6tpYdQ5 zx?Zroo&WpKU%%1$FLz&lc0K1O@n;)3`BZ(dcG=_hmLa?Z9;sM;^xYET0%y-}=WA#4*ER|t0(YLZ%G+&1 zKa6INj(sX9dYNc=B^F#VXRNr2OgEX-5ajvu!fKz8`m;<{SzHuBu_##?C7(94tOCcD-1NS7`+Ot zQwZNV@+j~A`*Z<+0Bp==%i4(X^+3k<1R_!lzY@v)DpK zy1)qi20$g7nSf!6es&j>gX6kIAGW&y{;n_BTpxnyy5;(k!$qElj14uy$hJurxj6&owO$!XT*wl*ecH&ffEn;=G(7 zp3hQtzMWISB-wX=}5?w7P2z!NOL4ai< zq6Svp4Z>kH#LPVQEGkJQ6&l~OO)UyWZ?xHQ=kl?;Q~YYrb~zc zM3^qbK{l$7syMPX3WWeQZK6)=?YvaL8ZBCD$T%9ZKgR#{uP7i@{rH^H0f9v%BN$9e z$5hgRm8HWJcMXaAhQz;P%7?%)a-1c!0b#cI!5n#oqdvHn3ZkTfS~T9DXoQio@wrxw z(N)6&a3S1DTdy|;5{;8s_zy4OHKJh-AR2O&XpJ2aLxQ~piisFrN=!=Z1p}BNX7vqM z2EmF4ZaS8(BW!Ycdag~xMA;n5r%;!)>ZB)uyKQ6nM#V3qYL2XQM#Gpi`4}c` z0%)2nGijCvx`_!bY11Zx_WQ7DAxIEIZPnVUPpleW$E+=7v(9I;4AhNj*hDPom?dGT z$t-EumT(^B!pk=B=!RW8$R=O2|5{Mn_B*xhvUzqh?xAd3uBs1(!E~!pu`iY9RL#9Q z$B_X{QY`D}T2ocA_P zP31D3D=ZsBJu20ZU20j*RkL&jsI6$}RMXNGv8k@5b7jkg%Fb=&_Yhp9GyKB$hV>XrCSBexD2IMZ(a>a zpLb9??|G;VI$sP;cL`3H!qdBC@2|F8OnFB-CXI3Gv(e4=vFd?}Wcr*k6g&Jn8ZI^7&fHtJIS>33h73z~K zl$df{Ovhx!pAUk@8n?o0tr}CSC_q}PCeW(Oc}EBb(kfO-w~rK3#DO8OHa~eeLrKpi zC@-fdS!0T_F-bWf8K93v1_V&Vax%bhDP+Ym)4D-Ii20tlAk{m~1)2*wae-Jz4nhXm zk&~i@v)u5f^tMl)==H)4SpC5o_5uSu>Vq}xg^*o@(tV3W?n1%9W_tJY``-Nw$KHBS znR%aK*MTv@u7jqh0HvqYT(*V>c)mvq22$S5fQ4kz` zC|tQdl`WuE;z7Mkn7lZ3plyUw)27)u!6cNGN+}gm%9Pe7?WI(8fNhnuuzS#eRPP_u zK{2g$A6@IHod(5pdFz$cZm7+Ij4Wj0ZX&^xP^sQ6WEtrs85#8fwiP^T4E5}bPrh{2 zVx+}r7%>vI4U0UYrD*E>3^E4F&zN!`te4so{3x?vR+@4|EGQNa98pDNQ zGJB;t&2Cp=x9XhL?Do0X4GqL@B=yGW6!exsp_Jbkpwz-Lpa4G@zx|U(-XnK4#a)@= zY9_AcxOd8NE%yAicwONTFP$DyD$F(0M9iq H28sXxo&eSn literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/images/rule_base_categories.png b/doc/sphinx/source/images/rule_base_categories.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2704f1812770f532b9ebb9415931b565cf88dc GIT binary patch literal 23617 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 IB{OQ@uWA58NB{r; literal 0 HcmV?d00001 diff --git a/doc/sphinx/source/index.rst b/doc/sphinx/source/index.rst new file mode 100644 index 0000000..9be6569 --- /dev/null +++ b/doc/sphinx/source/index.rst @@ -0,0 +1,100 @@ +.. $Id: index.txt 7e7a566ccb5b 2010-03-04 mtnyogi $ +.. +.. Copyright © 2007-2009 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + :titlesonly: + + about_pyke/index + logic_programming/index + knowledge_bases/index + pyke_syntax/index + using_pyke/index + examples + PyCon2008-paper + +============================= +Welcome to Pyke +============================= +----------------------------- +Release 1.1 +----------------------------- + +Pyke introduces a form of `Logic Programming`_ (inspired by Prolog_) to the +Python community by providing a knowledge-based inference engine (expert +system) written in 100% Python. + +Unlike Prolog, Pyke integrates with Python allowing you to invoke Pyke from +Python and intermingle Python statements and expressions within your expert +system rules. + +Pyke was developed to significantly raise the bar on code reuse. Here's how +it works: + +#. You write a set of Python functions, and a set of Pyke rules__ to direct the + configuration and combination of these functions. +#. These functions refer to Pyke `pattern variables`_ within the function body. +#. Pyke may instantiate each of your functions multiple times, providing a + different set of constant values for each of the pattern variables used + within the function body. Each of these instances appears as a different + function. +#. Pyke then automatically assembles these customized functions into a + complete program (function call graph) to meet a specific need or use case. + Pyke calls this function call graph a plan_. + +.. __: `backward-chaining rule lp`_ + +In this way, Pyke provides a way to radically customize and adapt your Python +code for a specific purpose or use case. + +Doing this essentially makes Pyke a very high-level compiler. And taking +this approach also produces dramatic increases in performance. + +And Pyke is very successful at this, providing order of magnitude improvements +in: + +- Code adaptability (or customization), +- Code reuse and +- Performance + +Pyke does not replace Python, nor is meant to compete with Python. Python is +an excellent general purpose programming language, that allows you to "program +in the small". + +Pyke builds upon Python by also giving you tools to directly `program in the +large`_. + +Oh, and Pyke uses Logic Programming to do all of this. So if you're interested +in Logic Programming or Expert Systems, well Pyke has that too... + +Pyke on Google Groups +===================== + +Please join Pyke_ on Google Groups for questions and discussion! + +FAQ +=== + +There is also an FAQ_ list on the sourceforge wiki_, to make it easy to +contribute. + diff --git a/doc/sphinx/source/knowledge_bases/fact_bases.rst b/doc/sphinx/source/knowledge_bases/fact_bases.rst new file mode 100644 index 0000000..180f85f --- /dev/null +++ b/doc/sphinx/source/knowledge_bases/fact_bases.rst @@ -0,0 +1,78 @@ +.. $Id: fact_bases.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +========== +Fact Bases +========== + +When statements of fact are stored in Pyke, they are stored in *fact bases*. +Pyke allows you to have as many fact bases as you like to help you organize +your facts. The fact bases are created automatically, as needed, as new facts +are asserted. + +Facts +===== + +Think of a fact as a simple statement_. It has a name and a set of +arguments. The arguments may be: + +- strings + + - proper identifiers don't need quotes: ``Fred`` is the same as ``'Fred'`` + +- numbers +- None, True or False +- tuples of any of these (including nested tuples) + + - singleton tuples don't require a comma: ``(1)`` is the same as ``(1,)`` + +Duplicate facts are not allowed. An attempt to assert a fact that already +exists is silently ignored. But note that to be a duplicate, *all* of the +arguments must be the same! + +Currently facts are thought to be immutable, meaning that they may not be +changed or retracted. That's why dictionaries, lists and user-defined +objects are not recommended as arguments. + +Case Specific Facts +--------------------- + +Most facts are *case specific* facts. This means that they will be deleted +when an engine_ reset_ is done to prepare for another run of the inference +engine. Case specific facts are asserted through either:: + + some_engine.assert_(kb_name, fact_name, arguments) + some_engine.add_case_specific_fact(kb_name, fact_name, arguments) + +They may also be asserted by forward-chaining_ rules. + +Universal Facts +--------------------- + +Universal facts are never deleted (specifically, when a reset_ is done). You +can specify universal facts in a `.kfb file`_, or add universal facts by +calling:: + + some_engine.add_universal_fact(kb_name, fact_name, arguments) + +Typically, all universal facts are added once at `program startup`_. + diff --git a/doc/sphinx/source/knowledge_bases/index.rst b/doc/sphinx/source/knowledge_bases/index.rst new file mode 100644 index 0000000..451c193 --- /dev/null +++ b/doc/sphinx/source/knowledge_bases/index.rst @@ -0,0 +1,105 @@ +.. $Id: index.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + fact_bases + rule_bases + question_bases + special + +==================== +Knowledge Bases +==================== + +Knowledge is organized into named repositories called *knowledge bases*. +A knowledge base is like a directory for files on disk, except that knowledge +bases may not be nested. Therefore, the *entities* within a knowledge base +always have a two-level name: *knowledge_base_name.knowledge_entity_name*. + +Here are some examples of facts you might see in a web server application:: + + header.cookie('session=123456789;remember=the_alamo') + cookie.session(123456789) + cookie.remember(the_alamo) + header.accept_encoding(gzip) + header.accept_encoding(deflate) + request.path('/my/site.html') + request.path_segment(0, my) + request.path_segment(1, 'site.html') + request.path_segment(-2, my) + request.path_segment(-1, 'site.html') + +Note that three different knowledge bases (all `fact bases`_) are shown here +named ``header``, ``cookie``, and ``request``; each with multiple facts. + +The second part of the two-part name is the name of the *knowledge entity*. +You can think of knowledge entities as statement_ *types* or *topics*. So: + + :request: + is the name of the *knowledge base*. + :request.path_segment: + is the name of the *knowledge entity*, or statement topic. + :request.path_segment(-1, 'site.html'): + is a specific statement about the topic of request.path_segments. + +What do Knowledge Bases Do? +=========================== + +Ultimately Pyke is interested in proving statements, or answering the question +"Is statement X true"? There are several different types of knowledge bases. +Each type of knowledge base represents a different way of doing this: + +- Those that contain simple lists of statements of fact (as you see in the + example above) are called `fact bases`_. + + - These determine whether a statement is true by simply checking to see if + that statement is in their list of known facts. + +- Those that contain *if-then* rules_ are called `rule bases`__. + + - These determine whether a statement is true by running their if-then rules + to try to construct a proof for that statement. + - Rule bases may include both forward-chaining_ and backward-chaining_ rules. + +- It is also possible to create other kinds of knowledge bases that determine + the truth of statements in other ways. Pyke provides two of these: + + - The `question base`_ which just poses the statement to an end user as a + question. + - The special_ knowledge base which has several special one-off knowledge + entities to do different things like run a command_ on the underlying + system and examine its output and/or exit status. + + - There is only has one instance of this knowledge base -- called + ``special``. + +.. __: rule_bases.html + +.. note:: + + All knowledge bases share the same name space. So no two of them, + regardless of their type, may have the same name. + + diff --git a/doc/sphinx/source/knowledge_bases/question_bases.rst b/doc/sphinx/source/knowledge_bases/question_bases.rst new file mode 100644 index 0000000..32bd588 --- /dev/null +++ b/doc/sphinx/source/knowledge_bases/question_bases.rst @@ -0,0 +1,130 @@ +.. $Id: question_bases.txt 4670da845e46 2010-03-05 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================================= +Question Bases +============================================= + +Question bases contain questions for end users. These questions can be of +various types (e.g., yes/no, multiple_choice). The questions may be +parametrized, with the parameter values substituted into the question text +when the question is asked. In this case, different parameter values are +treated as different question statements_. + +The answers to all questions are automatically remembered so that if multiple +rules ask the same question, the end user only sees it once. These answers +are erased when an `engine.reset`_ is done. + +Finally, questions may have *reviews* attached to them to automatically +display different canned messages (with parameter substitution) depending on +the end user's answer. + + +KQB files +========== + +Each question base is defined by a `.kqb file`_. The name of each question +base is the filename of the .kqb file (with the ``.kqb`` suffix removed). +This must be a legal Python identifier. + +These .kqb files are compiled and loaded automatically when you create your +`knowledge_engine.engine`_ object. + +The .kqb file contains all of the information about the question needed to +ask the question, validate the answer, and output the appropriate *review* +text. + +The .kqb file also specifies which parameter contains the answer. All +parameters, except this one, must be bound to values before testing the +question. + + +Example +======= + +In writing a program to diagnose car problems, you might have a +``user_question`` question base with questions like:: + + engine_starts($ans) + Can you start the engine? + --- + $ans = yn + + mileage($ans) + How many miles are on the car? + --- + $ans = integer(1-999999) + 200000- ! Wow, that's a lot of miles! + + noise_from($location, $ans) + Do you hear a noise from $location? + --- + $ans = yn + +These would look like the following statements_ within rules_:: + + user_question.engine_starts(True) + user_question.mileage($mileage) + user_question.noise_from('under the hood', False) + +Presenting Questions to Your End Users +====================================== + +Pyke provides two modules to actually present a question to your end user: + +- ask_tty + + This presents the question on stdout and reads stdin for the answer. + +- ask_wx + + This presents the question in a dialog box for use with wxpython_. + +You may write your own module to present questions to end users. Look at the +modules provided by Pyke for guidance. + +To ask a question, Pyke looks for an ``ask_module`` attribute on: + +#. the question_base object, then +#. the `knowledge_engine.engine`_ object + +If the `knowledge_engine.engine`_ object does not have an ``ask_module`` +attribute, ask_tty is imported (by default) and stored there. + +.. This code is hidden. It will add '' to sys.path, change to the doc.examples + directory and store the directory path in __file__ for the code section + following: + >>> import sys + >>> if '' not in sys.path: sys.path.insert(0, '') + >>> import os + >>> os.chdir("../../examples") + >>> __file__ = os.getcwd() + +Here's an example of setting this attribute:: + + >>> from pyke import knowledge_engine + >>> from pyke import ask_wx + + >>> engine = knowledge_engine.engine(__file__) + >>> engine.ask_module = ask_wx + + diff --git a/doc/sphinx/source/knowledge_bases/rule_bases.rst b/doc/sphinx/source/knowledge_bases/rule_bases.rst new file mode 100644 index 0000000..7ba0b68 --- /dev/null +++ b/doc/sphinx/source/knowledge_bases/rule_bases.rst @@ -0,0 +1,243 @@ +.. $Id: rule_bases.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +========== +Rule Bases +========== + +Rule bases are collections of rules_. Rule bases are created by writing a +*knowledge rule base* (`.krb`_) file with your favorite text editor. + +A single rule base may contain both forward-chaining_ and backward-chaining_ +rules. + +The forward-chaining rules are run automatically when the rule base is +activated_ to assert new statements_ of fact_. Thus, forward-chaining rules +are not directly used to determine whether any particular statement_ is true. + +But backward-chaining rules *are* directly used to determine whether a +particular statement is true. Thus, when a rule base name (or, more properly, +a `rule base category`_ name, explained below) is used as the +*knowledge base name* in a statement, it refers to the backward-chaining +rules within that rule base. + +.. note:: + + Pyke runs all forward-chaining rules before running any backward-chaining + rules. + + Thus, using rule base names as the *knowledge base name* in statements + within a forward-chaining rule is prohibited, as this would cause + backward-chaining rules to run in order to process the forward-chaining + rule. + +Why Multiple Rule Bases? +======================== + +There are two reasons to have more than one rule base (i.e., more than one +`.krb file`_): + +#. To divide a large set of rules into human manageable units. + + In this case, you want Pyke to use all of the rule bases combined. + + For example, you may have rules governing the automatic generation of SQL + statements, and other rules governing the generation of HTML documents. + You want to keep these rules in different rule bases to make them more + manageable. + +#. To enable your Python program to choose between different rule bases + that are tailored to different specific situations. + + For example, some of the rules governing the automatic generation of SQL + statements may vary depending upon the target database (e.g., ``mysql``, + ``postgresql``, ``oracle``). + + In this case, you want to be able to tell Pyke which of several rule bases + to use on each invocation, depending upon which target database you will + be accessing. You would never use more than one of these rule bases at + the same time, so these rule bases are mutually exclusive. + +These two goals are met by three capabilities: + +- `Rule Base Categories`_ +- `Rule Base Inheritance`_ +- `Rule Base Activation`_ + +Rule Base Categories +==================== + +All rule bases are grouped into categories. Each rule base category only gets +to have **one** active_ rule base. + +Thus, you place rule bases that you want to have active simultaneously into +*different* rule base categories; and place rule bases that are mutually +exclusive with each other (e.g., the ``mysql``, ``postgresql`` and ``oracle`` +rule bases) into the *same* rule base category. + +Each rule base category has a unique name. In the example above you would +want two rule base categories: ``database`` and ``html_generation``. + +The rule base category name is used as the *knowledge base name* for +statements within rules of one rule base category that want to refer to +rules within another rule base category. For example, rule bases in the +``html_generation`` category would need to use ``database.insert(...)`` to +refer to the ``insert`` rules in the ``database`` category. + +Rule Base Inheritance +===================== + +The rule bases within the same category_ share rules amongst themselves +through rule base inheritance. + +Rule bases use single inheritance to inherit the rules_ from one other rule +base. This can go on to any depth. Both forward-chaining_ and +backward-chaining_ rules_ are inherited. + +This allows mutually exclusive rule bases to share common rules in a parent +rule base without having to duplicate these rules amongst themselves. + +Here is the definition, then, of a `rule base category`_: + + Each *root* rule base (through rule base inheritance) defines a unique + rule base category. All rule bases derived (directly or indirectly) + from that root rule base are in the same rule base category. + + The name of the rule base category is simply the name of its root + rule base. + +So, our ``database`` and ``html_generation`` example would look like this: + +.. figure:: ../images/rule_base_categories.png + :width: 450 + :height: 424 + :scale: 100 + :align: center + + Rule Base Categories + +We have one root rule base called ``database`` and it has derived rule bases +called ``mysql``, ``postgresql`` and ``oracle``. And a second root rule base +called ``html_generation`` with ``firefox`` and ``internet_explorer``. + +The two root rule bases define two rule base categories: + +- database, which includes: + + - database + - mysql + - postgresql + - oracle + +- html_generation, which includes: + + - html_generation + - firefox + - internet_explorer + +.. note:: + + The `.krb files`_ for these rule bases may be placed anywhere you want + them within your Pyke source directory structure -- in other words, your + directory structure is not required to match your rule base inheritance + structure. + +Only one rule base from each rule base category may be active_ at any point in +time. + +Within each of these rule bases, if the knowledge base name is omitted from a +statement within a `backward-chaining rule`_, it defaults to the +`rule base category`_ of that rule base, *not* the rule base itself. +Thus, ``insert(...)`` within ``postgresql`` would mean +``database.insert(...)``, and ``make_tag(...)`` within ``firefox`` would mean +``html_generation.make_tag(...)``. + +.. important:: + + Note that referring to a rule base category (either explicitly or + implicitly) *always* refers to the active_ rule base within that category. + This may not be the rule base with that name (the root rule base), or even + the rule base making implicit use of the rule base category. For example, + ``insert(...)`` within ``postgresql`` will end up referring to ``insert`` + rules within the ``oracle`` rule base when ``oracle`` is the active rule + base. + +All rules referring to foreign `rule base categories`_ must explicitly use the +rule base category name. For example, to refer to the ``insert`` rule for +databases, within the ``html_generation`` category, you would have to say +``database.insert(...)``. + +In this way, all of the rules will work no matter which rule base is active +within each rule base category. + +Rule Inheritance +---------------- + +There is an important difference between how backward-chaining_ rule +inheritance works within Pyke rule bases and how method inheritance works +within Python classes: + +* When a derived class in Python defines a method by the same name as a + method in its parent class, the derived method *overrides* the parent + method. I.e., only the derived method is used when a call is made + to it. + +* In contrast, when a derived rule base in Pyke defines + `backward-chaining rules`_ for a goal that also has backward-chaining rules + defined for it in the parent rule base, the derived rule *extends* the + set of rules that may be used to try to prove this goal_kb_. All of the + derived rules will be tried first. If all of these fail, then the parent + rules are tried. + + If you don't want the parent rules to be used for a particular goal_kb_, + you must list that goal name in the ``without`` clause of the extending_ + statement at the beginning of the derived rule base. + +.. note:: + + All `forward-chaining rules`_ in the parent rule base are always included + in the derived rule base. The ``without`` clause only applies to + backward-chaining rules. + +Rule Base Activation +===================== + +Loading_ rule bases only makes them available for use. It does not +automatically activate_ any of them. This must be done explicitly by your +Python program. Your program may decide to activate different rule bases +in different situations. + +Additionally, `forward-chaining rules`_ may be used to activate more specific +rule bases, based upon their inferencing. But once a rule base has been +activated for a `rule base category`_, only children of the currently active +rule base may be activated from that point on. Because these children +inherit_ the rules of the currently active rule base; activating child +rule bases only adds new rules, and doesn't take any away. Thus, any +forward-chaining rule run during the activation of the first rule base +are not invalidated by activating the second rule base. + +In our database example, your program could activate the root ``database`` +rule base and let the forward-chaining rules within the ``database`` rule +base figure out which derived rule base to activate depending on the +particular database in use at the time the program is run. + + diff --git a/doc/sphinx/source/knowledge_bases/special.rst b/doc/sphinx/source/knowledge_bases/special.rst new file mode 100644 index 0000000..38ce193 --- /dev/null +++ b/doc/sphinx/source/knowledge_bases/special.rst @@ -0,0 +1,250 @@ +.. $Id: special.txt 4dca5ad0f397 2010-03-10 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +======= +Special +======= + +There is only one instance of this 'special' knowledge base, called +``special``. + +The ``special`` knowledge base is a collection of miscellaneous helper +*knowledge entities* that determine whether a statement is true or not in +various interesting ways. + +Thus, each entity in this `knowledge base`_ is a Python function that does +something "special" when run. + +The ``special`` functions are: + + - claim_goal_ + - check_command_ + - command_ + - general_command_ + +Claim_goal +========== + +The ``claim_goal`` function has no arguments:: + + special.claim_goal() + +This acts like the Prolog_ `cut operator`_. + +In general there are multiple rules_ that might be used to try to prove_ any +goal_kb_. They are each tried in the order that they appear in the `.krb file`_. +If one rule fails, the next rule is tried. The goal itself doesn't fail +until all of the rules for it have failed. + +Example +------- + +Suppose I want to translate a number, N, into the phrase "N dogs". I could +use the following rules:: + + one_dog + use n_dogs(1, '1 dog') + + n_dogs + use n_dogs($n, $phrase) + when + $phrase = "%d dogs" % $n + +The problem here is that both rules might be used when ``n`` is 1, but the +second rule isn't appropriate in this case. ``Special.claim_goal()`` may +be used to fix this, as follows:: + + one_dog + use n_dogs(1, '1 dog') + when + special.claim_goal() + + n_dogs + use n_dogs($n, $phrase) + when + $phrase = "%d dogs" % $n + +The ``special.claim_goal()`` prevents the second rule from being used when +``n`` is 1. + +Explanation +----------- + +When a rule_ executes ``special.claim_goal()`` in its ``when`` +clause, none of the rest of the rules will be tried for that goal_kb_. +Thus, when ``special.claim_goal()`` is backtracked_ over, the goal fails +immediately without trying any more rules for it. + +This ends up acting like an "else". You place it in the ``when`` clause +after the premises_ that show that this rule **must** be the correct one +to use. Then the subsequent rules will only be tried if these premises +fail, such that ``special.claim_goal()`` is never executed. + +This means that you don't need to add extra premises in each subsequent rule +to make sure that these premises have **not** occurred. + +Without the ``special.claim_goal()`` in the prior example, you would have to +write:: + + one_dog + use n_dogs(1, '1 dog') + + n_dogs + use n_dogs($n, $phrase) + when + check $n != 1 + $phrase = "%d dogs" % $n + +This is a simple example where it is easy to add the check in the second +rule. But in general, it can be difficult to check for prior conditions, +especially when many rules are involved that each has its own condition. + +Running Commands +================ + +The remaining three functions deal with running programs (commands) on the +host computer that is running your Pyke program. Their difference is in what +kind of output they provide from the command. + +These functions all use the `subprocess.Popen`_ function from the standard +Python library. + +Thus, each of these functions accept these three parameters that are passed +on to subprocess.Popen: + + - The ``$command`` parameter (required). + + - This is a tuple indicating the program to run along with its command + line arguments, such as ``(ls, '-l')``. + + - The ``$cwd`` parameter (optional). + + - This specifies the *current working directory* to run the command in. + - If omitted or ``None`` the current working directory is not changed. + + - The ``$stdin`` parameter (optional). + + - This is a string that is fed to the command as its stdin. + + - If the command expects multiple lines of input, this string must + include embedded newlines (e.g., ``'line 1\nline 2\n'``). + + - If omitted or ``None``, no stdin is provided to the command. + +All of these functions fail on backtracking_. + +Check_command +------------- + +:: + + special.check_command($command [, $cwd [, $stdin]]) + +Succeeds if the command returns a zero exit status. Fails otherwise. Any +output from the command to stdout or stderr is unavailable. + + >>> from pyke import knowledge_engine + >>> engine = knowledge_engine.engine() + >>> engine.prove_1_goal('special.check_command((true))') + ({}, None) + >>> engine.prove_1_goal('special.check_command((false))') + Traceback (most recent call last): + ... + pyke.knowledge_engine.CanNotProve: Can not prove special.check_command((false)) + +Command +------- + +:: + + special.command($stdout, $command [, $cwd [, $stdin]]) + +This just looks at the stdout of the command. Any output from the command +to stderr is unavailable. + +The ``$stdout`` is a tuple of lines with the trailing newlines removed. + +This raises `subprocess.CalledProcessError`_ if the command returns a non-zero +exit status. + + >>> from __future__ import with_statement + >>> from pyke import pattern, contexts + >>> def run_command(entity, command, cwd=None, stdin=None): + ... with engine.prove_goal( + ... 'special.%s($output, $command, $cwd, $stdin)' % entity, + ... command=command, + ... cwd=cwd, + ... stdin=stdin) \ + ... as gen: + ... for vars, no_plan in gen: + ... print(vars['output']) + >>> run_command('command', ('echo', 'hi', 'mom')) + ('hi mom',) + >>> run_command('command', ('ls',)) # doctest: +NORMALIZE_WHITESPACE + ('fact_bases.txt', 'index.txt', 'links', 'question_bases.txt', + 'rule_bases.txt', 'special.txt') + >>> run_command('command', ('ls', '-l', 'links.rst')) # doctest: +ELLIPSIS + ('-rw-r--r-- 1 ... links',) + >>> run_command('command', ('tail', '-n', '5', 'template.txt', '-'), + ... '..', # cwd (doc/source) + ... 'stdin: line 1\nstdin: line 2\nstdin: line 3\n') + ... # doctest: +NORMALIZE_WHITESPACE + ('==> template.txt <==', + ' } catch(err) {}', + ' ', + '', + '', + '', + '', + '==> standard input <==', + 'stdin: line 1', + 'stdin: line 2', + 'stdin: line 3') + >>> run_command('command', ('false',)) + Traceback (most recent call last): + ... + subprocess.CalledProcessError: Command 'false' returned non-zero exit status 1 + +General_command +--------------- + +:: + + special.general_command($output, $command [, $cwd [, $stdin]]) + +This is the fully general form that gives you all output from the command. + +The ``$output`` is a three tuple: (exit_status, stdout, stderr). Both stdout +and stderr are single strings (with embedded newlines). + + >>> run_command('general_command', ('echo', 'hi', 'mom')) + (0, 'hi mom\n', '') + >>> run_command('general_command', ('cat', 'foobar')) + (1, '', 'cat: foobar: No such file or directory\n') + >>> run_command('general_command', ('tail', '-n', '5', '../../r2w.ini', 'foobar')) + ... # doctest: +NORMALIZE_WHITESPACE + (1, + "==> ../../r2w.ini <==\ntarget_directory = 'html'\nmacros = + ''\n\n[uservalues]\nversion = '0.2'\n", + "tail: cannot open `foobar' for reading: No such file or directory\n") + + diff --git a/doc/sphinx/source/links.rst b/doc/sphinx/source/links.rst new file mode 100644 index 0000000..b6f71bd --- /dev/null +++ b/doc/sphinx/source/links.rst @@ -0,0 +1,188 @@ +.. _2to3: http://docs.python.org/library/2to3.html +.. _about pyke: about_pyke/index.html +.. _activated: activate_ +.. _activate: using_pyke/index.html#getting-started +.. _activating: activate_ +.. _activation: activate_ +.. _active: knowledge_bases/rule_bases.html#rule-base-activation +.. _anonymous variable: `anonymous variable lp`_ +.. _anonymous variable lp: logic_programming/pattern_matching/pattern_variables.html#anonymous-pattern-variables +.. _anonymous variable syntax: pyke_syntax/krb_syntax/pattern.html#anonymous-variable +.. _asserting new facts: using_pyke/adding_facts.html +.. _ask_tty: knowledge_bases/question_bases.html#presenting-questions-to-your-end-users +.. _assert: using_pyke/adding_facts.html +.. _asserted: assert_ +.. _asserts: assert_ +.. _backtracked: backtracking_ +.. _backtracking: logic_programming/rules/index.html#backtracking +.. _backward chaining: `backward-chaining rule lp`_ +.. _backward-chaining: `backward chaining`_ +.. _backward-chaining rule: `backward-chaining rule lp`_ +.. _backward-chaining rule lp: logic_programming/rules/backward_chaining.html +.. _backward-chaining rule syntax: pyke_syntax/krb_syntax/bc_rule.html +.. _backward-chaining rules: `backward-chaining rule`_ +.. _bc_premise: pyke_syntax/krb_syntax/bc_rule.html#when-clause +.. _bc_rule: `backward-chaining rule`_ +.. _Bc_rule Syntax: bc_rule_ +.. _case specific facts: knowledge_bases/fact_bases.html#case-specific-facts +.. _category: `rule base category`_ +.. _command: knowledge_bases/special.html#running-commands +.. _commands: command_ +.. _compound_premise: pyke_syntax/krb_syntax/compound_premise.html +.. _cooked: `cooking functions`_ +.. _cooking functions: about_pyke/cooking_functions.html +.. _copy_reg: http://docs.python.org/library/copy_reg.html +.. _create an engine: using_pyke/creating_engine.html +.. _creating an inference engine: `create an engine`_ +.. _cut operator: http://en.wikipedia.org/wiki/Cut_%28logic_programming%29 +.. _doctest: http://docs.python.org/library/doctest.html +.. _doctest-tools: http://code.google.com/p/doctest-tools/ +.. _Docutils: http://sourceforge.net/projects/docutils +.. _easy_install: http://peak.telecommunity.com/DevCenter/EasyInstall +.. _engine: `knowledge engine`_ +.. _engine.reset: reset_ +.. _Examples: examples.html +.. _extending: pyke_syntax/krb_syntax/index.html#extending-clause +.. _extending clause: extending_ +.. _fact base: knowledge_bases/fact_bases.html +.. _fact bases: `fact base`_ +.. _fact: knowledge_bases/fact_bases.html#facts +.. _facts: fact_ +.. _family_relations: examples.html#family-relations +.. _FAQ: http://sourceforge.net/apps/trac/pyke/wiki/FAQ +.. _fc_premise: pyke_syntax/krb_syntax/fc_rule.html#foreach-clause +.. _fc_rule: pyke_syntax/krb_syntax/fc_rule.html +.. _forall: pyke_syntax/krb_syntax/compound_premise.html#forall-premise +.. _forall premise: forall_ +.. _forward-chaining: `forward-chaining rule lp`_ +.. _forward-chaining rule: `forward-chaining rule lp`_ +.. _forward-chaining rule lp: logic_programming/rules/forward_chaining.html +.. _forward-chaining rule syntax: pyke_syntax/krb_syntax/fc_rule.html +.. _forward-chaining rules: `forward-chaining rule`_ +.. _fully bound: logic_programming/pattern_matching/matching_patterns.html#binding-to-a-tuple-pattern +.. _functools: http://docs.python.org/library/functools.html +.. _functools.partial: functools_ +.. _goal: `goal lp`_ +.. _goal_kb: `goal syntax`_ +.. _goal lp: logic_programming/rules/backward_chaining.html +.. _goal syntax: pyke_syntax/krb_syntax/bc_rule.html#use-clause +.. _goals: goal_ +.. _hg: Mercurial_ +.. _hgrc: http://www.selenic.com/mercurial/hgrc.5.html +.. _hgrc_keywords: http://pyke.hg.sourceforge.net/hgweb/pyke/release_1/raw-file/tip/hgrc_keywords +.. _home page: index.html +.. _how to call Pyke: using_pyke/index.html +.. _HTMLTemplate: http://py-templates.sourceforge.net/htmltemplate/index.html +.. _inherit: knowledge_bases/rule_bases.html#rule-base-inheritance +.. _inherits: inherit_ +.. _Keyword Extension: http://mercurial.selenic.com/wiki/KeywordExtension +.. _.kfb file: pyke_syntax/kfb_syntax.html +.. _.kfb files: `.kfb file`_ +.. _.kfb: `.kfb file`_ +.. _knapsack problem: http://en.wikipedia.org/wiki/Knapsack_problem +.. _knowledge base: knowledge_bases/index.html +.. _knowledge bases: `knowledge base`_ +.. _knowledge_engine.engine: using_pyke/creating_engine.html +.. _knowledge engine: `knowledge_engine.engine`_ +.. _.kqb file: pyke_syntax/kqb_syntax.html +.. _.kqb files: `.kqb file`_ +.. _.kqb: `.kqb file`_ +.. _.krb file: pyke_syntax/krb_syntax/index.html +.. _.krb files: `.krb file`_ +.. _.krb: `.krb file`_ +.. _KRB files: index.html#lexical-structure +.. _krb_traceback: using_pyke/other_functions.html#krb-traceback +.. _Literal patterns: logic_programming/pattern_matching/literal_patterns.html +.. _loading: `knowledge_engine.engine`_ +.. _Logic Programming: http://en.wikipedia.org/wiki/Logic_programming +.. _logic programming in pyke: logic_programming/index.html +.. _matched: `pattern matches`_ +.. _matching two patterns together: logic_programming/pattern_matching/matching_patterns.html +.. _Mercurial: http://mercurial.selenic.com/wiki/ +.. _Mercurial hook: http://www.selenic.com/mercurial/hgrc.5.html#hooks +.. _Mercurial Hosting Sites: http://mercurial.selenic.com/wiki/MercurialHosting +.. _Modifying Pyke: about_pyke/modifying_pyke.html +.. _MySQL: http://www.mysql.com/ +.. _notany: pyke_syntax/krb_syntax/compound_premise.html#notany-premise +.. _notany premise: notany_ +.. _Other Required Packages: about_pyke/installing_pyke.html#other-required-packages +.. _package: http://www.python.org/doc/essays/packages.html +.. _pathological question: logic_programming/pattern_matching/matching_patterns.html#pathological-question +.. _pattern: `pattern lp`_ +.. _pattern lp: logic_programming/pattern_matching/index.html +.. _pattern syntax: pyke_syntax/krb_syntax/pattern.html +.. _pattern matches: logic_programming/pattern_matching/index.html +.. _pattern matching: `pattern matches`_ +.. _pattern variable: `pattern variable lp`_ +.. _pattern variable lp: logic_programming/pattern_matching/pattern_variables.html +.. _pattern variable syntax: pyke_syntax/krb_syntax/pattern.html#pattern-variable +.. _pattern variables: `pattern variable`_ +.. _patterns: pattern_ +.. _pickled: using_pyke/other_functions.html#running-and-pickling-plans +.. _pickle: http://docs.python.org/library/pickle.html +.. _pickles: pickle_ +.. _pip: http://pypi.python.org/pypi/pip +.. _plan: logic_programming/plans.html +.. _plan_spec: pyke_syntax/krb_syntax/bc_rule.html#plan-spec +.. _plans: plan_ +.. _PLY: http://www.dabeaz.com/ply/ +.. _premise: `premise lp`_ +.. _premise lp: logic_programming/rules/index.html#premises-and-conclusions +.. _premise syntax: pyke_syntax/krb_syntax/bc_rule.html#when-clause +.. _premises: premise_ +.. _print_stats: using_pyke/other_functions.html#miscellaneous +.. _programming in the large: http://portal.acm.org/citation.cfm?id=808431 +.. _program in the large: `programming in the large`_ +.. _program startup: using_pyke/creating_engine.html +.. _Prolog: http://en.wikipedia.org/wiki/Prolog +.. _prove_1: prove_ +.. _prove_1_goal: prove_ +.. _prove_goal: `prove`_ +.. _prove_n: `prove`_ +.. _prove: using_pyke/proving_goals.html +.. _proving: prove_ +.. _proving goals: prove_ +.. _PyCon 2008: http://us.pycon.org/2008/about/ +.. _Pyke: http://groups.google.com/group/pyke +.. _Pyke project download page: http://sourceforge.net/projects/pyke/files/ +.. _pypi: http://pypi.python.org/pypi +.. _Python: http://www.python.org +.. _Python egg file: http://peak.telecommunity.com/DevCenter/PythonEggs +.. _python_premise: pyke_syntax/krb_syntax/python_premise.html +.. _python_statements: pyke_syntax/krb_syntax/python_premise.html#python-statements +.. _question base: knowledge_bases/question_bases.html +.. _question bases: `question base`_ +.. _question: knowledge_bases/question_bases.html +.. _questions: question_ +.. _Rebuilding the HTML Documentation: about_pyke/modifying_pyke.html#rebuilding-the-html-documentation +.. _regular expression syntax: http://docs.python.org/library/re.html#regular-expression-syntax +.. _relative import: http://www.python.org/dev/peps/pep-0328/ +.. _reset: using_pyke/index.html#using-different-facts-for-different-cases +.. _rest2web: http://sourceforge.net/projects/rest2web +.. _rule base category: knowledge_bases/rule_bases.html#rule-base-categories +.. _rule base: knowledge_bases/rule_bases.html +.. _rule base's: `rule base`_ +.. _rule bases: `rule base`_ +.. _rule: logic_programming/rules/index.html +.. _rule's: rule_ +.. _rules: rule_ +.. _Running Unit Tests: about_pyke/modifying_pyke.html#running-unit-tests +.. _siege: http://www.joedog.org/index/siege-home +.. _special: knowledge_bases/special.html +.. _sqlgen: examples.html#sqlgen +.. _statement: logic_programming/statements.html +.. _statements: statement_ +.. _string.Template: http://docs.python.org/library/string.html#template-strings +.. _subprocess.CalledProcessError: http://docs.python.org/library/subprocess.html#exceptions +.. _subprocess.Popen: http://docs.python.org/library/subprocess.html#subprocess.Popen +.. _taking clause: pyke_syntax/krb_syntax/bc_rule.html#taking-clause +.. _traceback: http://docs.python.org/library/traceback.html +.. _Tuple patterns: logic_programming/pattern_matching/tuple_patterns.html +.. _TurboGears 2: http://turbogears.org/2.0/ +.. _variables: `pattern variable`_ +.. _web_framework: examples.html#web-framework +.. _when clause: pyke_syntax/krb_syntax/bc_rule.html#when-clause +.. _wiki: http://sourceforge.net/apps/trac/pyke/wiki +.. _with clause: pyke_syntax/krb_syntax/bc_rule.html#with-clause +.. _WSGI: http://www.python.org/dev/peps/pep-0333/ +.. _wxpython: http://www.wxpython.org/ diff --git a/doc/sphinx/source/logic_programming/index.rst b/doc/sphinx/source/logic_programming/index.rst new file mode 100644 index 0000000..30ca21d --- /dev/null +++ b/doc/sphinx/source/logic_programming/index.rst @@ -0,0 +1,54 @@ +.. $Id: index.txt 057d79259b20 2009-05-14 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + statements + pattern_matching/index + rules/index + plans + +========================== +Logic Programming Tutorial +========================== + +Pyke is an inference engine that applies rules_ to facts_ to establish +additional facts (through forward-chaining_ rules), and/or to prove *goals* +and optionally assemble Python functions +into customized call graphs, called plans_ (through backward-chaining_ rules). + +Pyke may then be reset_, deleting the last set of facts, so that the cycle +may be repeated. For each cycle a different rule base may be activated_. + +The plan_ capability allows the postponement of code execution until the +top-level goal has been completely proven. This shields the code from +blind alleys and the backtracking_ that occurs within the rules. + +Once a plan_ has been created, it may be executed multiple times with different +arguments. It may also be pickled_, and later run again only requiring one +small Pyke module. + +Pyke also provides an end user question_ capability, as well as the capability +to run commands_ on the local system to guide the inferencing. + diff --git a/doc/sphinx/source/logic_programming/pattern_matching/index.rst b/doc/sphinx/source/logic_programming/pattern_matching/index.rst new file mode 100644 index 0000000..75ef0e1 --- /dev/null +++ b/doc/sphinx/source/logic_programming/pattern_matching/index.rst @@ -0,0 +1,78 @@ +.. $Id: index.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + literal_patterns + pattern_variables + tuple_patterns + matching_patterns + pathological_answer + +================ +Pattern Matching +================ + +Pattern matching is a little strange at first, so we're going to ease into +it slowly... + +There are two aspects to pattern matching: *patterns*, which you write, and +*matching*, which is what Pyke does with your patterns. + +In a nutshell, patterns are made up of two fundamental building blocks: + +#. `Literal patterns`_. + + - Theses are just data values that only match themselves. + +#. `Pattern variables`_. + + - These will match anything. (Including other pattern variables, as we'll + see later)! + +And one compound pattern: + +#. `Tuple patterns`_. + + - These match -- you guessed it! -- tuples! + +We'll examine all of the above looking at how Pyke matches a pattern to data. +Then we'll expand this to cover `matching two patterns together`_. + +And finally, a `pathological question`_ to see if you've been paying +attention. + +Sound like fun? Good! Let's get started! + +OK, so why do we need patterns? The simple answer is that we need patterns +to generalize statements_. One example is to turn statements into questions. + +.. important:: + - When you want a *direct* statement, such as to state a fact, you just use + *data* for its arguments. + - But when you want a *generalized* statement, such as to ask a question, + you use *patterns* for its arguments. + + + diff --git a/doc/sphinx/source/logic_programming/pattern_matching/literal_patterns.rst b/doc/sphinx/source/logic_programming/pattern_matching/literal_patterns.rst new file mode 100644 index 0000000..a006e07 --- /dev/null +++ b/doc/sphinx/source/logic_programming/pattern_matching/literal_patterns.rst @@ -0,0 +1,47 @@ +.. $Id: literal_patterns.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +================ +Literal Patterns +================ + +You want to ask Pyke a question. The simplest questions are just asking "Is +statement X true?". Going back to Pyke's family_relations_ example, your +Python program might want to know whether it's really true that Bruce's +parents are Thomas and Norma? So it would ask whether the following statement +is true:: + + family.son_of(Bruce, Thomas, Norma) + +Pyke would search the facts that's it's been told about and answer "thumbs up" +because you've told it before that this statement is true and it has +remembered that. + +In this case, all of the statement's arguments are *literal patterns*. You +might consider literal patterns to be *input* to Pyke. You're passing Bruce, +Thomas and Norma *into* Pyke. And Pyke just answers "thumbs up" or "thumbs +down". + +Literal patterns look exactly like data. Thus, your question would look +exactly like you see above. + + diff --git a/doc/sphinx/source/logic_programming/pattern_matching/matching_patterns.rst b/doc/sphinx/source/logic_programming/pattern_matching/matching_patterns.rst new file mode 100644 index 0000000..773e79b --- /dev/null +++ b/doc/sphinx/source/logic_programming/pattern_matching/matching_patterns.rst @@ -0,0 +1,108 @@ +.. $Id: matching_patterns.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +===================== +Matching Two Patterns +===================== + +You've now seen all of the different kinds of patterns and how they are +matched to data. Not too bad so far... + +Patterns are used to generalize statements. One situation where you need to +generalize a statement is when you want to ask a question. That's been +covered above. + +The other situation where you need to generalize a statement is when you write +rules_, which are explained later. + +But rules also need to be able to match one pattern to another *pattern*, +and not just match patterns to *data* as we have discussed so far. + +So before we can move on to rules, we need to examine how one pattern is +matched to another pattern. + +The short answer is that it all comes down to pattern variables and that +pattern variables may not only be bound to *data*, but may also be bound to +other *patterns*. + +Binding to a Literal Pattern +============================ + +Binding a pattern variable to a literal pattern is just like binding it to the +data within that literal pattern. Nothing fancy here! + +Binding to Another Pattern Variable +===================================== + +When pattern variable A is bound to pattern variable B, they essentially +become the *same pattern variable*. Basically, pattern variable A *becomes* +pattern variable B (or, you might say, *defers* to pattern variable B). + +Let's say that pattern variable A has been bound to pattern variable B and +that pattern variable B is still unbound. + +#. Prior to binding pattern variable B to a value, it doesn't matter whether + you ask if pattern variable A is bound or pattern variable B is bound, the + answer is False for both. + +#. It doesn't matter whether you match pattern variable A to a value or + pattern variable B to a value. In both cases, it is pattern variable B + that gets bound to this value. + +#. And once pattern variable B is bound to a value, it doesn't matter whether + you ask for the bound value of pattern variable A or pattern variable B, + you will get the same value. + +So for all intents and purposes pattern variable A and pattern variable B +become the same pattern variable. + +Binding to a Tuple Pattern +=========================== + +Because pattern variables may be bound to tuple patterns, the term *fully +bound* is introduced. Asking whether the pattern variable is *fully bound* +means that not only is it bound to a value (the tuple pattern), but that all +of the subordinate patterns (recursively) within the tuple pattern are also +bound to values. + +Being *fully bound* means that the bound value of the pattern variable can be +converted into standard Python data without any pattern variables in it. This +is important when Pyke wants to talk to Python because Python has no concept +of storing *variables* within its data structures. + + +Pathological Question +===================== + +What is the bound value of pattern variable ``$y`` after matching the +following two tuple patterns: + + Tuple pattern A: + ``((ho, $_, ($a, $a)), ($a, $a, $b), ($a, *$b))`` + Tuple pattern B: + ``($x, $x, $y)`` + +The answer is here_ (but no peeking!). + +.. _here: pathological_answer.html + + diff --git a/doc/sphinx/source/logic_programming/pattern_matching/pathological_answer.rst b/doc/sphinx/source/logic_programming/pattern_matching/pathological_answer.rst new file mode 100644 index 0000000..3ea1128 --- /dev/null +++ b/doc/sphinx/source/logic_programming/pattern_matching/pathological_answer.rst @@ -0,0 +1,97 @@ +.. $Id: pathological_answer.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +==================== +Pathological Answer +==================== + +This is the answer to the following question: + +Pathological Question +===================== + +What is the bound value of pattern variable ``$y`` after matching the +following two tuple patterns: + + Tuple pattern A: + ``((ho, $_, ($a, $a)), ($a, $a, $b), ($a, *$b))`` + Tuple pattern B: + ``($x, $x, $y)`` + +Answer +====== + +Let's take this step by step, matching each element of the two tuple patterns +in turn. + +#. Match ``(ho, $_, ($a, $a))`` to ``$x``. + + This succeeds with the following binding: + + ``$x``: + ``(ho, $_, ($a, $a))`` + +#. Match ``($a, $a, $b)`` to ``$x``. + + Because ``$x`` is bound to a value, this becomes the same as matching: + + - ``($a, $a, $b)`` to + - ``(ho, $_, ($a, $a))`` + + Which succeeds, binding: + + ``$a``: + ``ho`` + ``$b``: + ``($a, $a)`` + + ``$_`` is an anonymous variable, so it is not bound (or bound to). + +#. Match ``($a, *$b)`` to ``$y``. + + Because both ``$a`` and ``$b`` have bound values, this becomes the same as + matching: + + - ``(ho, ho, ho)`` to + - ``$y`` + + Which succeeds, binding: + + ``$y``: + ``(ho, ho, ho)`` + +So the overall match succeeds with the following bindings: + + ``$x``: + ``(ho, $_, ($a, $a))`` + ``$a``: + ``ho`` + ``$b``: + ``($a, $a)`` + ``$y``: + ``(ho, ho, ho)`` + +And so ``$y`` is ``(ho, ho, ho)``! + +.. note:: + If you got this right, you should really be using Pyke! + diff --git a/doc/sphinx/source/logic_programming/pattern_matching/pattern_variables.rst b/doc/sphinx/source/logic_programming/pattern_matching/pattern_variables.rst new file mode 100644 index 0000000..956f36e --- /dev/null +++ b/doc/sphinx/source/logic_programming/pattern_matching/pattern_variables.rst @@ -0,0 +1,125 @@ +.. $Id: pattern_variables.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +================= +Pattern Variables +================= + +To take this to the next level, you might want to ask "Who are the sons of +Thomas and Norma?". In this case, you are passing ``Thomas`` and ``Norma`` +*into* Pyke, and you'd like Pyke to pass something back *out* to you as part of +the answer (in addition to the thumbs up). + +Pattern variables serve as output parameters. They start with a ``$``:: + + family.son_of($son, Thomas, Norma) + +You can use whatever name you like after the ``$``. Pyke will answer with a +thumbs up *binding* ``$son`` to ``Bruce``. If you don't like that answer, you +can reject that answer and ask Pyke for another answer ("nope, try again!"). +Each time Pyke finds another son for Thomas and Norma, it answers with another +thumbs up and ``$son`` *bound* to a different value. + +If you reject the last son of ``Thomas`` and ``Norma`` (or if ``Thomas`` and +``Norma`` have no sons in the first place), Pyke will answer with a thumbs +down. + +We say that Pyke *binds* ``Bruce`` to the pattern variable ``$son`` when it +comes back with its first thumbs up. When we tell Pyke "nope, try again!", +Pyke must first *unbind* ``$son`` before it can go on and *bind* it to the +next value. The "nope" part does the *unbinding*, and the "try again" part +does the *binding* again to a new value. + +So at any point in time, a pattern variable is either *bound* to a value or +*unbound*. If we follow a particular pattern variable through time, we might +see that it is alternately bound and unbound many times as Pyke tries to find +a suitable answer to your question. Specifically, when Pyke comes back with +the final thumbs down, ``$son`` is unbound. + +Anonymous Pattern Variables +=========================== + +Suppose we want to know who Norma's sons are? In this case we don't care +about the father. We use *anonymous variables* as "don't care" placeholders. + +An anonymous variable is any pattern variable who's name starts with an +underscore (``_``). The rest of the name doesn't matter and just serves as +documentation (and so ``$_`` is all that's strictly needed). + +So "Who are Norma's sons?" looks like:: + + family.son_of($son, $_father, Norma) + +We're giving Norma as input to Pyke, and asking for the ``$son`` as output and +telling Pyke that we don't care about the ``$_father``. + +Anonymous variables are never bound to values. (So you could say that they +are always unbound). + +Pattern Variable Identity +=========================== + +Now this is very important, so pay attention! The same pattern variable +*name* means the same *pattern variable*. Thus, if you say ``$son`` twice, +it's the *same* pattern variable. And, a pattern variable can only be bound +to one value (at a time), so you mean the *same* data value must appear in +both places. + +.. note:: + This does *not* apply to `anonymous pattern variables`_. Since they are + never bound to a value, each use of the same anonymous variable can match + different data values. + +So if you wanted to see all of the sons with the same name as their fathers, +you would ask:: + + family.son_of($father, $father, $_mother) + +.. note:: + + The Pyke family_relations_ example never uses the same name for both + father and son because that would cause confusion about which of them + was the father to both of their sons and daughters. + + In these cases, it modifies the name of the son to make it unique. + + Thus, this question would always fail within the family_relations + example... + +And so here is the complete explanation of how pattern variables are matched +to a data value. + +First, the pattern variable is checked to see if it is already bound to a +value. + +If it is bound to a value, then this bound value has to match the data for +the match to succeed. + +If it is unbound, then the pattern variable is bound to the data value as a +by-product of doing the match, and the match always succeeds. + +And so pattern variables only "match any value" when they are unbound. And in +matching that value, they become bound to it as a by-product of doing the +match. Once bound to a value, a pattern variable will only match that value +(much like a literal pattern). + + diff --git a/doc/sphinx/source/logic_programming/pattern_matching/tuple_patterns.rst b/doc/sphinx/source/logic_programming/pattern_matching/tuple_patterns.rst new file mode 100644 index 0000000..015d5c1 --- /dev/null +++ b/doc/sphinx/source/logic_programming/pattern_matching/tuple_patterns.rst @@ -0,0 +1,60 @@ +.. $Id: tuple_patterns.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +================ +Tuple Patterns +================ + +Tuple patterns only match tuples. They are written as simply a comma +separated list of patterns within parenthesis:: + + (1, $x, "buckle my shoe") + +You can also write a *rest* pattern variable at the end using an asterisk +(``*``):: + + ($a, fie, $b, *$c) + +This will match the rest of the items in the data value that the tuple pattern +is matched to. Note that the *rest* pattern variable is *always* bound to a +tuple. + +Examples: + + - matching ``(1, $x, "buckle my shoe")`` to ``(1, 2, "buckle my shoe")`` + matches, binding ``$x`` to 2. + - matching ``(1, $x, "buckle my shoe")`` to ``(1, 2, "buckle my belt")`` + does not match because the third pattern within the tuple pattern fails + to match the third value in the matched tuple. + - matching ``($a, fie, $b, *$c)`` to ``(fee, fie, foe, fum)`` + matches, binding ``$a`` to ``fee``, ``$b`` to ``foe`` and ``$c`` to + ``(fum)``. + - matching ``($a, fie, $b, *$c)`` to ``(fee, fie, foe)`` + matches, binding ``$a`` to ``fee``, ``$b`` to ``foe`` and ``$c`` to + ``()``. + - matching ``($a, fie, $b, *$c)`` to ``(fee, fie)`` does not match because + the data value has to have a length of at least three. + +.. hint:: + You can use ``(*$foo)`` to only match a tuple. It will bind ``$foo`` to + the entire tuple, but will fail to match any other data type. + diff --git a/doc/sphinx/source/logic_programming/plans.rst b/doc/sphinx/source/logic_programming/plans.rst new file mode 100644 index 0000000..51ad02d --- /dev/null +++ b/doc/sphinx/source/logic_programming/plans.rst @@ -0,0 +1,259 @@ +.. $Id: plans.txt 4dca5ad0f397 2010-03-10 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================================= +Plans and Automatic Program Generation +============================================= + +Once you understand how backward-chaining_ works, it is relatively easy to +do automatic program generation. + +Adding Plans to Backward-Chaining Rules +============================================ + +The way this is done is by attaching Python functions to +backward-chaining_ rules_. These functions are written in the *with* +clause at the end of each rule_ in the `.krb file`_. They don't affect how +the rules_ run to prove a goal, but are +gathered up to form a call graph that is returned along with the `pattern +variable`_ bindings that prove_ the top-level goal. + +Example +=============== + +Consider a small `rule base`_ to construct programs to transfer money between +bank accounts. Each *from_acct* and *to_acct* takes one of two forms: + +#. (name, account_type) + + - This is a local account with this bank. + - Example: ('bruce', 'checking'). + +#. (bank, name, account_type) + + - This is a foreign account with another bank. + - Example: ('my_other_bank', 'bruce', 'checking'). + +At least one of the bank accounts must be a local account. + +Here's the example rule base:: + + 1 transfer1 + 2 use transfer($from_acct, $to_acct) taking (amount) + 3 when + 4 withdraw($from_acct) + 5 $$(amount) + 6 deposit($to_acct) + 7 $$(amount) + + 8 transfer2 + 9 use transfer($from_acct, $to_acct) taking (amount) + 10 when + 11 transfer_ach($from_acct, $to_acct) + 12 $$(amount) + + 13 withdraw + 14 use withdraw(($who, $acct_type)) taking (amount) + 15 with + 16 print("withdraw", amount, "from", $who, $acct_type) + + 17 deposit + 18 use deposit(($who, $acct_type)) taking (amount) + 19 with + 20 print("deposit", amount, "to", $who, $acct_type) + + 21 transfer_ach1 + 22 use transfer_ach($from_acct, ($bank, $who, $acct_type)) taking (amount) + 23 when + 24 withdraw($from_acct) + 25 $$(amount) + 26 deposit((central_accts, ach_send_acct)) + 27 $$(amount) + 28 with + 29 print("send", amount, "to bank", $bank, "acct", $who, $acct_type) + + 30 transfer_ach2 + 31 use transfer_ach($from_acct, $to_acct) taking (amount) + 32 when + 33 get_ach($from_acct) + 34 $$(amount) + 35 withdraw((central_accts, ach_recv_acct)) + 36 $$(amount) + 37 deposit($to_acct) + 38 $$(amount) + + 39 get_ach + 40 use get_ach(($bank, $who, $acct_type)) taking (amount) + 41 with + 42 print("get", amount, "from bank", $bank, "acct", $who, $acct_type) + +How the Plan Functions are Generated for This Example +------------------------------------------------------- + +Each of these rules_ will have a plan function generated for it. These plan +functions are generated with the same name as the rule_ name. Thus, the +name of the generated Python plan function for the first rule would be +"transfer1". + +The plan function generated for the first rule consists of two lines taken +from lines 5 and 7 of this example. The $$ in each of these lines will +be expanded to the subordinate plan function returned from the proof of +"withdraw($from_acct)" and "deposit($to_acct)" respectfully. The generated +plan function will be defined to take an "amount" parameter because of the +*taking* clause on line 2. This parameter is passed on to each of the +subordinate plan functions in lines 5 and 7. + +The plan function generated for the "withdraw" rule on line 13 will have +the single line taken from line 16 in the *with* clause. The "$who" and +"$acct_type" `pattern variables`_ will be expanded to constant values taken +from the values bound to these `pattern variables`_ after the top-level +(transfer) goal has been proven. + +Finally, the plan function generated for the "transfer_ach1" rule on line +21 will have three lines: two from the *when* clause (lines 25 and 27) +followed by one from the *with* clause (line 29). These lines will be +generated at the same indent level in the plan function even though they +are at different indent levels in the `.krb file`_. + +For more detailed information about the options available for plans in the +`.krb file`_, see `Bc_rule Syntax`_. + +Running the Example +======================== + +.. This code is hidden. It will add '' to sys.path, change to the doc.examples + directory and store the directory path in __file__ for the code section + following: + >>> import sys + >>> if '' not in sys.path: sys.path.insert(0, '') + >>> import os + >>> os.chdir("../../examples") + >>> __file__ = os.getcwd() + +The plan is created as a byproduct of proving_ the goal: + + >>> from pyke import knowledge_engine + + >>> engine = knowledge_engine.engine(__file__) + >>> engine.activate('plan_example') + >>> no_vars, plan1 = \ + ... engine.prove_1_goal( + ... 'plan_example.transfer((bruce, checking), (bruce, savings))') + +``plan1`` is now a program to transfer X amount +from 'bruce', 'checking' to 'bruce', 'savings'. Using the above rule names +as function names, plan1 looks like this: + +.. figure:: ../images/plan1.png + :width: 187 + :height: 118 + :scale: 100 + :align: center + + Plan1 + +And can be called like a standard function, passing the parameters +specified in the *taking* clause of the rules for the top-level goal +(transfer): + + >>> plan1(100) + withdraw 100 from bruce checking + deposit 100 to bruce savings + +The program may be used multiple times: + + >>> plan1(50) + withdraw 50 from bruce checking + deposit 50 to bruce savings + +Notice the strings: ``bruce``, ``checking`` and ``savings`` in the output. +These were specified as `pattern variables`_ in the code and are cooked_ +into the plan along with the function call graph. + +Let's create a second program: + + >>> no_vars, plan2 = \ + ... engine.prove_1_goal( + ... 'plan_example.transfer((bruce, checking), ' + ... '(my_other_bank, bruce, savings))') + +``plan2`` is now a program to transfer X amount +from 'my_other_bank', 'bruce', 'checking' to 'bruce', 'savings'. +Plan2 looks like this: + +.. figure:: ../images/plan2.png + :width: 187 + :height: 195 + :scale: 100 + :align: center + + Plan2 + +And is run just like plan1, but produces different results: + + >>> plan2(200) + withdraw 200 from bruce checking + deposit 200 to central_accts ach_send_acct + send 200 to bank my_other_bank acct bruce savings + +And the final use case: + + >>> no_vars, plan3 = \ + ... engine.prove_1_goal( + ... 'plan_example.transfer((my_other_bank, bruce, checking), ' + ... '(bruce, savings))') + >>> plan3(150) + get 150 from bank my_other_bank acct bruce checking + withdraw 150 from central_accts ach_recv_acct + deposit 150 to bruce savings + +Plan3 looks like this: + +.. figure:: ../images/plan3.png + :width: 264 + :height: 198 + :scale: 100 + :align: center + + Plan3 + +Note that the same *transfer2* function is calling two different functions +(*transfer_ach1* and *transfer_ach2*) in plan2 and plan3. This shows how +different functions may be chosen based on the rule_ inferencing. Also +note that after the generation of plan3, plan2 is still valid; both may +still be called successfully, resulting in different calls from the initial +*transfer2* function. + +Conclusion +============== + +So you can see that it quite easy to use Pyke to automatically combine +Python functions into programs! + +It also allows data within each Python function to be specified using a +`pattern variable`_ so that Pyke can customize these values to match the +specific situation. + +If you would like to know more about how Pyke *cooks* (or customizes) your +Python functions, see `Cooking Functions`_. + + diff --git a/doc/sphinx/source/logic_programming/rules/backward_chaining.rst b/doc/sphinx/source/logic_programming/rules/backward_chaining.rst new file mode 100644 index 0000000..40bbb71 --- /dev/null +++ b/doc/sphinx/source/logic_programming/rules/backward_chaining.rst @@ -0,0 +1,268 @@ +.. $Id: backward_chaining.txt 4dca5ad0f397 2010-03-10 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================================= +Backward Chaining +============================================= + +Backward chaining rules_ are processed when your program asks Pyke a question_ +(i.e., asks Pyke to prove_ a specific *goal*). Pyke will only use activated_ +`rule bases`_ to do the proof. + +Overview of "Backward-Chaining" +=============================== + +To do backward-chaining, Pyke finds rules whose *then* part matches the *goal* +(i.e., the question). Once it finds such a rule, it tries to (recursively) +prove all of the subgoals in the *if* part of that rule. Some of these +subgoals are matched against facts, and others are subgoals for other +backward-chaining rules. If all of the subgoals can be proven, the rule +succeeds and the original goal is proven. Otherwise, the rule fails, and Pyke +tries to find another rule whose *then* part matches the goal, and so on. + +So Pyke ends up linking (or *chaining*) the *if* part of the first rule to the +*then* part of the next rule. + +Reviewing: + +#. Pyke starts by finding a rule whose *then* part matches the goal. +#. Pyke then proceeds to process the *if* part of that rule. +#. Which may link (or chain) to the *then* part of another rule. + +Since Pyke processes these rules from *then* to *if* to *then* to *if* in the +reverse manner that we normally think of using rules, it's called *backward* +chaining. + +To make this more clear, Pyke has you write your backward-chaining rules +upside down by writing the *then* part first (since that's how it is +processed). + +"Use", "When" Rather than "Then", "If" +====================================== + +But *then-if* rules sound confusing, so Pyke uses the words **use** and +**when** rather than **then** and **if**. You can then read the rule as "use" +this statement "when" these other statements can be proven. + +.. note:: + + Unlike the *assert* clause in forward-chaining_ rules, Pyke only allows + one statement in the *use* clause. + +Example +================= + +Consider this example:: + + 1 direct_father_son + 2 use father_son($father, $son, ()) + 3 when + 4 family2.son_of($son, $father) + + 5 grand_father_son + 6 use father_son($grand_father, $grand_son, (grand)) + 7 when + 8 father_son($father, $grand_son, ()) + 9 father_son($grand_father, $father, ()) + + 10 great_grand_father_son + 11 use father_son($gg_father, $gg_son, (great, $prefix1, *$rest_prefixes)) + 12 when + 13 father_son($father, $gg_son, ()) + 14 father_son($gg_father, $father, ($prefix1, *$rest_prefixes)) + + 15 brothers + 16 use brothers($brother1, $brother2) + 17 when + 18 father_son($father, $brother1, ()) + 19 father_son($father, $brother2, ()) + 20 check $brother1 != $brother2 + + 21 uncle_nephew + 22 use uncle_nephew($uncle, $nephew, $prefix) + 23 when + 24 brothers($uncle, $father) + 25 father_son($father, $nephew, $prefix1) + 26 $prefix = ('great',) * len($prefix1) + + 27 cousins + 28 use cousins($cousin1, $cousin2, $distance, $removed) + 29 when + 30 uncle_nephew($uncle, $cousin1, $prefix1) + 31 father_son($uncle, $cousin2, $prefix2) + 32 $distance = min(len($prefixes1), len($prefixes2)) + 1 + 33 $removed = abs(len($prefixes1) - len($prefixes2)) + +.. note:: + These rules_ draw the same conclusions as the forward-chaining_ example_, + with the addition of the *brothers*, *uncle_nephew* and *cousins* rules. + +We can draw something similar to a function call graph with these rules: + +.. figure:: ../../images/bc_rules.png + :width: 509 + :height: 583 + :scale: 100 + :align: center + + Example Rules + +These rules_ are not used until you ask Pyke to prove_ a goal. + +The easiest way to do this is with *some_engine.prove_1_goal* or +*some_engine.prove_goal*. Prove_1_goal_ only returns the first proof found +and then stops (or raises ``pyke.knowledge_engine.CanNotProve``). Prove_goal_ +returns a context manager for a generator that generates all possible proofs +(which, in some cases, might be infinite). + +Both functions return the `pattern variable`_ variable bindings, along with +the plan_. + +Backtracking with Backward-Chaining Rules +========================================= + +For this example, these are the starting set of ``family2`` facts:: + + 1 son_of(tim, thomas) + 2 son_of(fred, thomas) + 3 son_of(bruce, thomas) + 4 son_of(david, bruce) + +And we want to know who fred's nephews are. So we'd ask ``uncle_nephew(fred, +$nephew, $prefix)``. + +Here are the steps (in parenthesis) in the inferencing up until the first +failure is encountered (with the line number from the example preceding each +line):: + + (1) 22 use uncle_nephew(fred, $nephew, $prefix) + 24 brothers(fred, $father) + (2) 16 use brothers(fred, $brother2) + 18 father_son($father, fred, ()) + (3) 2 use father_son($father, fred, ()) + 4 family2.son_of(fred, $father) + matches fact 2: son_of(fred, thomas) + 19 father_son(thomas, $brother2, ()) + (4) 2 use father_son(thomas, $son, ()) + 4 family2.son_of($son, thomas) + matches fact 1: son_of(tim, thomas) + 20 check fred != tim + 25 father_son(tim, $nephew, $prefix1) + (5.1) 2 use father_son(tim, $son, ()) + 4 family2.son_of($son, tim) => FAILS + (5.2) 6 use father_son(tim, $grand_son, (grand)) + 8 father_son(tim, $grand_son, ()) + 2 use father_son(tim, $son, ()) + 4 family2.son_of($son, tim) => FAILS + (5.3) 11 use father_son(tim, $gg_son, (great, $prefix1, *$rest_prefixes)) + 13 father_son(tim, $gg_son, ()) + 2 use father_son(tim, $son, ()) + 4 family2.son_of($son, tim) => FAILS + +Each rule invocation is numbered (in parenthesis) as a step number. Step 5 +has tried 3 different rules and they have all failed (5.1, 5.2 and 5.3). + +If you think of the rules as functions, the situation now looks like this +(the step numbers that succeeded circled in black, and steps that failed +circled in red): + +.. figure:: ../../images/bc_backtracking.png + :width: 590 + :height: 465 + :scale: 100 + :align: center + + We Need to Backtrack! + +At this point, Pyke has hit a dead end and must backtrack. The way that +backtracking proceeds is to go back up the list of steps executed, combining +the steps from all rules into one list. Thus, when step 5 fails, Pyke backs +up to step 4 and tries to find another solution to that step. + +If another solution is found, Pyke proceeds forward again from that point. If +no other solutions are found, Pyke backs up another step. + +When Pyke goes back to step 4, the next solution binds ``$son`` to ``fred``. +This fails the subsequent check in the ``brothers`` rule:: + + 20 check $brother1 != $brother2 + +And so Pyke goes back to step 4 once again. The next solution binds ``$son`` +to ``bruce``. This succeeds for ``brother`` and is passed down to +``father_son`` which returns ``david`` as ``fred's`` nephew. + +Further backtracking reveals no other solutions. + +Backtracking Summary +-------------------- + +Thus we see: + +#. The backtracking_ algorithm: "**fail** goes *up* (or *back*) while + **success** goes *down* (or *forward*)" is not limited to the steps within a + *single* rule's ``when`` clause; but includes the *entire* chain of + inferencing from the very start of trying to prove the top level goal. +#. This execution model is not available within traditional programming + languages like Python. +#. The ability to go back to *any* point in the computation to try an + alternate solution is where backward-chaining systems get their power! + +.. This code is hidden. It will add '' to sys.path, change to the doc.examples + directory and store the directory path in __file__ for the code section + following: + >>> import sys + >>> if '' not in sys.path: sys.path.insert(0, '') + >>> import os + >>> os.chdir("../../../examples") + >>> __file__ = os.getcwd() + +Running the Example +======================== + + >>> from pyke import knowledge_engine + >>> engine = knowledge_engine.engine(__file__) + >>> engine.activate('bc_related') + +Nothing happens this time when we activate the rule base, because there are no +forward-chaining rules here. + +We want to ask the question: "Who are Fred's nephews?". This translates +into the Pyke statement: ``bc_related.uncle_nephew(fred, $v1, $v2)``. + +.. note:: + Note that we're using the name of the rule base, ``bc_related`` rather than + the fact base, ``family2`` here; because we expect this answer to come from + the ``bc_related`` rule base. + +This is 'bc_related', 'uncle_nephew', with ('fred',) followed by 2 pattern +variables as arguments: + + >>> from __future__ import with_statement + >>> with engine.prove_goal('bc_related.uncle_nephew(fred, $nephew, $distance)') as gen: + ... for vars, no_plan in gen: + ... print(vars['nephew'], vars['distance']) + david () + + +.. _example: forward_chaining.html#example + + diff --git a/doc/sphinx/source/logic_programming/rules/forward_chaining.rst b/doc/sphinx/source/logic_programming/rules/forward_chaining.rst new file mode 100644 index 0000000..b2c3610 --- /dev/null +++ b/doc/sphinx/source/logic_programming/rules/forward_chaining.rst @@ -0,0 +1,403 @@ +.. $Id: forward_chaining.txt 9f7068449a4b 2010-03-08 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +================== +Forward Chaining +================== + +Forward chaining rules_ are processed automatically as each `rule base`_ is +activated_. + +When a rule base is activated_, all of its forward-chaining rules_ are run +in the order that they appear in the `.krb file`_ for that rule base. + +Overview of Forward-Chaining +============================= + +To do forward-chaining, Pyke finds rules whose *if* clause matches Pyke's list +of already known facts (the *if* clause may match, or *succeed*, multiple time; +see backtracking_). Each time a rule succeeds, it *fires* this rule, which +adds the facts in the *then* clause of that rule to the list of already known +facts. + +These new facts may fire other forward-chaining rules by matching their +*if* clause. This can go on to any depth. So Pyke ends up linking (or +*chaining*) the *then* clause of the first rule to the *if* clause of the next +rule. + +.. note:: + + Forward-chaining continues until no more rules_ can be fired. + +Reviewing +---------- + +#. Pyke starts with the *if* clause of the first rule and checks to see if it + matches the known facts. +#. If so, it proceeds to the *then* clause of that rule (*firing* the rule). +#. Which may link (or *chain*) to the *if* clause of another rule. + +Since Pyke processes these rules from *if* to *then* to *if* to *then* in the +manner that we normally think of using rules, it's called *forward* chaining. + +"Foreach", "Assert" Rather than "If", "Then" +============================================ + +Finally, since the statements within the *if* clause of the rule contain +patterns_; they may each match several facts. In this case, the rule will +succeed and be fired multiple times. + +The statements in the *then* clause of the rule also contain patterns. +Each time the rule is fired, the pattern variables within the *then* +statements are bound to different values so that different facts are asserted. + +To avoid confusion, Pyke uses the words **foreach** and **assert** rather +than **if** and **then** for forward-chaining rules. This is to suggest that +"for each" combination of facts matching the first list of statements, +the rule is fired to "assert" the facts in the second list of statements. + +.. note:: + + The use of **foreach** and **assert** identifies the rule as a + forward-chaining rule. + +Example +======= + +This example will figure out the paternal ancestry of individuals given a list +of starting statements about who the sons of each father are. (Daughters and +mothers are omitted to keep the example brief). These facts are stored in a +`fact base`_ called ``family1`` as ``son_of(son, father)``:: + + 1 son_of(david, bruce) + 2 son_of(bruce, thomas) + 3 son_of(thomas, frederik) + 4 son_of(frederik, hiram) + +We want to derive ``father_son`` relationships of the following form:: + + father_son($father, $son, $prefix) + +where + + :$son: + is the name of the son (e.g., david) + :$father: + is the name of the father (e.g., bruce) + :$prefix: + is a tuple of prefixes before the 'father' and 'son' titles to + indicate the number of generations (e.g., ``()`` for direct + father_son relationships, ``(grand)``, ``(great, grand)``, etc). + +This is done using three forward-chaining rules. Each rule is presented as a +separate step: + +- `Step 1: Direct_father_son`_ + + - Step 1 demonstrates the use of `pattern matching`_ to transfer values + from one statement within the rule to another statement. + +- `Step 2: Grand_father_son`_ + + - Step 2 demonstrates backtracking_ within the premises_ of a + forward-chaining rule. Understanding this will help you to understand + `backward-chaining rules`_. + +- `Step 3: Great_grand_father_son`_ + + - Step 3 demonstrates a recursive forward-chaining rule. + +Finally, you will be shown how to `Run the Example`_ yourself. + +Step 1: Direct_father_son +========================= + +First we need to establish the direct father_son relationships (those whose +``$prefix`` is ``()``):: + + 1 direct_father_son + 2 foreach + 3 family1.son_of($son, $father) + 4 assert + 5 family1.father_son($father, $son, ()) + +The Use of Pattern Variables +---------------------------- + +This demonstrates how `pattern variables`_ are used to transfer values from +one statement within a rule into another statement within the rule. + +This rule has a single statement in its ``foreach`` clause (on line 3). This +statement matches all four ``son_of`` facts, so the rule succeeds four times; +but with different bindings for the ``$son`` and ``$father`` pattern variables. +This causes different facts to be asserted when the same ``assert`` clause (on +line 5) is run four times; because each time line 5 is run, the values for +``$son`` and ``$father`` are transferred from the statement on line 3 to the +statement on line 5. + +When the rule fires matching line 3 to:: + + 1 son_of(david, bruce) + +It runs line 5 to assert:: + + 5 father_son(bruce, david, ()) + +And when the rule fires a second time matching line 3 to:: + + 2 son_of(bruce, thomas) + +It runs line 5 a second time to assert:: + + 6 father_son(thomas, bruce, ()) + +The rule fires twice more for the remaining ``son_of`` facts, asserting +two more ``father_son`` relationships. So this rule adds a total of four +new facts:: + + 5 father_son(bruce, david, ()) + 6 father_son(thomas, bruce, ()) + 7 father_son(frederik, thomas, ()) + 8 father_son(hiram, frederik, ()) + +Step 2: Grand_father_son +======================== + +Now we want to add grand son-father relationships. We have a new rule for +this:: + + 6 grand_father_son + 7 foreach + 8 family1.father_son($father, $grand_son, ()) + 9 family1.father_son($grand_father, $father, ()) + 10 assert + 11 family1.father_son($grand_father, $grand_son, (grand)) + +The Use of Backtracking +----------------------- + +The ``grand_father_son`` rule_ is run for all combinations of ``father_son`` +facts_ that satisfy the two ``foreach`` statements_ (on lines 8 and 9) and +asserts_ a ``(grand)`` ``father_son`` statement (on line 11) for each +combination. + +This rule is a good example for backtracking_ and will help later in your +understanding of backtracking with backward-chaining_. So let's follow the +backtracking in the execution of this rule. + +The ``foreach`` clause has two statements (on lines 8 and 9) in it that are +both looking for ``father_son`` facts with a prefix of ``()``:: + + 8 family1.father_son($father, $grand_son, ()) + 9 family1.father_son($grand_father, $father, ()) + +These will be matched to the following ``family1`` facts (facts 5 through 8):: + + 5 father_son(bruce, david, ()) + 6 father_son(thomas, bruce, ()) + 7 father_son(frederik, thomas, ()) + 8 father_son(hiram, frederik, ()) + +Pyke starts at the top of the list of premises and looks for a match for the +first premise (on line 8). This matches fact 5, so the first premise +succeeds, binding ``$father`` to ``bruce``:: + + 8 family1.father_son($father, $grand_son, ()) => fact 5, SUCCESS + 9 family1.father_son($grand_father, $father, ()) + +*Success* means go *down*, so Pyke goes to the next premise on line 9. This +succeeds with fact 6 (because ``$father`` is bound to ``bruce``):: + + 8 family1.father_son($father, $grand_son, ()) => fact 5 + 9 family1.father_son($grand_father, $father, ()) => fact 6, SUCCESS + +*Success* means go *down*, but Pyke is at the end of the list of premises, +so the *rule* succeeds and Pyke fires the rule to assert:: + + 9 father_son(thomas, david, (grand)) + +Since this is a forward-chaining rule, Pyke wants to get *all* of the answers +from it that it can, so it continues as if it had a failure (i.e., as if it's +not happy with this answer). + +.. note:: + + You'll see later that Pyke doesn't do this automatically with + backward-chaining_ rules. + +So Pyke *fails* back *up* to the second premise and looks for another +``father_son`` after fact 6 with ``bruce`` as the first argument. This +fails:: + + 8 family1.father_son($father, $grand_son, ()) => fact 5 + 9 family1.father_son($grand_father, $father, ()) => FAILS + +*Fail* means go *up*, so Pyke goes up to the first premise and looks for +another ``father_son`` after fact 5, which succeeds for fact 6, binding +``$father`` to ``thomas``:: + + 8 family1.father_son($father, $grand_son, ()) => fact 6, SUCCESS + 9 family1.father_son($grand_father, $father, ()) + +*Success* means go *down*, so Pyke goes down to the second premise which +succeeds for fact 7:: + + 8 family1.father_son($father, $grand_son, ()) => fact 6 + 9 family1.father_son($grand_father, $father, ()) => fact 7, SUCCESS + +*Success* means go *down*, but Pyke is at the end of the list of premises, +so the *rule* succeeds and Pyke fires the rule to assert:: + + 10 father_son(frederik, bruce, (grand)) + +Then Pyke *fails* back *up* to the second premise, and continues looking for +another match after fact 7. This fails:: + + 8 family1.father_son($father, $grand_son, ()) => fact 6 + 9 family1.father_son($grand_father, $father, ()) => FAILS + +*Fail* means go *up*, so Pyke goes back to the first premise and continues +looking for another match after fact 6. (Since fact 7 is just like the last +case, we'll skip matching fact 7 and go straight to the last fact, fact 8). +The match to fact 8 succeeds, binding ``$father`` to ``hiram``:: + + 8 family1.father_son($father, $grand_son, ()) => fact 8, SUCCESS + 9 family1.father_son($grand_father, $father, ()) + +*Success* means go *down*, so Pyke goes to the second premise and looks for a +``father_son`` for ``hiram``. This fails:: + + 8 family1.father_son($father, $grand_son, ()) => fact 8 + 9 family1.father_son($grand_father, $father, ()) => FAILS + +*Fail* means go *up*, so Pyke goes back up to the first premise and looks for +another match after fact 8. There are no more facts, so this fails:: + + 8 family1.father_son($father, $grand_son, ()) => FAILS + 9 family1.father_son($grand_father, $father, ()) + +*Fail* means go *up*, but Pyke is at the top of the list of premises, +so the *rule* fails and Pyke is done processing it. + +.. important:: + + Note that the *last* statement in the ``foreach`` clause may *succeed* + multiple times (which fires the ``assert`` clause multiple times). + + But the *first* statement in the ``foreach`` clause may only *fail* once. + When that happens, the whole rule fails and the show's over for this rule! + +So running the ``grand_father_son`` rule results in addition of these three +facts:: + + 9 father_son(thomas, david, (grand)) + 10 father_son(frederik, bruce, (grand)) + 11 father_son(hiram, thomas, (grand)) (this is the one we skipped) + +Step 3: Great_grand_father_son +============================== + +Finally, we want to add great(...) grand son-father relationships. We have +a final rule for this:: + + 12 great_grand_father_son + 13 foreach + 14 family1.father_son($father, $gg_son, ()) + 15 family1.father_son($gg_father, $father, ($prefix1, *$rest_prefixes)) + 16 assert + 17 family1.father_son($gg_father, $gg_son, + (great, $prefix1, *$rest_prefixes)) + +.. note:: + + Note how the $prefixes for the statement on line 15 are specified as + ``($prefix1, *$rest_prefixes)``, rather than just ``$prefix``. + This is done so that it does *not* match ``()``. (But it will still match + ``(grand)`` by binding ``$rest_prefixes`` to ``()``). + +This is the only rule that can be recursive. As this rule asserts_ new facts_, +those facts may be used by the same rule (by matching the statement on line +15) to produce even more great, great, ... ``father_son`` relationships. + +Recursive Rules +--------------- + +Running this rule normally will assert the following two facts:: + + 12 father_son(frederik, david, (great, grand)) + 13 father_son(hiram, bruce, (great, grand)) + +But, since these facts may also be used by the same rule (on line 15), Pyke +checks each one by trying to run the rule again just for that new fact. + +Trying this for the first new fact: ``father_son(frederik, david, +(great, grand))`` fails to find anything because ``david`` is not a father. + +Trying this for the second new fact: ``father_son(hiram, bruce, (great, +grand))`` results in one more new fact:: + + 14 father_son(hiram, david, (great, great, grand)) + +Now this last new fact is tried again with this rule, which fails again +because ``david`` is not a father. + +So at this point Pyke is finished with this rule. The rule ended up firing +three times, asserting:: + + 12 father_son(frederik, david, (great, grand)) + 13 father_son(hiram, bruce, (great, grand)) + 14 father_son(hiram, david, (great, great, grand)) + + +Running the Example +=========================== + +.. This code is hidden. It will add '' to sys.path, change to the doc.examples + directory and store the directory path in __file__ for the code section + following: + >>> import sys + >>> if '' not in sys.path: sys.path.insert(0, '') + >>> import os + >>> os.chdir("../../../examples") + >>> __file__ = os.getcwd() + +These rules could be run as follows: + + >>> from pyke import knowledge_engine + >>> engine = knowledge_engine.engine(__file__) + >>> engine.activate('fc_related') # This is where the rules are run! + >>> engine.get_kb('family1').dump_specific_facts() + father_son('bruce', 'david', ()) + father_son('thomas', 'bruce', ()) + father_son('frederik', 'thomas', ()) + father_son('hiram', 'frederik', ()) + father_son('thomas', 'david', ('grand',)) + father_son('frederik', 'bruce', ('grand',)) + father_son('hiram', 'thomas', ('grand',)) + father_son('frederik', 'david', ('great', 'grand')) + father_son('hiram', 'bruce', ('great', 'grand')) + father_son('hiram', 'david', ('great', 'great', 'grand')) + + +.. _Run the Example: `Running the Example`_ + + diff --git a/doc/sphinx/source/logic_programming/rules/index.rst b/doc/sphinx/source/logic_programming/rules/index.rst new file mode 100644 index 0000000..ab1dac8 --- /dev/null +++ b/doc/sphinx/source/logic_programming/rules/index.rst @@ -0,0 +1,140 @@ +.. $Id: index.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + forward_chaining + backward_chaining + +======= +Rules +======= + +Conceptually, a rule is very simple:: + + if + A + B + C + then + D + E + +Meaning, "if A, B *and* C are true, then D and E are also true". These are +often called *if-then* rules. + +.. admonition:: And what are A, B, C, D and E? + + They are simply statements_. Specifically, they are generalized statements + containing patterns_ as arguments. You'll see more about this later. + +Premises and Conclusions +================================= + +Rules have two parts to them: an **if** part (containing a list of statements +called the *premises*), and a **then** part (containing a list of statements +called the *conclusions*). + +.. note:: + + Pyke doesn't use the words **if** and **then**, as you'll see shortly. + +Each of these **if** and **then** parts contain one or more facts_ or goals_ +which are just generalized statements_ (meaning statements with patterns_ as +arguments). + + +Processing the Premises Within the *If* Clause +============================================== + +Because each premise with the *if* clause is a generalized statement, the +premise is pattern matched to known facts. This means that it may match more +than one fact. + +Pyke tries all combinations of matching facts through a process called +*backtracking*. This will cause the same rule to potentially succeed multiple +times, once for each unique combination of matching facts. + +Backtracking +------------ + +Note that while processing the list of premises within a rule's ``if`` +clause: + +* If Pyke succeeds at proving a premise: + + * Pyke will proceed *down* to the next premise in the list. + * Trying to proceed *down* from the *last* premise in the list (when it + succeeds) causes the rule to *succeed*. + +* If Pyke fails at proving a premise: + + * Pyke will back *up* to the prior premise in the list and try to find + another solution for it. The process starts over at the prior premise, + going back down or further up the list depending on whether another + solution can be found to the prior premise or not. + * Trying to back *up* from the *first* premise in the list (when it fails) + causes the rule to *fail*. + +.. figure:: ../../images/backtracking.png + :alt: Backtracking Flow Diagram + :align: center + + Backtracking Flow Diagram + +Thus, execution within each rule's ``if`` clause proceeds both backwards and +forwards, up and down the list of premises, depending on whether each +premise succeeds or fails. The process of backing up within the ``if`` +clause to try alternate solutions is called *backtracking*. + +Inferencing +=========== + +Rules are specified individually within a `rule base`_. They are not nested +or explicitly linked to each other. So Pyke must automatically figure out +how to combine these rules to accomplish some larger task. This is called +*inferencing* and there are two different approaches that Pyke uses: + +- All forward-chaining_ rules are processed when a `rule base`_ is activated_. + + - Forward-chaining rules may assert_ new facts, and activate_ more specific + `rule bases`_. + +- Backward-chaining_ rules are processed when your program asks Pyke to + prove_ a specific *goal* (i.e., asks Pyke a question_). + + - These rules are designed to answer a question rather than assert new + facts or activate more specific rule bases. + - They also have the ability to assemble Python functions into a customized + call graph or program, called a plan_, to meet a specific need. + +.. note:: + + Forward-chaining and backward-chaining rules may both be included within + the same `rule base`_. Pyke knows the difference between forward-chaining + and backward-chaining rules because they have different syntax__. + +.. __: ../../pyke_syntax/krb_syntax/index.html + + diff --git a/doc/sphinx/source/logic_programming/statements.rst b/doc/sphinx/source/logic_programming/statements.rst new file mode 100644 index 0000000..99ecbcb --- /dev/null +++ b/doc/sphinx/source/logic_programming/statements.rst @@ -0,0 +1,166 @@ +.. $Id: statements.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=========== +Statements +=========== + +A *statement* is a statement of fact, also just called a *fact*. They are +the bread and butter of Pyke. Statements are the data values that Pyke acts +upon. + +You might also think of a statement as a spoken sentence. For example, the +Pyke family_relations_ example deals with sentences like:: + + "Bruce is the son of Thomas (his father) and Norma (his mother)." + +But we condense the sentence down to it's essence. In this case, the sentence +revolves around three things: Bruce, Thomas and Norma. All of the rest of the +words can be condensed into a single identifier that identifies the +relationship between these three things:: + + son_of(Bruce, Thomas, Norma) + +We can give these condensed sentence structures any names that we want. In +this case, I chose ``son_of``. I might have also chosen "parents_of", which +might conjure the following English sentence:: + + "The parents of Bruce are Thomas (his father) and Norma (his mother)." + +Or:: + + "Bruce's parents are Thomas (his father) and Norma (his mother)." + +But the ``son_of`` form carries the additional information that Bruce is a son +rather than a daughter. So this is the form used in the family_relations +example. + +.. caution:: Statements are not functions! + When we wear our Python hats, ``son_of(Bruce, Thomas, Norma)`` looks like a + function call! We might expect that it can be executed to *do* something + and possibly return a value. But when we wear our Pyke hats, this is just + a statement, or a piece of data. It doesn't *do* anything and it **never** + returns a value! + +Note that it makes perfect sense to have several statements defining the same +relationship between their arguments:: + + son_of(Bruce, Thomas, Norma) + son_of(Michael, Bruce, Marilyn) + son_of(David, Bruce, Marilyn) + +But this only makes sense if they have different arguments. There is never a +need to state the same fact twice. Thus we can never establish two facts (two +statements) that are identical. If we try to do this, the second one is +silently ignored. + +So:: + + son_of(Bruce, Thomas, Norma) + son_of(Bruce, Thomas, Norma) + son_of(Bruce, Thomas, Norma) + +is exactly the same as:: + + son_of(Bruce, Thomas, Norma) + +Finally, we see that the position of each argument is important. In our +``son_of`` example, the meaning of each argument is:: + + son_of(son, father, mother) + +Thus, changing the order of the arguments changes the meaning of the +statement. So:: + + son_of(Bruce, Thomas, Norma) + +and:: + + son_of(Bruce, Norma, Thomas) + +mean different things! The first statement says that Thomas is the father of +Bruce, but the second statement says that Norma is the father! + +Syntactic Structure of Statements +================================= + +So we see that statements in Pyke are very structured. + +Pyke categorizes statements into `knowledge bases`_. You create knowledge +bases to help you organize your statements. A *knowledge base* in Pyke +roughly corresponds to a *module* in Python. + +.. note:: + Pyke does not allow knowledge bases to contain other knowledge bases, only + information about statements. Thus, there is only one level of knowledge + bases; and beneath each knowledge base, one level of statements. + +So statements have three components: + +#. The name of a knowledge base. For example, ``family``. +#. The name of a *knowledge entity*. For example, ``son_of``. +#. The statement arguments. These are just Python data. Currently in Pyke, + there is a push for these arguments to be immutable. + +The syntax for a statement looks like this:: + + statement ::= IDENTIFIER '.' IDENTIFIER '(' {argument,} ')' + +Knowledge Base +-------------- + +The first IDENTIFIER is the name of the knowledge base. In our +family_relations example, this is ``family``. + +.. note:: + You'll see that within `backward-chaining rules`_, the name of the + knowledge base may be omitted. It defaults to the currently selected + `rule base`_ for this `rule base category`_. You'll learn more about this + later. + +Knowledge Entity +---------------- + +The second IDENTIFIER is the name of the *knowledge entity*. This is the +relationship between the arguments. You could also think of this as the +statement *type* or *topic*. For example, ``son_of`` is a *type* of statement +with three arguments: (son, father, mother). Or the (son, father, mother) +arguments are about the *topic* ``son_of``. + +Arguments +--------- + +The arguments can be any simple Python data value (numbers, strings, None, +True or False) or tuples of these values (including nested tuples). +Currently, statements are supposed to be immutable, so all of the arguments +are immutable. The arguments relate to the topic, above, to make a complete +statement. + +.. note:: + Prolog_ allows arguments to be other statements (functors). But Pyke needs + to integrate into Python and Python has no concept of a "statement". So we + just use tuples in Pyke because Python is very happy with tuples! + +So the complete statement for our family_relations example is:: + + family.son_of(Bruce, Thomas, Norma) + diff --git a/doc/sphinx/source/pyke_syntax/index.rst b/doc/sphinx/source/pyke_syntax/index.rst new file mode 100644 index 0000000..d209d33 --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/index.rst @@ -0,0 +1,138 @@ +.. $Id: index.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + kfb_syntax + krb_syntax/index + kqb_syntax + +=========== +Pyke Syntax +=========== + +Source Files +============ + +Pyke has three different kinds of source files for the three main types of +`knowledge bases`_: + +#. *Knowledge Fact Base* (KFB) files for `fact bases`_. +#. *Knowledge Rule Base* (KRB) files for `rule bases`_. +#. *Knowledge Question Base* (KQB) files for `question bases`_. + +Each type of source file ends in a different file suffix: ``.kfb``, +``.krb`` or ``.kqb``. + +Place all of these source files into a directory structure. Then include this +directory as an argument to the `knowledge_engine.engine`_ constructor. +This will recursively search your directory for these three types of source +files, compile them, and load them into the engine. How you organize these +files into subdirectories is up to you -- the directory structure does not +matter to Pyke. + +The ``.kfb`` and ``.kqb`` files are compiled into Python pickles_ with +``.fbc`` and ``.qbc`` suffixes. + +The ``.krb`` files are compiled into up to three ``.py`` source files. +The names of these ``.py`` files are the same as the ``.krb`` file, but with +different endings: + +- ``_fc`` (if there are any forward-chaining_ rules) +- ``_bc`` (if there are any backward-chaining_ rules) and +- ``_plans`` (if any of the backward-chaining rules have a plan_) + +These ``.py`` files are then automatically imported to define the rule base. +This causes Python to compile them into ``.pyc`` or ``.pyo`` files. + +Subsequent runs of the `knowledge_engine.engine`_ constructor only recompile +the Pyke source files that have changed since the last time they were compiled. + +The name of each knowledge base is the filename of the Pyke source file with +the suffix removed. This must be a legal Python identifier. + +Syntax Legend +============== + +To describe this syntax, the following punctuation is used: + +'*any_chars*' + Required punctuation or keyword: *any_chars*. +*a* | *b* + Alternation: *a* or *b*. +[*a*] + Optional *a*. +{*a*} + One or more *a*'s. **But** it is understood that if *a* ends in a comma, + the last comma is optional. +IDENTIFIER + Any legal Python identifier. Example: *foobar* +NUMBER + Any legal Python integer or floating point literal. + Examples: *123*, *3.14*. +STRING + Any legal Python string literal. + Examples: *'Hi Mom!'*, *u"Hi Dad!\\n"*, *r'''don't gobble my \\'s!'''*, + *ur"""leave \\'s alone!"""*. +TEXT + Only used in KQB files. This signifies any text (any characters) other + than the delimiter characters containing the ``TEXT``. +PARAMETRIZED_TEXT + Only used in KQB files. This signifies any text (any characters) through + the end of the line and all text on subsequent lines that are indented at + least as much as the first ``PARAMETRIZED_TEXT`` character on the first + line. All ``PARAMETRIZED_TEXT`` is treated as a `string.Template`_ and + may include ``$IDENTIFIER`` or ``${IDENTIFIER}`` parameters. All other + ``$`` characters must be doubled (``$$``). +REGEXP_TEXT + Only used in KQB files. This signifies any text (any characters) excluding + an unescaped backslash (``\``) at the end. These are given to the Python's + ``re`` module as regular expressions and must follow Python's + `regular expression syntax`_. +NL + One or more newlines. +INDENT + The following text must be indented to a higher level (more) than the + previous text. +DEINDENT + The following text must be indented one less level than the previous text. + +Lexical Structure +======================= + +The lexical structure is much like Python. Like Python, indenting is +significant. It uses the same commenting, line continuation and literal +formats for strings and numbers (but doesn't use complex numbers). It also +uses the same rules for forming identifiers. + +The two notable exceptions to Python conventions are: + +#. Identifiers may be used as strings, without requiring quotes. + + - So ``foobar`` is the same as ``'foobar'``. + +#. Singleton tuples do not require a trailing comma. + + - So ``(1)`` is the same as ``(1,)``. + diff --git a/doc/sphinx/source/pyke_syntax/kfb_syntax.rst b/doc/sphinx/source/pyke_syntax/kfb_syntax.rst new file mode 100644 index 0000000..34126d3 --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/kfb_syntax.rst @@ -0,0 +1,75 @@ +.. $Id: kfb_syntax.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=================================== +KFB Syntax +=================================== + +This uses the same lexical structure as `KRB files`_, except that the only +keywords are: + +- None +- True +- False + +The name of the `fact base`_ is simply the filename with the ``.kfb`` suffix +stripped. This must be a valid Python identifier. + +Syntax for KFB File +=================== + +:: + + file ::= [NL] {fact NL} + + fact ::= IDENTIFIER '(' [{data,}] ')' + + data ::= 'None' | 'True' | 'False' + | NUMBER | IDENTIFIER | STRING + | '(' [{data,}] ')' + + +Example +======= + +This is taken from the family_relations_ example:: + + # family.kfb + + son_of(bruce, thomas, norma) + son_of(fred_a, thomas, norma) + son_of(tim, thomas, norma) + daughter_of(vicki, thomas, norma) + daughter_of(jill, thomas, norma) + + daughter_of(nanette, arthur2, kathleen) + son_of(arthur3, arthur2, kathleen) + daughter_of(sue, arthur2, kathleen) + son_of(ed, arthur2, kathleen) + daughter_of(marilyn, arthur2, kathleen) + son_of(david_b, arthur2, kathleen) + daughter_of(m_helen, arthur2, kathleen) + + son_of(m_thomas, bruce, marilyn) + son_of(david_a, bruce, marilyn) + + diff --git a/doc/sphinx/source/pyke_syntax/kqb_syntax.rst b/doc/sphinx/source/pyke_syntax/kqb_syntax.rst new file mode 100644 index 0000000..5111429 --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/kqb_syntax.rst @@ -0,0 +1,512 @@ +.. $Id: kqb_syntax.txt 4dca5ad0f397 2010-03-10 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +========== +KQB Syntax +========== + +This uses a different lexical structure than `KRB files`_. Textual parameter +substitution is done with the standard Python `string.Template`_ class, which +specifies parameters with a ``$``, much like `pattern variables`_. In the +following descriptions, substitution parameters are acted upon in +``PARAMETRIZED_TEXT``, but not in ``TEXT``. + +The name of the `question base`_ is simple the filename with the ``.kqb`` +suffix stripped. This must be a valid Python identifier. + + +PARAMETRIZED_TEXT +================== + +``PARAMETRIZED_TEXT`` may span multiple lines. Each subsequent line must +be indented at least as much as the first character of ``PARAMETRIZED_TEXT`` +on the first line. Line breaks and indentation are preserved. So syntax +like:: + + match '!' PARAMETRIZED_TEXT + +Could be:: + + 2-10 ! This is the start of the + parametrized text. + ^ + | + +------ all lines must be indented at least this far! + + - what do you think? + +The ``PARAMETRIZED_TEXT`` here would be:: + + This is the start of the + parametrized text. + ^ + | + +------ all lines must be indented at least this far! + + - what do you think? + +But this is not legal:: + + 2-10 ! An example of PARAMETRIZED_TEXT + with a second line that's not indented enough! + + +Syntax for KQB File +=================== + +:: + + file ::= [NL] {question} + + question ::= IDENTIFIER '(' [{parameter,}] ')' NL INDENT + {PARAMETRIZED_TEXT NL} + '---' NL + parameter '=' question_type + DEINDENT + + parameter ::= '$' IDENTIFIER + +Each question has a name and a fixed number of parameters. This is followed +by one or more lines of ``PARAMETRIZED_TEXT`` that will be presented as the +question to answer. These are terminated by a line containing only ``---``. + +One of the parameters is designated as the *answer* parameter on the line +immediately following the terminating ``---``. This is the only parameter +that may be unbound when a rule uses this question. + +For example, the file ``user_questions.kqb`` might contain:: + + ate($meal, $ans) + Did you eat $meal? + --- + $ans = yn + +This question could be referenced in the `premise syntax`_ of a rule_ as:: + + user_questions.ate(lunch, $ans) + +or:: + + user_questions.ate(lunch, False) + +But not:: + + user_questions.ate($meal, False) + +There are several different kinds of ``question_types``, each corresponding to +a different way that the user might answer the question:: + + question_type ::= yn_type + | integer_type + | number_type + | float_type + | string_type + | select_1_type + | select_n_type + + +The ``integer_type``, ``number_type``, ``float_type`` and ``string_type`` may +include a match_ to force the user to enter a sensible answer. + +All of these may also include a review_, which is just ``PARAMETRIZED_TEXT`` +that will be displayed when the user's answer matches a certain match_ value. + +Question_type links: + +- yn_type_ +- integer_type_ +- number_type_ +- float_type_ +- string_type_ +- select_1_type_ +- select_n_type_ + +YN_type +======= + +:: + + yn_type ::= 'yn' NL [review] + +The user answers "yes" or "no". The answer returned is True or False. If the +`ask_tty`_ module is used, the user may type "yes", "y", "true" or "t" for +True and "no", "n", "false", or "f" for False. These are case insensitive. + +Example:: + + ate($meal, $ans) + Did you eat $meal? + --- + $ans = yn + +See review_, below. + + +Integer_type +============ + +:: + + integer_type ::= 'integer' ['(' match ')'] NL [review] + +The user enters an integer. If the match_ is specified, the integer must +match it or the user is asked to try again. + +Example:: + + hours_since_last_meal($ans) + How many hours has it been since you last ate? + --- + $ans = integer(0-48) + +See review_, below. + + +Number_type +============ + +:: + + number_type ::= 'number' ['(' match ')'] NL [review] + +The user enters either an integer or a floating point number. If the user +enters an integer, a Python ``int`` is returned. Otherwise a Python ``float`` +is returned. + +If the match_ is specified, the number must match it or the user is asked +to try again. + +Example:: + + miles_to($dest, $ans) + How many miles did you travel to get to $dest? + --- + $ans = number(0.1-3000) + +See review_, below. + + +Float_type +============ + +:: + + float_type ::= 'float' ['(' match ')'] NL [review] + + +The user enters an integer or a floating point number. But the answer +returned is always a Python ``float``. + +If the match_ is specified, the number must match it or the user is asked +to try again. + +Example:: + + price($object, $price) + What did you pay for $object? + --- + $price = float + +See review_, below. + + +String_type +============ + +:: + + string_type ::= 'string' ['(' match ')'] NL [review] + +The user enters a string (text). If the match_ is specified, the string must +match it or the user is asked to try again. + +Example:: + + users_name($name) + What's your name? + - Please don't enter a fictitious (screen) name. + --- + $name = string(2-40) + +See review_, below. + + +Match +===== + +There are several kinds of simple_matches that may be or-ed together with +``|``:: + + match ::= simple_match {'|' simple_match} + +The match succeeds if any of the ``simple_matches`` succeed. + +:: + + simple_match ::= '(' match ')' + | [ STRING ] [ '[' TEXT ']' ] '/' REGEXP_TEXT '/' + | [NUMBER] '-' NUMBER + | NUMBER '-' + | value '=' simple_match + | value + +Regexp Match +------------ + +:: + + simple_match ::= [ STRING ] [ '[' TEXT ']' ] '/' REGEXP_TEXT '/' + +A regexp match can only be used with string_type_ questions. It matches if +the regexp matches. + +If the regexp contains a single group, that group is returned as the +question's answer rather than the entire string. + +If the regexp contains multiple groups, a tuple of the groups is returned as +the question's answer rather than entire string. + +If STRING is specified on a regexp, it is used in the error message if the +regexp fails. The error message is "Answer should be $error_msg, got $string". + +If '[' TEXT ']' is specified on a regexp, it is used in the prompt for the +end user to inform him of what is expected. Generally, this prompt message +is enclosed in '[' and ']' when it is displayed to the user. + +Example:: + + state_code($state) + Enter your two digit state code. + --- + $state = string('uppercase'[uppercase]/[A-Z][A-Z]/) + +Range Match +----------- + +:: + + simple_match ::= [NUMBER] '-' NUMBER + | NUMBER '-' + +A range match has a '-' in it. It matches if the answer is between the two +values. If either value is omitted, that limit is not tested. If matched to +a string, it matches the length of the string. + +Example:: + + age($years) + How old are you? + --- + $years = integer(1-130) + +Value '=' Match +--------------- + +:: + + simple_match ::= value '=' simple_match + +The '=' means "substituted for". The match_ fails if the match after the '=' +fails. Otherwise it returns the value before the '=' rather than what the +user entered. Note that you can or (``|``) several of these together to +translate several different matched values. + +Example:: + + age_category($period_of_life) + How old are you? + --- + $period_of_life = integer(child=1-12 | + teenager=13-19 | + young_adult=20-35 | + middle_age=35-64 | + elder=65-130) + + +Value Match +----------- + +:: + + simple_match ::= value + + value ::= STRING | IDENTIFIER | NUMBER | 'None' | 'True' | 'False' + +A value match, only matches that one value. An IDENTIFIER is treated as a +STRING. These are mostly used in reviews. + + +Review +====== + +:: + + review ::= {match '!' PARAMETRIZED_TEXT NL} + +All of the ``reviews`` must be at the same indent level. + +The review is applied after the answer has been validated (validation possibly +changes the value). + +Each match_ is checked and all of the matching review's ``PARAMETRIZED_TEXT`` +messages are displayed to the user. + +Examples:: + + stupid_question($ans) + Can you answer a question + that is several lines long? + --- + $ans = yn + True ! Correct! This is true because the + sky is blue! + False ! Nope! Remember that the sky is blue! + + wood($ans) + How much wood would a woodchuck chuck if a woodchuck could chuck wood? + --- + $ans = integer(0-100) + -10 ! more than that! + 10-20 ! bingo! + 21- ! I guess they're not as strong as you think ... + +.. This code is hidden. It will add '' to sys.path, change to the doc.examples + directory and store the directory path in __file__ for the code section + following: + >>> import sys + >>> if '' not in sys.path: sys.path.insert(0, '') + >>> import os + >>> os.chdir("../../examples") + >>> __file__ = os.getcwd() + +Asking ``stupid_question`` and answering "y" to it:: + + >>> from pyke import knowledge_engine + + >>> engine = knowledge_engine.engine(__file__) + + >>> from io import StringIO + >>> import sys + >>> class echo(object): + ... def __init__(self, f): self.f = f + ... def readline(self): + ... ans = self.f.readline() + ... sys.stdout.write(ans) + ... return ans + >>> sys.stdin = echo(StringIO('y\n')) + +displays:: + + >>> engine.prove_1_goal('user_questions.stupid_question($ans)') + ______________________________________________________________________________ + Can you answer a question + that is several lines long? (y/n) y + Correct! This is true because the + sky is blue! + ({'ans': True}, None) + + +Select_1_type +============= + +:: + + select_1_type ::= 'select_1' NL alternatives + +This is a multiple choice question. The alternatives_ are displayed to the +user, and he picks one (and only one). + +Example:: + + another_question($arg1, $arg2, $ans) + question text with $arg1 stuff in it. + on multiple lines + - possibly indented + - for who knows what reason... + - maybe for $arg2? + --- + $ans = select_1 + 1: prompt for this selection with $arg2 in it too + which can span multiple lines + - and be indented ... + ! Nope! Remember that the sky is blue! + 2: next prompt + ! =1 # same review as 1: + 3: pick me! pick me!!! + ! Correct! You certainly know about $arg1! + yep, multiple review lines too... + - and indented... + + +Select_n_type +============= + +:: + + select_n_type ::= 'select_n' NL alternatives + +This is a multiple choice question. The alternatives_ are displayed to the +user, and he picks as many as he likes. + +Example:: + + problems($list) + Which of these problems are you experiencing? + - select all that apply + --- + $list = select_n + boot: The system won't boot. + os: I hate Windows! + internet: I can't connect to the internet. + slow: The system is running too slow. + ouch: Help! I've fallen and I can't get up! + freeze: The system freezes or does not respond to input. + printer: The printer doesn't work. + senile: What's email? + +Alternatives +============ + +:: + + alternatives ::= {value ':' PARAMETRIZED_TEXT NL [alt_review]} + +All of the ``alternatives`` must be at the same indent level. + +The user only sees the ``PARAMETRIZED_TEXT`` values. The ``value`` +associated with the selected ``PARAMETRIZED_TEXT`` is returned (but the user +never sees it). The ``value`` *tags* the alternative. + +:: + + alt_review ::= '!' '=' value NL + | '!' PARAMETRIZED_TEXT NL + +Each alternative may have it's own review associated with it. + +The ``'!' '=' value`` form uses the same review text as the previous +alternative with that *tag*. Note that this can not refer forward to a +following alternative. + +The second form specifies the review text for this alternative directly. + + diff --git a/doc/sphinx/source/pyke_syntax/krb_syntax/bc_rule.rst b/doc/sphinx/source/pyke_syntax/krb_syntax/bc_rule.rst new file mode 100644 index 0000000..0ef2336 --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/krb_syntax/bc_rule.rst @@ -0,0 +1,216 @@ +.. $Id: bc_rule.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================================= +Bc_rule Syntax +============================================= + +Bc_rule +========== + +Backward-chaining_ rules_ have four parts: + +#. A unique name. +#. A `use clause`_. +#. An optional `when clause`_. +#. An optional `with clause`_. + +:: + + bc_rule ::= IDENTIFIER NL INDENT + use + [when] + [with] + DEINDENT + +The ``IDENTIFIER`` is the unique name for this rule_ and is used as the +corresponding Python function name in the generated _bc.py file +and also for the Python function name of the plan_ function (if any) +associated with the rule. This name will show up in stack traces +associated with exceptions raised during inferencing or plan execution. + +Use Clause +============ + +The ``use`` clause is the **then** part of the rule. It identifies the +*goal* that this rule is prepared to prove. + +:: + + use ::= 'use' IDENTIFIER '(' {pattern,} ')' ['taking' '(' ')'] NL + | 'use' IDENTIFIER '(' {pattern,} ')' NL + INDENT 'taking' '(' ')' NL + DEINDENT + +Notice that it uses a single ``IDENTIFIER``. The `rule base`_ name is implied +as the `rule base category`_ name (the name of the root rule base, see +`extending clause`_) for the rule base containing this rule. + +Taking Clause +---------------- + +The ``use`` clause also defines parameters to the plan_ function (if one is +used for this rule_) with the optional ``taking`` sub-clause. + +The *python_arg_spec* is not parsed by Pyke, but simply copied to the +output plan function. Do **not** use ``$`` with these parameter names (or +their default values). + +When Clause +============== + +The ``when`` clause is the **if** part of the rule_. It defines the +premises that must be true for this rule to succeed. + +If the ``when`` clause is omitted, the only +requirement for the rule to succeed is that the ``use`` clause +`pattern matches`_ the goal. + +If the ``when`` clause is specified, the rule succeeds for each combination +of true premises (see backtracking_). + +:: + + when ::= 'when' NL INDENT + {bc_premise NL} + DEINDENT + + bc_premise ::= ['!'] [ name '.' ] name '(' {pattern,} ')' [ plan_spec ] + | compound_premise + | python_premise + + name ::= IDENTIFIER + | '$'IDENTIFIER + +Here are the links to the definitions for `pattern syntax`_, compound_premise_ and +python_premise_. + +If the *bc_premise* includes the ``!``, an AssertionError will be raised if the +premise fails on the first try. This can help in debugging. + +.. Note:: + This does not apply when the premise fails on backtracking_ (in which case + it has already succeeded at least once). + +If a single *name* is used in the *bc_premise*, +the `rule base category`_ for the current `rule base`_ (the root rule base +name, see `extending clause`_) is assumed. + +If two *names* are used in the *bc_premise*, the first may name a rule +base category or some other `knowledge base`_. + +If a rule base category name is used (or assumed), the currently active_ +`rule base`_ for that category is used to prove the premise. + +.. note:: + + If the rule base category name is omitted, and therefore assumed + to be the current rule base's rule base category, the current rule base + does *not* have to be the active rule base for that category. It could be + the case that a derived rule base is the active rule base. In that case, + the derived rule base is used to prove the premise. + + In this way, different rules may be used to prove the same premise, + depending upon which rule base has been activated. + +Plan_spec +------------ + +A *plan_spec* is required for each premise that returns a subordinate plan_. +This shows what should be done with that subordinate plan_ function. + +Thus, a rule's plan function is composed first of the collected +python_statements taken from its plan_specs (as described below), followed by +the python_statements within its `with clause`_ (if any). The inclusion of +any plan_spec containing a python_statement will cause a plan_ function to be +generated for this rule, even if the rule lacks a ``with`` clause. + +:: + + plan_spec ::= [ 'step' NUMBER ] NL INDENT + { NL} + DEINDENT + | 'as' '$'IDENTIFIER NL + +Within each python_statement, the subordinate plan function is indicated by +``$$``. The result of this function may be assigned to a Python variable, +but not a `pattern variable syntax`_ (``$variable``). +Parameters from the rule's ``taking`` clause may be passed on to the +subordinate plan_ functions. + +When multiple premises have python_statements in their *plan_specs*, the +python_statements in plan_specs *without* a ``step`` clause are executed first +in the order that they appear in the ``when`` clause. + +Then the python_statements in plan_specs *with* a ``step`` clause are +executed in ascending NUMBER sequence. It is permissible for the NUMBER +to be negative or a float. + +If the ``as`` clause is used, the plan function is bound to the +pattern variable as a Python function, but not automatically executed. +This allows you to call the function (or not) when and as many times as you +please. The parameters required are defined in the ``taking`` clause of the +rule used to prove the premise. + +.. note:: + + Within a forall_ or notany_ premise, the only ``plan_spec`` that may be + used is the ``as`` clause. + +With Clause +============== + +The ``with`` clause contains Python statements to include in the plan_ +produced by this rule_. These Python statements may include +`pattern variables`_ whose values will be cooked_ into these statements +when the plan is created. + +:: + + with ::= 'with' NL INDENT + { NL} + DEINDENT + +The *python_statements* are included in the rule's plan function after +all of the calls to the subordinate plan functions made from the +*plan_specs* in the `when clause`_. + +If the ``with`` clause is omitted, but the ``when`` clause has *plan_specs* +(excluding the *as* clause), a plan function is still generated for this +rule so that the subordinate plan functions are still called. + +The *python_statements* are not parsed. They are simply scanned for ``$`` +pattern variables that don't occur within string literals or comments. +The values bound to these variables are cooked_ into the code to produce the +plan. + +Thus, all pattern variables used within *python_statements* (both in the +``plan_specs`` and the ``when`` clause) must be bound to a value. This +value is a constant value that never changes for this plan_. + +.. note:: + + This occurs after the entire top-level goal is proven so that it is + permissible to bind these pattern variables to values *following* the + execution of the rule containing them. + + diff --git a/doc/sphinx/source/pyke_syntax/krb_syntax/compound_premise.rst b/doc/sphinx/source/pyke_syntax/krb_syntax/compound_premise.rst new file mode 100644 index 0000000..7fa8d03 --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/krb_syntax/compound_premise.rst @@ -0,0 +1,288 @@ +.. $Id: compound_premise.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================================= +Compound Premise Syntax +============================================= + +There are three kinds of compound premises. These can be used in both +`forward-chaining rules`_ and `backward-chaining rules`_, but the nested +premises within each of these are restricted to the kind of premises legal +for that kind of rule: fc_premise_ for forward-chaining rules, and +bc_premise_ for backward-chaining rules. + +:: + + compound_premise ::= first_premise + | forall_premise + | notany_premise + +First Premise +===================== + +The ``first`` premise is used to prevent backtracking_ from finding subsequent +solutions to a set of premises. The ``first`` premise always fails on +backtracking (but does do backtracking *within* the nested premises). + +:: + + first_premise ::= ['!'] 'first' premise + | ['!'] 'first' NL + INDENT + {premise NL} + DEINDENT + +The ``!`` option can only be used in backward-chaining rules. + +When used within backward-chaining rules, the nested premises may include any +type of plan_spec_. + +Forall Premise +===================== + +The ``forall`` premise forces backtracking_ within the nested premises to +process all of the possible solutions found before the ``forall`` succeeds. +After the first success, the ``forall`` fails on backtracking. + +:: + + forall_premise ::= 'forall' NL + INDENT + {premise NL} + DEINDENT + [ 'require' NL + INDENT + {premise NL} + DEINDENT ] + +The premises within the ``require`` clause are tried for each solution found +to the ``forall`` clause. If these fail for any solution, then the entire +``forall`` premise fails. Thus, the ``forall`` only succeeds if the +``require`` premises are true for *all* solutions generated within the +``forall`` clause. Thus, the ``forall`` clause may be read: "Forall X, +require Y". + +The ``forall`` always succeeds if the ``require`` clause is omitted (even if +no solutions are found to the nested premises). This can be used in +conjunction with python_statements_ to gather a list of results. + +See `Notes on Forall and Notany Premises`_ and Examples_, below. + +Notany Premise +===================== + +The ``notany`` premise only succeeds if no solution can be found to the nested +premises. ``Notany`` always fails on backtracking_. + +:: + + notany_premise ::= 'notany' NL + INDENT + {premise NL} + DEINDENT + +See `Notes on Forall and Notany Premises`_ and Examples_, below. + +Notes on Forall and Notany Premises +====================================== + +#. All `pattern variable syntax`_ bindings made during the execution of a ``forall`` + or ``notany`` premise are undone before the premises following the + ``forall`` or ``notany`` are run. + Thus, ``forall`` and ``notany`` can be used to test + values produced by prior premises; but to generate values for subsequent + premises the values must be captured in Python variables within the + ``forall`` or ``notany`` clause before the `pattern variables` are unbound + (see `Computing a Value for Each Generated Value`_, below). + +#. When used within `backward-chaining rules`_, the only plan_spec_ allowed in + nested premises is the ``as`` clause. + +Examples +============= + +- `Finding the First Solution From a Set of Values`_ +- `Testing Every Generated Value`_ +- `Computing a Value for Each Generated Value`_ +- `Iterating on Tuples`_ +- `Computing Values for All Generated Values that Pass a Test`_ + +These examples use the following subgoals: + +* ``generate_x($x)`` generates multiple solutions (as ``$x``) that will be + looped over +* ``test_x($x)`` does some test on ``$x`` +* ``compute_y($x, $y)`` takes ``$x`` as input and computes a ``$y`` value + +Finding the First Solution From a Set of Values +------------------------------------------------- + +If you want the first ``$x`` that passes the ``test_x($x)`` test, you have two +options:: + + generate_x($x) + test_x($x) + ... + +And:: + + first + generate_x($x) + test_x($x) + ... + +The difference is that the first example will find other ``$x`` values that +pass ``test_x($x)`` on backtracking_, while the second example will stop after +the first value is found and fail on backtracking. + +Testing Every Generated Value +----------------------------- + +There are two general cases. You might want to verify that ``test_x($x)`` +*succeeds* for all generated ``$x`` values:: + + forall + generate_x($x) + require + test_x($x) + +.. Note:: + + While ``$x`` is set and used within the ``forall`` premise to transfer + values from the ``generate_x($x)`` goal to the ``test_x($x)`` goal, it is + no longer set afterwards and can not be referenced in the premises + following the ``forall`` premise. + +The second case that you might want to verify is that ``test_x($x)`` *fails* +for every generated ``$x`` value:: + + forall + generate_x($x) + require + notany + test_x($x) + +Or, more simply:: + + notany + generate_x($x) + test_x($x) + +Computing a Value for Each Generated Value +------------------------------------------ + +If you want a tuple of computed ``$y`` values for all of the ``$x`` values:: + + python y_list = [] + forall + generate_x($x) + require + compute_x($x, $y) + python y_list.append($y) + $y_list = tuple(y_list) + +This will only succeed if ``compute_y`` succeeds for every ``$x`` value. + +If you want to skip over ``$x`` values that ``compute_y`` fails on, you +*might* try:: + + python y_list = [] + forall + generate_x($x) + compute_x($x, $y) + python y_list.append($y) + $y_list = tuple(y_list) + +But note that if ``compute_y`` computes multiple solutions for a single +``$x`` value on backtracking_, you would end up including all of these +solutions in your ``$y_list``. To only get the first computed value for each +``$x`` value:: + + python y_list = [] + forall + generate_x($x) + first + compute_x($x, $y) + python y_list.append($y) + $y_list = tuple(y_list) + +Iterating on Tuples +------------------- + +A simple common case of ``generate_x`` is when you are computing values for +each element of a tuple:: + + python y_list = [] + forall + $x in $x_list + require + compute_x($x, $y) + python y_list.append($y) + $y_list = tuple(y_list) + +This can also be done by creating a new subgoal that recurses on ``$x_list``. +If you call the new subgoal ``compute_list``, you would use it like this:: + + compute_list($x_list, $y_list) + +And define it like this:: + + compute_list_done + use compute_list((), ()) + + compute_list_step + use compute_list(($x, *$x_rest), ($y, *$y_rest)) + when + compute_y($x, $y) + compute_list($x_rest, $y_rest) + +.. important:: + + Note that there is an important difference between these two examples if + ``compute_y`` may find alternate ``$y`` values for any given ``$x`` value + on backtracking_. + + The first example will only generate one ``$y_list``. If that ``$y_list`` + doesn't work for subsequent premises, the ``forall`` fails on backtracking, + so no overall solution will be found. + + The second example will not fail in this situation, but will produce all + possible combinations of solutions to ``compute_y`` for each ``$x`` on + backtracking until a resulting ``$y_list`` satisfies the subsequent + premises so that an overall solution *is* found. + +Computing Values for All Generated Values that Pass a Test +---------------------------------------------------------- + +Finally, if you want to gather only the computed ``$y`` values for ``$x`` +values that pass ``test_x($x)``:: + + python y_list = [] + forall + generate_x($x) + test_x($x) + require + compute_x($x, $y) + python y_list.append($y) + $y_list = tuple(y_list) + + diff --git a/doc/sphinx/source/pyke_syntax/krb_syntax/fc_rule.rst b/doc/sphinx/source/pyke_syntax/krb_syntax/fc_rule.rst new file mode 100644 index 0000000..fdd25f6 --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/krb_syntax/fc_rule.rst @@ -0,0 +1,88 @@ +.. $Id: fc_rule.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================================= +Fc_rule Syntax +============================================= + +Fc_rule +============= + +Forward-chaining_ rules have three parts: + +#. A unique name. +#. An optional `foreach clause`_. +#. An `assert clause`_. + +:: + + fc_rule ::= IDENTIFIER NL INDENT + [fc_foreach] + fc_assert + DEINDENT + +The ``IDENTIFIER`` uniquely names this rule_ and is used as the corresponding +Python function name in the generated _fc.py file. + +Foreach clause +================= + +:: + + fc_foreach ::= 'foreach' NL INDENT + {fc_premise NL} + DEINDENT + + fc_premise ::= fact_pattern + | compound_premise + | python_premise + + fact_pattern ::= IDENTIFIER '.' IDENTIFIER '(' [{pattern,}] ')' + +Here are links to the definitions for `pattern syntax`_, compound_premise_ and +python_premise_. + +If the ``foreach`` clause is omitted, the rule_ is always fired once. + +If the ``foreach`` clause is present, the rule is fired for each combination +of true premises. + +Assert clause +================= + +:: + + fc_assert ::= 'assert' NL INDENT + {assertion NL} + DEINDENT + + assertion ::= fact_pattern + | python_statements + +Here is the link to the definitions of python_statements_. + +The ``assert`` clause lists new facts_ to assert, and/or Python +statements to execute each time the rule_ is fired. Each of these may +include `pattern variables`_ which should also appear in the ``foreach`` +clause where they are bound to a value. These values will then be substituted +into the facts and Python statements. + diff --git a/doc/sphinx/source/pyke_syntax/krb_syntax/index.rst b/doc/sphinx/source/pyke_syntax/krb_syntax/index.rst new file mode 100644 index 0000000..825524e --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/krb_syntax/index.rst @@ -0,0 +1,129 @@ +.. $Id: index.txt a2119c07028f 2008-10-27 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + fc_rule + bc_rule + pattern + compound_premise + python_premise + +=================== +KRB Syntax +=================== + +This section describes the syntax for defining rules_ in KRB files. + + +Keywords +================== + +========= =========== ========= +as foreach taking +assert in True +bc_extras None use +check plan_extras when +extending python with +False step without +fc_extras +========= =========== ========= + + + +Syntax of the Entire KRB File +=================================== + +:: + + file ::= [NL] + + ['extending' IDENTIFIER ['without' {IDENTIFIER,}] NL] + + [{fc_rule} + ['fc_extras' NL INDENT + { NL} + DEINDENT]] + + [{bc_rule} + ['bc_extras' NL INDENT + { NL} + DEINDENT] + ['plan_extras' NL INDENT + { NL} + DEINDENT]] + +The KRB file has three optional parts. It must contain at least one rule_ +(either forward-chaining_ or backward-chaining_). + +The filename (minus the .krb extension) is the name of the `rule base`_. +This must be a legal Python identifier. + +Extending clause +----------------- + +The optional ``extending`` clause, if used, is the first line of the file. +This defines the parent `rule base`_ that this `rule base`_ inherits_ from. +It may also specify a list of backward-chaining_ goal names to be excluded +from this inheritance. + +Forward-Chaining Section +-------------------------- + +If the krb file contains any forward-chaining_ rules, a Python source file +will be created named _fc.py, where is the `rule base`_ +name. + +The syntax of a forward-chaining rule (fc_rule_) is defined here__. + +The ``fc_extras`` may only be used if there are forward-chaining rules. +This allows you to add other Python code (for example, ``import`` statements) +to the generated Python source file. + +.. __: fc_rule_ + +Backward-Chaining Section +-------------------------- + +If the krb file contains any backward-chaining_ rules, a Python source file +will be created named _bc.py, where is the `rule base`_ +name. + +The syntax of a backward-chaining rule (bc_rule_) is defined here__. + +The ``bc_extras`` can only be used if there are backward-chaining rules. +This allows you to add other Python code (for example, ``import`` statements) +to the generated Python source file. + +In addition, if any of the backward-chaining rules have plan_ code (a +`with clause`_ or any subgoals in the `when clause`_ with a plan_spec_), +a Python source file will be created named _plans.py, +where is the `rule base` name. + +You use the ``plan_extras`` to include arbitrary Python code in this plans +file. + +.. __: bc_rule_ + + diff --git a/doc/sphinx/source/pyke_syntax/krb_syntax/pattern.rst b/doc/sphinx/source/pyke_syntax/krb_syntax/pattern.rst new file mode 100644 index 0000000..062c32b --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/krb_syntax/pattern.rst @@ -0,0 +1,75 @@ +.. $Id: pattern.txt 057d79259b20 2009-05-14 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +============================================= +Pattern Syntax +============================================= + +Pattern +============ + +:: + + pattern ::= 'None' | 'True' | 'False' + | NUMBER | IDENTIFIER | STRING | variable + | '(' [{pattern,}] ['*' variable] ')' + +IDENTIFIER acts like a STRING here, meaning that it is taken as a literal +value. All variables in patterns must be preceded by a ``$``. + +Pyke does not currently support complex NUMBERS (for no good reason -- email +me if you need them). + +Pattern Variable +=================== + +`Pattern variables`__ are simply called *variable* in the syntax:: + + variable ::= '$'IDENTIFIER + +The variable must not have a space between the ``$`` and the ``IDENTIFIER``. + +.. __: `pattern variable lp`_ + +Anonymous Variable +==================== + +If the pattern variable IDENTIFIER begins with an underscore (_), the variable +is an `anonymous variable`__. It acts like a "don't care". Technically, this +means that multiple uses of the same IDENTIFIER may stand for different +values. The name of the IDENTIFIER after the underscore is ignored and may be +used to document the use of the anonymous variable. + +.. __: `anonymous variable lp`_ + +Rest Variable +================ + +The ``*variable`` at the end of a tuple pattern will match the rest of the +tuple. Thus, ``variable`` is *always* bound to a (possibly empty) tuple. + +The syntax is taken from rest parameter syntax in Python function definitions. +The difference here is that the variable needs a ``$`` on it. + +You may use either a named variable or an anonymous variable here. + + diff --git a/doc/sphinx/source/pyke_syntax/krb_syntax/python_premise.rst b/doc/sphinx/source/pyke_syntax/krb_syntax/python_premise.rst new file mode 100644 index 0000000..0b5d0de --- /dev/null +++ b/doc/sphinx/source/pyke_syntax/krb_syntax/python_premise.rst @@ -0,0 +1,122 @@ +.. $Id: python_premise.txt 9c1b571b39ac 2009-02-15 mtnyogi $ +.. +.. Copyright © 2007-2008 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +===================== +Python Premise Syntax +===================== + +Python_premise +============== + +:: + + python_premise ::= pattern '=' python_exp + | pattern 'in' python_exp + | 'check' python_exp + | python_statements + +Each of these clauses results in a Python expression being executed. Their +meaning is as follows: + +`pattern syntax`_ '=' python_exp + *python_exp* is evaluated and the result matched_ with `pattern syntax`_. + If the result does not match, the clause fails. + + The clause always fails on backtracking_, meaning that it only produces + a single result (contrasted with ``in``). +`pattern syntax`_ 'in' python_exp + *python_exp* is evaluated to produce a Python *iterable* and the first + element from the resulting iterable is matched_ with `pattern syntax`_. On + backtracking_, successive elements from the iterable are matched with + `pattern syntax`_. When the result is exhausted, the clause fails. + + This has the effect of offering each element of the result, one at a + time, to the subsequent premise clauses. Each element is thus acted upon + individually. +'check' python_exp + *python_exp* is evaluated. If the result is Python "true" the clause + succeeds, otherwise it fails. The clause always fails on backtracking_. + + +Python_statements +=================== + +:: + + python_statements ::= 'python' python_statement + | 'python' NL INDENT + {python_statement NL} + DEINDENT + +This clause allows the inclusion of arbitrary Python statements in your +rules_. This premise always succeeds; and then fails on backtracking_. + +The current ``knowledge_engine`` object is available within python_statements +as the variable called ``engine``. + +.. caution:: + + Always keep in mind the difference between `pattern variables`_ and + *Python variables*. Pattern variables are always indicated with a ``$`` + and are only bound to a value during inferencing. + + #. Thus, a ``python_statement`` may not set a pattern variable. Storing a + value computed by Python into a pattern variable can only be done using + the python_premise:: + + = + + #. When a pattern variable is used within a Python expression or statement, + it must be `fully bound`_. + + #. Python variables are not visible to the inference engine. They are local + variables that are also not visible to Python code in other rules_ or + other invocations of the same rule. + + #. Finally, Python variables in the `when clause`_ of a `backward-chaining + rule`_ are not visible to the Python code in the `with clause`_ of the + same rule. (These end up in two different Python functions after the + `.krb file`_ is compiled). So this won't work:: + + some_bc_rule + use some_goal(...) + when + ... + python x_list = + ... + with + for x in x_list: process(x) + + In this case, assign the value of the Python variable to a pattern + variable in the when clause and then use that pattern variable in the + with clause:: + + some_bc_rule + use some_goal(...) + when + ... + python x_list = + ... + $x_list = tuple(x_list) + with + for x in $x_list: process(x) + diff --git a/doc/sphinx/source/using_pyke/adding_facts.rst b/doc/sphinx/source/using_pyke/adding_facts.rst new file mode 100644 index 0000000..c6b68cb --- /dev/null +++ b/doc/sphinx/source/using_pyke/adding_facts.rst @@ -0,0 +1,88 @@ +.. $Id: adding_facts.txt 56035209fc8e 2010-03-08 mtnyogi $ +.. +.. Copyright © 2010 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=================================== +Asserting New Facts +=================================== + +.. this code is hidden and will set __file__ to the doc/examples directory. + >>> import os + >>> __file__ = \ + ... os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), + ... 'examples') + >>> from pyke import knowledge_engine + >>> my_engine = knowledge_engine.engine(__file__) + +*some_engine*.add_universal_fact(kb_name, fact_name, arguments) + The ``add_universal_fact`` function is called once per fact_. These + facts_ are never deleted and apply to all *cases*. + + Alternatively, you can place universal facts in a `.kfb file`_ so that + they are loaded automatically. + + >>> my_engine.add_universal_fact('family', 'son_of', ('bruce', 'thomas')) + + Multiple facts with the same name are allowed. + + >>> my_engine.add_universal_fact('family', 'son_of', ('david', 'bruce')) + + But duplicate facts (with the same arguments) are silently ignored. + + >>> my_engine.add_universal_fact('family', 'son_of', ('david', 'bruce')) + >>> my_engine.get_kb('family').dump_universal_facts() + son_of('bruce', 'thomas') + son_of('david', 'bruce') + + These facts are accessed as ``kb_name.fact_name(arguments)`` within the + `.krb files`_. + + +*some_engine*.assert_(kb_name, fact_name, arguments) + Call ``assert_`` for each starting fact_ for this case. Like universal + facts, you may have multiple facts with the same name so long as they + have different arguments. + + >>> my_engine.assert_('family', 'son_of', ('michael', 'bruce')) + >>> my_engine.assert_('family', 'son_of', ('fred', 'thomas')) + >>> my_engine.assert_('family', 'son_of', ('fred', 'thomas')) + + Duplicates with universal facts are also ignored. + + >>> my_engine.assert_('family', 'son_of', ('bruce', 'thomas')) + >>> my_engine.get_kb('family').dump_specific_facts() + son_of('michael', 'bruce') + son_of('fred', 'thomas') + >>> my_engine.get_kb('family').dump_universal_facts() + son_of('bruce', 'thomas') + son_of('david', 'bruce') + + There is no difference within the `.krb files`_ of how universal facts + verses case specific facts are used. The only difference between the two + types of facts is that the case specific facts are deleted when a ``reset`` + is done. + + >>> my_engine.reset() + >>> my_engine.get_kb('family').dump_specific_facts() + >>> my_engine.get_kb('family').dump_universal_facts() + son_of('bruce', 'thomas') + son_of('david', 'bruce') + diff --git a/doc/sphinx/source/using_pyke/creating_engine.rst b/doc/sphinx/source/using_pyke/creating_engine.rst new file mode 100644 index 0000000..f0024f7 --- /dev/null +++ b/doc/sphinx/source/using_pyke/creating_engine.rst @@ -0,0 +1,150 @@ +.. $Id: creating_engine.txt efc7674a8d3a 2010-03-29 mtnyogi $ +.. +.. Copyright © 2010 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=================================== +Creating an Inference Engine Object +=================================== + +The ``engine`` object is your gateway into Pyke. Each engine object manages +multiple `knowledge bases`_ related to accomplishing some task. + +You may create multiple Pyke engines, each with it's own knowledge bases to +accomplish different disconnected tasks. + +When you create a Pyke engine object, Pyke scans for Pyke `.kfb`_, `.krb`_ +and `.kqb`_ source files and compiles these into .fbc pickle files, +Python .py source files and .qbc pickle files, respectively. + +Each time a Pyke engine object is created it checks the file modification +times of the Pyke source files to see whether they need to be recompiled. +If you change a Pyke source file, you may create a new Pyke engine to compile +the changes and run with the new knowledge bases without having to restart +your application. + +Pyke also lets you zip these compiled files into Python eggs and can load the +files from the egg. By including the compiled files in your application's +distribution, you don't need to include your Pyke source files if you don't +want to. + +Once you have an ``engine`` object; generally, all of the Pyke functions that +you need are provided directly by this object: + +.. this code is hidden and will set __file__ to the doc/examples directory. + >>> import os + >>> __file__ = \ + ... os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), + ... 'examples') + +knowledge_engine.engine(\*paths, \*\*kws) + + Pyke recursively searches for Pyke source files (`.kfb files`_, + `.krb files`_, and `.kqb files`_) starting at each source directory + indicated in *paths* and places all of the compiled files in the + associated *target packages*. This causes all of the `knowledge bases`_ + to be loaded and made ready to activate_. + + Pyke source files may be spread out over multiple directories and may be + compiled into one or more target packages. Multiple target packages + would be used when more than one application wants to share a set of + `knowledge bases`_, perhaps adding some of its own knowledge that it + compiles into its own target package. + + Each ``path`` argument specifies a Pyke source directory and an optional + target package. The source directories do not have to be Python package + directories, but the target packages do. + + The target package defaults to ``.compiled_krb``. The leading dot (.) + indicates that the compiled_krb directory will be subordinate to the + lowest Python package directory on the path to the Pyke source directory. + This uses Python's `relative import`_ notation, so multiple dots go up to + higher directories (one per dot). If the target package does not start + with a dot, it is taken to be an absolute package path and will be located + using Python's sys.path like a normal Python ``import``. + + The Pyke source directory may be specified as a path (a string) or by + passing a Python module. If a module is passed, its __file__ attribute + is used. If the path points to a file, rather than a directory, the final + filename is discarded. In the simple case, when the Pyke source files are + in the same directory as the module creating the ``engine`` object, you + can just pass ``__file__`` as the sole argument. + + >>> from pyke import knowledge_engine + >>> my_engine = knowledge_engine.engine(__file__) + + Passing a package instead, this example could also be written: + + >>> import doc.examples + >>> my_engine = knowledge_engine.engine(doc.examples) + + or, you can pass a module within the desired package: + + >>> from doc.examples import some_module + >>> my_engine = knowledge_engine.engine(some_module) + + In the all three cases, the final filename is stripped from the value of + the module's __file__ attribute to get the directory that the package + is in. This directory will then be recursively searched for Pyke source + files. + + If you change some of your Pyke source files, you can create a new engine + object to compile and reload the generated Python modules without + restarting your program. But note that you'll need to rerun the + ``add_universal_fact`` calls that you made (a reason to use `.kfb files`_ + instead). + + All of the compiled Python .py source files and .fbc/.qbc pickle files + generated from each source directory are placed, by default, in a + ``compiled_krb`` target package. You may specify a different target + package for any source directory by passing that source directory + along with the target package name as a 2-tuple. Thus, specifying the + default target package explicitly would look like: + + >>> my_engine = knowledge_engine.engine((__file__, '.compiled_krb')) + + You may specify the same target package for multiple source directories. + + The last component of the target package will be created automatically + if it does not already exist. + + .. note:: + You will probably want to add ``compiled_krb`` (or whatever you've + chosen to call it) to your source code repository's list of files to + ignore. + + If you want to distribute your application *without* the knowledge bases, + you can use the 2-tuple notation with ``None`` as the source directory. + In this case, all of the Pyke source files must already be compiled, + and Pyke will simply load these files. Also, the target package must be + specified in absolute form (with no leading dots). + + Finally, there are four optional keyword arguments that you may also pass + to the ``engine`` constructor. These are all booleans that default to + ``True``: + + - ``load_fb`` -- load fact bases + - ``load_fc`` -- load forward-chaining rules + - ``load_bc`` -- load backward-chaining rules and + - ``load_qb`` -- load question bases + + These parameters must be passed as keyword parameters and let you + selectively load the various kinds of compiled files. + diff --git a/doc/sphinx/source/using_pyke/index.rst b/doc/sphinx/source/using_pyke/index.rst new file mode 100644 index 0000000..ddca8f1 --- /dev/null +++ b/doc/sphinx/source/using_pyke/index.rst @@ -0,0 +1,164 @@ +.. $Id: index.txt 4dca5ad0f397 2010-03-10 mtnyogi $ +.. +.. Copyright © 2007-2010 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +.. toctree:: + :maxdepth: 1 + :hidden: + + creating_engine + adding_facts + proving_goals + other_functions + +========== +Using Pyke +========== + +This describes how to call Pyke from your Python program. + +Getting Started +=============== + +.. this code is hidden and will set __file__ to the doc/examples directory. + >>> import os + >>> __file__ = \ + ... os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), + ... 'examples') + +The simplest use of Pyke involves three steps: + +`Create an engine`_ object. + + >>> from pyke import knowledge_engine + + >>> my_engine = knowledge_engine.engine(__file__) + + This step compiles the Pyke source files, if out of date, and loads the + `knowledge bases`_. + + There are three kinds of Pyke source files: + + #. `.kfb files`_ define `fact bases`_, which are compiled into .fbc pickle + files. + #. `.krb files`_ define `rule bases`_, which are compiled into 1 to 3 .py + Python source files. + #. `.kqb files`_ define `question bases`_, which are compiled into .qbc + pickle files. + + See `Creating an Inference Engine`_ to control where the compiled files + are written, load knowledge bases from multiple directories, distribute + your application without your knowledge base files, or distribute using + egg files. + +Activate `rule bases`_. + + >>> my_engine.activate('bc_related') + + You may activate one rule base for each `rule base category`_. Simply + pass multiple arguments to ``activate``. + + .. note:: + + Even if you only have one rule base, you must still activate it. + + This is when the `forward-chaining rules`_ are run. + +Prove_ goal_. + + >>> my_engine.prove_1_goal('bc_related.father_son(bruce, $son, ())') + ({'son': 'david'}, None) + + The goal might be met by simply matching an already known fact_, or + through the use of `backward-chaining rules`_. + + Then if you want to prove another goal, you can just repeat the last step. + In this case, the `forward-chaining rules`_ are only run once and all goals + operate against the same set of known facts. + + >>> my_engine.prove_1_goal('bc_related.father_son(thomas, $grandson, (grand))') + ({'grandson': 'david'}, None) + + See `Proving Goals`_ to pass different arguments into goals, compile the + goal statements once in advance, and to retrieve multiple answers for a + goal. + +Dynamically Asserting Facts +=========================== + +To dynamically assert_ facts_ within your Python program, a new step is +added: + + Create the engine object: + + >>> my_engine = knowledge_engine.engine(__file__) + +Assert_ facts_. + +>>> my_engine.assert_('family2', 'son_of', ('spike_the_dog', 'david')) + +These facts must be asserted prior to activating the rule bases so that they +are available to the `forward-chaining rules`_. This example shows asserting +case specific facts that are deleted before running the next case (as shown +in the next section, below). But you can also assert universal facts that +apply to all cases. See `Asserting New Facts`_ for more information. + + After asserting your facts, activate your rule bases and prove your goal + as before: + + >>> my_engine.activate('bc_related') + >>> my_engine.prove_1_goal('bc_related.father_son(bruce, $grandson, (grand))') + ({'grandson': 'spike_the_dog'}, None) + +Using Different Facts for Different Cases +========================================= + +But if you want to prove goals against different sets of facts or using +different rule bases, you need to reset_ the Pyke engine: + + Only need this once: + + >>> my_engine = knowledge_engine.engine(__file__) + + First case, as before: + + >>> my_engine.assert_('family2', 'son_of', ('spike_the_dog', 'david')) + >>> my_engine.activate('bc_related') + >>> my_engine.prove_1_goal('bc_related.father_son(bruce, $grandson, (grand))') + ({'grandson': 'spike_the_dog'}, None) + +Reset the Pyke engine. + +>>> my_engine.reset() + +This erases all of the case specific facts that you asserted in step 2, as +well as all of the facts asserted by the `forward-chaining rules`_. + +It also deactivates all of the `rule bases`_, so you'll need to call +activate again after asserting your facts. + + Second case: + + >>> my_engine.assert_('family2', 'son_of', ('felix_the_cat', 'david')) + >>> my_engine.activate('bc_related') + >>> my_engine.prove_1_goal('bc_related.father_son(bruce, $grandson, (grand))') + ({'grandson': 'felix_the_cat'}, None) + diff --git a/doc/sphinx/source/using_pyke/other_functions.rst b/doc/sphinx/source/using_pyke/other_functions.rst new file mode 100644 index 0000000..5ee3233 --- /dev/null +++ b/doc/sphinx/source/using_pyke/other_functions.rst @@ -0,0 +1,147 @@ +.. $Id: other_functions.txt 988349d92208 2010-03-12 mtnyogi $ +.. +.. Copyright © 2007-2010 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=============== +Other Functions +=============== + +Running and Pickling Plans +========================== + +.. this code is hidden and will set __file__ to the doc/examples directory. + >>> import os + >>> __file__ = \ + ... os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), + ... 'examples') + >>> from pyke import knowledge_engine + >>> my_engine = knowledge_engine.engine(__file__) + >>> my_engine.add_universal_fact('family', 'son_of', ('bruce', 'thomas')) + >>> my_engine.add_universal_fact('family', 'son_of', ('david', 'bruce')) + >>> my_engine.activate('bc_related0') + +Once you've obtained a plan_ from `prove_goal`_ or `prove_1_goal`_, you just +call it like a normal Python function. The arguments required are simply those +specified, if any, in the `taking clause`_ of the rule__ proving the top-level +goal. + +You may call the plan function any number of times. You may even pickle +the plan for later use. The plans are constructed out of `functools.partial`_ +functions, which needed to be registered with copy_reg_ in Python 2.x; but +this is no longer needed in Python 3.x. + +No special code is required to unpickle a plan. Just unpickle and call it. +(Unpickling the plan only imports one small Pyke module to be able to run +the plan). + +.. __: ../pyke_syntax/krb_syntax/bc_rule.html + + +Tracing Rules +============= + +Individual rules may be traced to aid in debugging. The ``trace`` function +takes two arguments: the rule base name, and the name of the rule to trace: + + >>> my_engine.trace('bc_related0', 'grand_father_son') + >>> my_engine.prove_1_goal('bc_related0.father_son(thomas, david, $depth)') + bc_related0.grand_father_son('thomas', 'david', '$depth') + bc_related0.grand_father_son succeeded with ('thomas', 'david', ('grand',)) + ({'depth': ('grand',)}, None) + +This can be done either before or after rule base activation and will remain +in effect until you call ``untrace``: + + >>> my_engine.untrace('bc_related0', 'grand_father_son') + >>> my_engine.prove_1_goal('bc_related0.father_son(thomas, david, $depth)') + ({'depth': ('grand',)}, None) + + +Krb_traceback +============= + +A handy traceback module is provided to convert Python functions, lines and +line numbers to the `.krb file`_ rule names, lines and line numbers in a +Python traceback. This makes it much easier to read the tracebacks that occur +during proofs. + +The ``krb_traceback`` module has exactly the same functions as the standard +Python traceback_ module, but they convert the generated Python function +information into .krb file information. They also delete the intervening +Python functions between subgoal proofs. + + >>> import sys + >>> from pyke import knowledge_engine + >>> from pyke import krb_traceback + >>> + >>> my_engine = knowledge_engine.engine(__file__) + >>> my_engine.activate('error_test') + >>> try: # doctest: +ELLIPSIS + ... my_engine.prove_1_goal('error_test.goal()') + ... except: + ... krb_traceback.print_exc(None, sys.stdout) # sys.stdout needed for doctest + Traceback (most recent call last): + File "", line 2, in + my_engine.prove_1_goal('error_test.goal()') + File "...knowledge_engine.py", line 367, in prove_1_goal + return goal.compile(goal_str).prove_1(self, **args) + File "...goal.py", line 47, in prove_1 + return next(iter(it)) + File "...rule_base.py", line 50, in __next__ + return next(self.iterator) + File "...error_test.krb", line 26, in rule1 + goal2() + File "...error_test.krb", line 31, in rule2 + goal3() + File "...error_test.krb", line 36, in rule3 + goal4() + File "...error_test.krb", line 41, in rule4 + check $bar > 0 + File "...contexts.py", line 231, in lookup_data + raise KeyError("$%s not bound" % var_name) + KeyError: '$bar not bound' + + +Miscellaneous +============= + +There are a few more functions that may be useful in special situations. + +*some_engine*.add_case_specific_fact(kb_name, fact_name, args) + This is an alternate to the ``assert_`` function. +*some_engine*.get_kb(kb_name) + Finds and returns the `knowledge base`_ by the name ``kb_name``. Raises + ``KeyError`` if not found. Note that for `rule bases`_, this returns the + active `rule base`_ where ``kb_name`` is the `rule base category`_ name. + Thus, not all `rule bases`_ are accessible through this call. +*some_engine*.get_rb(rb_name) + Finds and returns the `rule base`_ by the name ``rb_name``. Raises + ``KeyError`` if not found. This works for any `rule base`_, whether it + is active_ or not. +*some_engine*.print_stats([f = sys.stdout]) + Prints a brief set of statistics for each knowledge base to file ``f``. + These are reset by the ``reset`` function. This will show how many facts + were asserted, and counts of how many forward-chaining rules were fired + and rerun, as well as counts of how many backward-chaining goals were + tried, and how many backward-chaining rules matched, succeeded and failed. + Note that one backward-chaining rule may succeed many times through + backtracking. + diff --git a/doc/sphinx/source/using_pyke/proving_goals.rst b/doc/sphinx/source/using_pyke/proving_goals.rst new file mode 100644 index 0000000..b7d7d0d --- /dev/null +++ b/doc/sphinx/source/using_pyke/proving_goals.rst @@ -0,0 +1,119 @@ +.. $Id: proving_goals.txt 1c77af709502 2010-03-10 mtnyogi $ +.. +.. Copyright © 2010 Bruce Frederiksen +.. +.. Permission is hereby granted, free of charge, to any person obtaining a copy +.. of this software and associated documentation files (the "Software"), to deal +.. in the Software without restriction, including without limitation the rights +.. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +.. copies of the Software, and to permit persons to whom the Software is +.. furnished to do so, subject to the following conditions: +.. +.. The above copyright notice and this permission notice shall be included in +.. all copies or substantial portions of the Software. +.. +.. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +.. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +.. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +.. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +.. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +.. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +.. THE SOFTWARE. + +=================================== +Proving Goals +=================================== + +.. this code is hidden and will set __file__ to the doc/examples directory. + >>> import os + >>> __file__ = \ + ... os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), + ... 'examples') + >>> from pyke import knowledge_engine + >>> my_engine = knowledge_engine.engine(__file__) + >>> my_engine.add_universal_fact('family', 'son_of', ('bruce', 'thomas')) + >>> my_engine.add_universal_fact('family', 'son_of', ('david', 'bruce')) + >>> my_engine.activate('bc_related0') + +Though Pyke has the capability to return multiple answers to a single goal, +often you just want the first answer: + +*some_engine*.prove_1_goal(goal, \*\*args) + ``goal`` is a Pyke goal (as a string). This may include `pattern + variables`_ (which start with a '$'). + + >>> my_engine.prove_1_goal('bc_related0.father_son(thomas, david, $depth)') + ({'depth': ('grand',)}, None) + + Returns the first proof found as a 2-tuple: a dict of bindings for the + pattern variables, and a plan_. The plan is ``None`` if no plan was + generated; otherwise, it is a Python function as described here__. + +.. __: other_functions.html#running-and-pickling-plans + + Args must be specified as keyword arguments and are set as the value of + the corresponding pattern variable. + + >>> vars, plan = \ + ... my_engine.prove_1_goal('bc_related0.father_son($father, $son, $depth)', + ... father='thomas', + ... son='david') + >>> sorted(vars.items(), key=lambda item: item[0]) + [('depth', ('grand',)), ('father', 'thomas'), ('son', 'david')] + + Prove_1_goal raises ``pyke.knowledge_engine.CanNotProve`` if no proof is + found: + + >>> my_engine.prove_1_goal('bc_related0.father_son(thomas, bogus, $depth)') + Traceback (most recent call last): + ... + pyke.knowledge_engine.CanNotProve: Can not prove bc_related0.father_son(thomas, bogus, $depth) + +*some_engine*.prove_goal(goal, \*\*args) + This returns a context manager for a generator yielding 2-tuples, as + above. Unlike ``prove_1_goal`` it does not raise an exception if no + proof is found: + + >>> from __future__ import with_statement + + >>> with my_engine.prove_goal( + ... 'bc_related0.father_son(thomas, $son, $depth)') as gen: + ... for vars, plan in gen: + ... print(vars['son'], vars['depth']) + bruce () + david ('grand',) + + Like ``prove_1_goal``, above, `pattern variables`_ in the goal_ may be + specified with keyword arguments: + + >>> with my_engine.prove_goal( + ... 'bc_related0.father_son($father, $son, $depth)', + ... father='thomas') as gen: + ... for vars, plan in gen: + ... print(vars['son'], vars['depth']) + bruce () + david ('grand',) + +Compiling Goals at Program Startup +================================== + +Similar to Python's regular expression library, ``re``, you may compile your +goal statements once at program startup: + + >>> from pyke import goal + + >>> my_goal = goal.compile('bc_related0.father_son($father, $son, $depth)') + +Then use ``my_goal.prove_1`` and ``my_goal.prove`` as many times as you'd +like: + + >>> vars, plan = my_goal.prove_1(my_engine, father='thomas', son='david') + >>> sorted(vars.items(), key=lambda item: item[0]) + [('depth', ('grand',)), ('father', 'thomas'), ('son', 'david')] + + >>> with my_goal.prove(my_engine, father='thomas') as gen: + ... for vars, plan in gen: + ... print(vars['son'], vars['depth']) + bruce () + david ('grand',) + From e1db0fed9aeda808edb755060b3e4eeee8debb81 Mon Sep 17 00:00:00 2001 From: nvitucci Date: Tue, 20 Apr 2021 21:37:58 +0100 Subject: [PATCH 2/2] Added reference fix --- doc/sphinx/source/conf.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/doc/sphinx/source/conf.py b/doc/sphinx/source/conf.py index f51c836..462b1e9 100644 --- a/doc/sphinx/source/conf.py +++ b/doc/sphinx/source/conf.py @@ -10,7 +10,7 @@ # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # -# import os +import os # import sys # sys.path.insert(0, os.path.abspath('.')) @@ -51,8 +51,25 @@ # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] +# -- Custom behaviour + + +def fix_ref(ref, html_dir): + """Fixes a reference prepending it with a relative path (if necessary) + """ + # Is it either another link or an external page? + if ref.rstrip()[-1] == '_' or ref.startswith('http://'): + return ref + else: + return os.path.join(html_dir, ref) + + +source_dir = os.path.dirname(os.path.relpath(__file__, 'pyke/doc/sphinx/')) +html_dir = os.path.join(source_dir, '../build/html') + # Example from https://stackoverflow.com/a/61694897 rst_epilog = "" -# Read link all targets from file with open('links.rst') as f: - rst_epilog += f.read() + for line in f: + link, ref = line.split(':', 1) + rst_epilog += link + ": " + fix_ref(ref, html_dir)