Implementing the Prolog Unification algorithm in Python? Backtracking

前端 未结 3 773
心在旅途
心在旅途 2021-02-05 23:57

I\'m trying to implement Unification, but having problems.. already got dozen of examples,but all they do is to muddy the water. I get more confused than enlightened :

h

3条回答
  •  温柔的废话
    2021-02-06 00:17

    I get more confused than enlightened

    Been there, done that.

    Note: For any source code referenced I did not test the code and can not say it is valid, they are given as an example and look correct enough that I would load them up and run test cases against them to determine their validity.

    First: You will get much better search results if you use the correct terminology, use backward chaining instead of Backtracking. e.g. backward-chaining/inference.py

    Second: Understand that your question has three separate phases listed.
    1. Unification algorithm
    2. Backward chaining that uses Unification
    3. A data structure for a list. You would not implement this as Python source code but as text to be passed to your functions. See: cons

    You should first develop and fully test unification before moving onto backward chaining. Then fully develop and test backward chaining before creating a list data structure. Then fully test your list data structure.

    Third: There is more than one way to implement the unification algorithm.
    a. You noted the one that uses transformation rules, or noted as A rule based approach in Unification Theory by Baader and Snyder, e.g. delete decompose etc.
    b. I prefer the algorithm noted as Unification by recursive descent in Unification Theory by Baader and Snyder given in this OCaml example or Python example
    c. I have seen some that use permutations but can't find a good reference at present.

    Fourth: From personal experience, understand how each phase works by using pen and paper first, then implement it in code.

    Fifth: Again from personal experience, there is lots of information out there on how to do this but the math and technical papers can be confusing as many gloss over something critical to a self-learner or are too dense. I would suggest that instead you focus on finding implementations of the source code/data structures and use that to learn.

    Sixth: compare your results against actual working code, e.g. SWI-Prolog.

    I can't stress enough how much you need to test each phase before moving on to the next and make sure you have a complete set of test cases.

    When I wanted to learn how to write this in a functional language the books on AI 1 2 3 and The Programming Languages Zoo were invaluable. Had to install environments for Lisp and OCaml but was worth the effort.

提交回复
热议问题