{"id":20812229,"url":"https://github.com/curegit/knuth-bendix-completion","last_synced_at":"2025-04-09T23:14:30.925Z","repository":{"id":135783731,"uuid":"179937725","full_name":"curegit/knuth-bendix-completion","owner":"curegit","description":"クヌース・ベンディックス完備化アルゴリズムの OCaml 実装","archived":false,"fork":false,"pushed_at":"2023-08-20T08:25:52.000Z","size":69,"stargazers_count":2,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-09T23:14:24.343Z","etag":null,"topics":["automated-theorem-provers","term-rewriting","word-problems"],"latest_commit_sha":null,"homepage":"","language":"OCaml","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/curegit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-04-07T08:31:46.000Z","updated_at":"2023-03-21T08:50:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"8aee522d-3930-4619-869e-fbe666f66b89","html_url":"https://github.com/curegit/knuth-bendix-completion","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Fknuth-bendix-completion","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Fknuth-bendix-completion/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Fknuth-bendix-completion/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/curegit%2Fknuth-bendix-completion/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/curegit","download_url":"https://codeload.github.com/curegit/knuth-bendix-completion/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248125589,"owners_count":21051770,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automated-theorem-provers","term-rewriting","word-problems"],"created_at":"2024-11-17T20:51:22.042Z","updated_at":"2025-04-09T23:14:30.906Z","avatar_url":"https://github.com/curegit.png","language":"OCaml","readme":"# Knuth-Bendix Completion\n\nクヌース・ベンディックス完備化アルゴリズムの OCaml 実装\n\n## 依存パッケージ\n\n- OCaml 本体\n- Dune（ビルド）\n\n## ビルドとインストール\n\n### Dune を使う場合\n\n標準的な方法として Dune を使うことを推奨する。\n\n`dune build` コマンドでライブラリをビルドできる。\n\n```sh\ndune build\n```\n\nOPAM にローカルソースのライブラリをとしてインストールする場合は `opam install .` を実行する。\nアンインストールは `opam remove` コマンドで行う。\n\n```sh\nopam install .\n```\n\nOPAM を介さずにインストールする場合はビルドの後に `dune install` を実行する。\nこの場合のアンインストールは `dune uninstall` コマンドを使う。\n\n```sh\ndune build\ndune install\n```\n\nまた、対話環境の utop が使える場合は `dune utop` コマンドによってライブラリをトップレベルで即座に試せる。\n対話環境の設定ファイル `.ocamlinit` により、項書き換え系と完備化モジュールを `open` するように定義されている。\n\n```sh\ndune utop\n```\n\nutop で OPAM にインストールされたパッケージを読み込むには `-require` オプションを使う。\n\n```sh\nutop -require knuth_bendix\n```\n\n### OCaml のみの環境\n\n例外的な方法として純正の OCaml コンパイラのみでビルドすることも可能である（ただし Dune による出力とは厳密には異なる）。\n`build_ocamlc.sh` の手順に従うと `ocamlc` によるバイトコードライブラリをビルドできる。\n`build_ocamlopt.sh` の手順に従うと `ocamlopt` によるネイティブコードライブラリをビルドできる。\n\n標準のトップレベルでライブラリを使用する場合はバイトコードコンパイラで作られた `knuth_bendix.cma` と `knuth_bendix.cmi` を用意して `#load` ディレクティブで読み込む。\n\n```ml\n#load \"knuth_bendix.cma\";;\n```\n\n## ライブラリの使い方\n\n項書き換え系モジュールと完備化モジュールの 2 つを使用する。\n\n### 項書き換え系\n\n`Knuth_bendix.Trs` モジュールとして定義されている。\n\n以下は当該モジュールを open した状態での説明であり、関数の属すモジュールは省略してある。\n\n#### 項\n\n項は `term` 型によって表され木構造を成す。ノードは変数か関数のどちらかであり、関数のみが子ノードを持つことができる。\n\n`parseterm` 関数を使って文字列から項を作れる。\n小文字からはじまるシンボルは変数、大文字・数字・記号から始まるシンボルは関数と解釈される。\n\n使用できる記号は `+*!?-/^$%\u0026` である。\n\n```ml\n# parseterm \"F(x, G(y, 0), +(H(z), 1))\";;\n- : TermRewritingSystem.term =\nFunction\n (\"F\",\n  [Variable (\"x\", 0);\n   Function (\"G\", [Variable (\"y\", 0); Function (\"0\", [])]);\n   Function (\"+\", [Function (\"H\", [Variable (\"z\", 0)]); Function (\"1\", [])])])\n```\n\n`strterm` 関数で項の文字列表現を得られる。\n返される文字列は必ずしも再パース可能ではないことに注意されたし（`parseterm` によって作られた項なら問題ない）。\n\n```ml\n# strterm (Function (\"F\", [Variable (\"x\", 0); Variable (\"y\", 0)]));;\n- : string = \"F(x, y)\"\n```\n\n`printterm` 関数は項の文字列表現を標準出力へ吐き出す。\n\n```ml\n# printterm (Function (\"F\", [Variable (\"x\", 0); Variable (\"y\", 0)]));;\nF(x, y)\n- : unit = ()\n```\n\n#### 項生成ユーティリティ\n\n- `var s : string -\u003e term` シンボル s の変数の項を返す\n- `const s : string -\u003e term` シンボル s の無引数関数の項を返す\n- `func s ss : string -\u003e string list -\u003e term` 仮引数の変数のシンボルのリストが ss である、シンボル s の関数の項を返す\n- `call s ts : string -\u003e term list -\u003e term` 引数の項のリストが ts である、シンボル s の関数の項を返す\n- `nest s n t : string -\u003e int -\u003e term -\u003e term` 項 t にシンボルが s である 1 引数関数を n 回適用した項を返す\n\n```ml\n# let f4 = call \"F\" [nest \"S\" 4 (const \"0\")];;\nval f4 : TermRewritingSystem.term =\n  Function\n   (\"F\",\n    [Function\n      (\"S\",\n       [Function\n         (\"S\", [Function (\"S\", [Function (\"S\", [Function (\"0\", [])])])])])])\n# printterm f4;;\nF(S(S(S(S(0)))))\n- : unit = ()\n```\n\n#### 規則\n\n書き換え規則は項の組で表す。\n\n`parserule` 関数によって文字列から規則を得る。\n文字列は `項 -\u003e 項` の形とする。\n\n```ml\n# parserule \"F(x, y) -\u003e G(y, x)\";;\n- : TermRewritingSystem.rule =\n(Function (\"F\", [Variable (\"x\", 0); Variable (\"y\", 0)]),\n Function (\"G\", [Variable (\"y\", 0); Variable (\"x\", 0)]))\n```\n\n`strrule` 関数で書き換え規則の文字列表現を得る。\n`printrule` 関数は書き換え規則を標準出力する。\n\n#### 規則の集合\n\n書き換え規則の集合は書き換え規則のリストで表す。\n`parserules` 関数は規則の文字列のリストから規則の集合を返す。\n\n```ml\n# let rs = parserules [\"A(0, y) -\u003e y\"; \"A(S(x), y) -\u003e S(A(x, y))\"];;\nval rs : TermRewritingSystem.ruleset =\n  [(Function (\"A\", [Function (\"0\", []); Variable (\"y\", 0)]),\n    Variable (\"y\", 0));\n   (Function (\"A\", [Function (\"S\", [Variable (\"x\", 0)]); Variable (\"y\", 0)]),\n    Function (\"S\", [Function (\"A\", [Variable (\"x\", 0); Variable (\"y\", 0)])]))]\n```\n\n`strrules` 関数は書き換え規則の集合の文字列表現を得る。\n`printrules` 関数は書き換え規則の集合を標準出力する。\n\n```ml\n# strrules rs;;\n- : string = \"{ A(0, y) -\u003e y\\n  A(S(x), y) -\u003e S(A(x, y)) }\"\n# printrules rs;;\n{ A(0, y) -\u003e y\n  A(S(x), y) -\u003e S(A(x, y)) }\n- : unit = ()\n```\n\n#### 正規形\n\n`linorm`, `lonorm` 及び `ponorm` は書き換え規則の集合と項を与えると正規形を求める関数である。\nそれぞれ最左最内戦略、最左最外戦略、並列最外戦略に対応する。\n\n##### フィボナッチ数\n\n以下は最左最内戦略で 7 番目のフィボナッチ数を評価した例である。\n\n```ml\n# let rs = parserules [\"Add(0,y)-\u003ey\"; \"Add(S(x),y)-\u003eS(Add(x, y))\"; \"Fib(0)-\u003e0\";\n\"Fib(S(0))-\u003eS(0)\"; \"Fib(S(S(x)))-\u003eAdd(Fib(x),Fib(S(x)))\"];;\nval rs : TermRewritingSystem.ruleset =\n  [(Function (\"Add\", [Function (\"0\", []); Variable (\"y\", 0)]),\n    Variable (\"y\", 0));\n   (Function\n     (\"Add\", [Function (\"S\", [Variable (\"x\", 0)]); Variable (\"y\", 0)]),\n    Function\n     (\"S\", [Function (\"Add\", [Variable (\"x\", 0); Variable (\"y\", 0)])]));\n   (Function (\"Fib\", [Function (\"0\", [])]), Function (\"0\", []));\n   (Function (\"Fib\", [Function (\"S\", [Function (\"0\", [])])]),\n    Function (\"S\", [Function (\"0\", [])]));\n   (Function (\"Fib\", [Function (\"S\", [Function (\"S\", [Variable (\"x\", 0)])])]),\n    Function\n     (\"Add\",\n      [Function (\"Fib\", [Variable (\"x\", 0)]);\n       Function (\"Fib\", [Function (\"S\", [Variable (\"x\", 0)])])]))]\n# printrules rs;;\n{ Add(0, y) -\u003e y\n  Add(S(x), y) -\u003e S(Add(x, y))\n  Fib(0) -\u003e 0\n  Fib(S(0)) -\u003e S(0)\n  Fib(S(S(x))) -\u003e Add(Fib(x), Fib(S(x))) }\n- : unit = ()\n# let t = call \"Fib\" [nest \"S\" 7 (const \"0\")];;\nval t : TermRewritingSystem.term =\n  Function\n   (\"Fib\",\n    [Function\n      (\"S\",\n       [Function\n         (\"S\",\n          [Function\n            (\"S\",\n             [Function\n               (\"S\",\n                [Function\n                  (\"S\",\n                   [Function (\"S\", [Function (\"S\", [Function (\"0\", [])])])])])])])])])\n# let nf = linorm rs t;;\nval nf : TermRewritingSystem.term =\n  Function\n   (\"S\",\n    [Function\n      (\"S\",\n       [Function\n         (\"S\",\n          [Function\n            (\"S\",\n             [Function\n               (\"S\",\n                [Function\n                  (\"S\",\n                   [Function\n                     (\"S\",\n                      [Function\n                        (\"S\",\n                         [Function\n                           (\"S\",\n                            [Function\n                              (\"S\",\n                               [Function\n                                 (\"S\",\n                                  [Function\n                                    (\"S\",\n                                     [Function (\"S\", [Function (\"0\", [])])])])])])])])])])])])])])\n# printterm nf;;\nS(S(S(S(S(S(S(S(S(S(S(S(S(0)))))))))))))\n- : unit = ()\n```\n\n#### 等式\n\n等式は規則と同じく項の組で表す。\n\n`parseeq` 関数によって文字列から等式を得る。\n文字列は `項 = 項` の形とする。\n\n```ml\n# parseeq \"F(G(x)) = G(F(x))\";;\n- : TermRewritingSystem.equation =\n(Function (\"F\", [Function (\"G\", [Variable (\"x\", 0)])]),\n Function (\"G\", [Function (\"F\", [Variable (\"x\", 0)])]))\n```\n\n`streq` 関数で等式の文字列表現を得る。\n`printeq` 関数は等式を標準出力する。\n\n#### 等式の集合\n\n等式の集合は等式のリストで表す。\n`parseeqs` 関数は等式の文字列のリストから等式の集合を返す。\n\n```ml\n# let eqs = parseeqs [\"A = B\"; \"B = C\"];;\nval eqs : TermRewritingSystem.equationset =\n  [(Function (\"A\", []), Function (\"B\", []));\n   (Function (\"B\", []), Function (\"C\", []))]\n```\n`streqs` 関数は等式の集合の文字列表現を得る。\n`printeqs` 関数は等式の集合を標準出力する。\n\n```ml\n# streqs eqs;;\n- : string = \"{ A = B\\n  B = C }\"\n# printeqs eqs;;\n{ A = B\n  B = C }\n- : unit = ()\n```\n\n### 完備化モジュール\n\n`Knuth_bendix.Kbc` モジュールとして定義されている。\n\n以下は当該モジュールを open した状態での説明であり、関数の属すモジュールは省略してある。\n\n#### 簡約化順序\n\n完備化のために停止性を保証する簡約化順序を与える必要がある。\n\n関数のシンボルと整数値の組のリスト（優先順位を表すリスト）によってシンボル上の大小関係を定義する。\n\n```ml\n# let prece = [(\"F\", 2);(\"G\", 3);(\"H\", 1)];;\nval prece : (string * int) list = [(\"F\", 2); (\"G\", 3); (\"H\", 1)]\n```\n\n#### 完備化\n\n`kbc` と `kbcf` が完備化を行う関数である。\n`kbc` は優先順位を表すリストと等式集合を引数にとり、辞書式経路順序によって完備化を行う。\n`kbcf` は簡約化順序を示す順序関数と等式集合を引数にとって完備化を行う。\n\n`kbcv` と `kbcfv` はそれぞれの関数の途中経過を標準出力するバージョンである（重複等式の削除など一部の冗長な処理も追加で行われる）。\n\n完備化に失敗すると例外が投げられる。\nアルゴリズムが停止しない可能性もある。\n\n### 例: グラス置き換えパズル\n\n以下はグラス置き換えパズル（酒・ウィスキー・ビール）の問題を完備化した例である。\n\n2 つのグラス列が与えられ、等式に従ったグラス交換でもう一方と同じ列を作れるかどうかという問題である。\n\n```ml\n# let precedence = [(\"B\", 3);(\"S\", 2);(\"W\", 1)];;\nval precedence : (string * int) list = [(\"B\", 3); (\"S\", 2); (\"W\", 1)]\n# let eqs = parseeqs [\"W(x)=S(W(x))\"; \"W(S(x))=B(x)\"; \"B(x)=B(B(x))\"];;\nval eqs : TermRewritingSystem.equationset =\n  [(Function (\"W\", [Variable (\"x\", 0)]),\n    Function (\"S\", [Function (\"W\", [Variable (\"x\", 0)])]));\n   (Function (\"W\", [Function (\"S\", [Variable (\"x\", 0)])]),\n    Function (\"B\", [Variable (\"x\", 0)]));\n   (Function (\"B\", [Variable (\"x\", 0)]),\n    Function (\"B\", [Function (\"B\", [Variable (\"x\", 0)])]))]\n# let rs = kbc precedence eqs;;\nval rs : TermRewritingSystem.ruleset =\n  [(Function (\"W\", [Function (\"W\", [Function (\"W\", [Variable (\"x\", 0)])])]),\n    Function (\"W\", [Function (\"W\", [Variable (\"x\", 0)])]));\n   (Function (\"W\", [Function (\"W\", [Function (\"S\", [Variable (\"x\", 0)])])]),\n    Function (\"W\", [Function (\"S\", [Variable (\"x\", 0)])]));\n   (Function (\"B\", [Variable (\"x\", 0)]),\n    Function (\"W\", [Function (\"S\", [Variable (\"x\", 0)])]));\n   (Function (\"S\", [Function (\"W\", [Variable (\"x\", 0)])]),\n    Function (\"W\", [Variable (\"x\", 0)]))]\n# printrules rs;;\n{ W(W(W(x))) -\u003e W(W(x))\n  W(W(S(x))) -\u003e W(S(x))\n  B(x) -\u003e W(S(x))\n  S(W(x)) -\u003e W(x) }\n- : unit = ()\n```\n\n得られた書き換え規則を使って、例えば `SBW` と `SSB` の列を評価すると異なる正規形が求まる。\n正規形が異なるのでグラス交換で `SBW` と `SSB` を行き来することができないと証明される。\n\n```ml\n# let t1 = parseterm \"S(B(W(END)))\";;\nval t1 : TermRewritingSystem.term =\n  Function (\"S\", [Function (\"B\", [Function (\"W\", [Function (\"END\", [])])])])\n# let t2 = parseterm \"S(S(B(END)))\";;\nval t2 : TermRewritingSystem.term =\n  Function (\"S\", [Function (\"S\", [Function (\"B\", [Function (\"END\", [])])])])\n# linorm rs t1;;\n- : TermRewritingSystem.term =\nFunction (\"W\", [Function (\"W\", [Function (\"END\", [])])])\n# linorm rs t2;;\n- : TermRewritingSystem.term =\nFunction (\"W\", [Function (\"S\", [Function (\"END\", [])])])\n```\n\n### 例: 群の公理の完備化\n\n群の公理を完備化した例を示す。\n`kbcv` 関数を使って途中経過もすべて出力している。\n\n```ml\n# let precedence = [(\"I\", 3); (\"G\", 2); (\"E\", 1)];;\nval precedence : (string * int) list = [(\"I\", 3); (\"G\", 2); (\"E\", 1)]\n# let eqs = parseeqs [\"G(E,x)=x\"; \"G(I(x),x)=E\"; \"G(G(x,y),z)=G(x,G(y,z))\"];;\nval eqs : TermRewritingSystem.equationset =\n  [(Function (\"G\", [Function (\"E\", []); Variable (\"x\", 0)]),\n    Variable (\"x\", 0));\n   (Function (\"G\", [Function (\"I\", [Variable (\"x\", 0)]); Variable (\"x\", 0)]),\n    Function (\"E\", []));\n   (Function\n     (\"G\",\n      [Function (\"G\", [Variable (\"x\", 0); Variable (\"y\", 0)]);\n       Variable (\"z\", 0)]),\n    Function\n     (\"G\",\n      [Variable (\"x\", 0);\n       Function (\"G\", [Variable (\"y\", 0); Variable (\"z\", 0)])]))]\n# kbcv precedence eqs;;\n================ Input ==================\n{ G(E, x) = x\n  G(I(x), x) = E\n  G(G(x, y), z) = G(x, G(y, z)) }\n================ Step 1 =================\n{ G(I(x), x) = E\n  G(G(x, y), z) = G(x, G(y, z)) }\n\n{ G(E, x) -\u003e x }\n================ Step 2 =================\n{ G(G(x, y), z) = G(x, G(y, z)) }\n\n{ G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 3 =================\n{ z = G(I(x_1), G(x_1, z)) }\n\n{ G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 4 =================\n{ G(I(I(x)), z_1) = G(x, z_1)\n  G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  G(I(I(x)), E) = x\n  G(I(E), x) = x }\n\n{ G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 5 =================\n{ G(I(I(x)), z_1) = G(x, z_1)\n  G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  G(I(I(x)), E) = x\n  G(I(I(E)), x) = x }\n\n{ G(I(E), x) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 6 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  G(x, E) = x\n  z = G(x, G(I(x), z))\n  E = G(x, I(x)) }\n\n{ G(I(I(x)), z_1) -\u003e G(x, z_1)\n  G(I(E), x) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 7 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  z = G(x, G(I(x), z))\n  E = G(x, I(x))\n  x_1 = I(I(x_1))\n  E = I(E) }\n\n{ G(x, E) -\u003e x\n  G(I(I(x)), z_1) -\u003e G(x, z_1)\n  G(I(E), x) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 8 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  z = G(x, G(I(x), z))\n  E = G(x, I(x))\n  x_1 = I(I(x_1)) }\n\n{ I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(I(x)), z_1) -\u003e G(x, z_1)\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 9 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  z = G(x, G(I(x), z))\n  E = G(x, I(x)) }\n\n{ I(I(x_1)) -\u003e x_1\n  I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 10 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  z = G(x, G(I(x), z))\n  G(x_1, G(y, I(G(x_1, y)))) = E }\n\n{ G(x, I(x)) -\u003e E\n  I(I(x_1)) -\u003e x_1\n  I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 11 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  G(x_1, G(y, I(G(x_1, y)))) = E\n  G(x_1, G(y, G(I(G(x_1, y)), z))) = z }\n\n{ G(x, G(I(x), z)) -\u003e z\n  G(x, I(x)) -\u003e E\n  I(I(x_1)) -\u003e x_1\n  I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 12 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  G(x_1, G(y, G(I(G(x_1, y)), z))) = z\n  x = G(y, I(G(I(x), y)))\n  I(x_1) = G(y, I(G(x_1, y)))\n  G(x, G(y_1, G(y, I(G(x, G(y_1, y)))))) = E }\n\n{ G(x_1, G(y, I(G(x_1, y)))) -\u003e E\n  G(x, G(I(x), z)) -\u003e z\n  G(x, I(x)) -\u003e E\n  I(I(x_1)) -\u003e x_1\n  I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 13 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  G(x_1, G(y, G(I(G(x_1, y)), z))) = z\n  G(x, G(y_1, G(y, I(G(x, G(y_1, y)))))) = E\n  G(I(G(x, y_1)), x) = I(y_1)\n  G(y, G(I(G(x_1, y)), x_1)) = E\n  G(x, I(x_1)) = I(G(x_1, I(x)))\n  G(I(y), I(x_1)) = I(G(x_1, y))\n  G(x, G(y_1, I(G(x_1, G(x, y_1))))) = I(x_1)\n  G(z, I(G(x, G(y_1, z)))) = I(G(x, y_1))\n  G(I(x_1), z) = G(y, G(I(G(x_1, y)), z)) }\n\n{ G(y, I(G(x_1, y))) -\u003e I(x_1)\n  G(x, G(I(x), z)) -\u003e z\n  G(x, I(x)) -\u003e E\n  I(I(x_1)) -\u003e x_1\n  I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n================ Step 14 =================\n{ G(I(G(x, y)), G(x, G(y, z_1))) = z_1\n  G(x_1, G(y, G(I(G(x_1, y)), z))) = z\n  G(x, G(y_1, G(y, I(G(x, G(y_1, y)))))) = E\n  G(I(G(x, y_1)), x) = I(y_1)\n  G(y, G(I(G(x_1, y)), x_1)) = E\n  G(I(y), I(x_1)) = I(G(x_1, y))\n  G(x, G(y_1, I(G(x_1, G(x, y_1))))) = I(x_1)\n  G(z, I(G(x, G(y_1, z)))) = I(G(x, y_1))\n  G(I(x_1), z) = G(y, G(I(G(x_1, y)), z))\n  I(G(x_1, G(x_1, I(x_2)))) = G(x_2, G(I(x_1), I(x_1)))\n  I(G(x_2, G(y, I(x)))) = G(x, I(G(x_2, y))) }\n\n{ I(G(x_1, I(x))) -\u003e G(x, I(x_1))\n  G(y, I(G(x_1, y))) -\u003e I(x_1)\n  G(x, G(I(x), z)) -\u003e z\n  G(x, I(x)) -\u003e E\n  I(I(x_1)) -\u003e x_1\n  I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(x_1), G(x_1, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n============== Complete 15 ===============\n{ I(G(x, y)) -\u003e G(I(y), I(x))\n  G(x, G(I(x), z)) -\u003e z\n  G(x, I(x)) -\u003e E\n  I(I(x)) -\u003e x\n  I(E) -\u003e E\n  G(x, E) -\u003e x\n  G(I(x), G(x, z)) -\u003e z\n  G(G(x, y), z) -\u003e G(x, G(y, z))\n  G(I(x), x) -\u003e E\n  G(E, x) -\u003e x }\n- : TermRewritingSystem.ruleset =\n[(Function (\"I\", [Function (\"G\", [Variable (\"x\", 0); Variable (\"y\", 0)])]),\n  Function\n   (\"G\",\n    [Function (\"I\", [Variable (\"y\", 0)]);\n     Function (\"I\", [Variable (\"x\", 0)])]));\n (Function\n   (\"G\",\n    [Variable (\"x\", 0);\n     Function (\"G\", [Function (\"I\", [Variable (\"x\", 0)]); Variable (\"z\", 0)])]),\n  Variable (\"z\", 0));\n (Function (\"G\", [Variable (\"x\", 0); Function (\"I\", [Variable (\"x\", 0)])]),\n  Function (\"E\", []));\n (Function (\"I\", [Function (\"I\", [Variable (\"x\", 0)])]), Variable (\"x\", 0));\n (Function (\"I\", [Function (\"E\", [])]), Function (\"E\", []));\n (Function (\"G\", [Variable (\"x\", 0); Function (\"E\", [])]), Variable (\"x\", 0));\n (Function\n   (\"G\",\n    [Function (\"I\", [Variable (\"x\", 0)]);\n     Function (\"G\", [Variable (\"x\", 0); Variable (\"z\", 0)])]),\n  Variable (\"z\", 0));\n (Function\n   (\"G\",\n    [Function (\"G\", [Variable (\"x\", 0); Variable (\"y\", 0)]);\n     Variable (\"z\", 0)]),\n  Function\n   (\"G\",\n    [Variable (\"x\", 0);\n     Function (\"G\", [Variable (\"y\", 0); Variable (\"z\", 0)])]));\n (Function (\"G\", [Function (\"I\", [Variable (\"x\", 0)]); Variable (\"x\", 0)]),\n  Function (\"E\", []));\n (Function (\"G\", [Function (\"E\", []); Variable (\"x\", 0)]), Variable (\"x\", 0))]\n```\n\n## ライセンス\n\n[MIT](LICENSE)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuregit%2Fknuth-bendix-completion","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcuregit%2Fknuth-bendix-completion","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcuregit%2Fknuth-bendix-completion/lists"}