Next: 6.2 ゴールの問い合わせ
Up: 6 バックトラッキング
Previous: 6 バックトラッキング
上のように人間に問い合わせた結果によってバックトラックするかしないかを
変えるためには,人間に問い合わせるという処理を内蔵した述語を作れる必要
があります.そのように特殊な述語はLispにおける組み込み関数のようなもので,
Prologにとっての組み込み述語であるともいえます.
そのような組み込み述語は他の述語で実現することができないために
Primitiveと呼ばれます.
ここでは,Primitiveな述語が実際に行なう処理をLisp関数で表現し,
その関数によりその述語がFailするかどうかを求めるという方法を紹介します.
実現方法としてはその述語シンボルを用いるホーン節はないことから,データ
ベースに対してそのLisp関数の関数名を登録することにします.そうすれば,
述語シンボルをキーとしてデータベースから節の検索を行なった場合に,nil
ならば節がなく,アトムならばPrimitiveな述語であり,そのアトムが関数だ
と思って実行します.リストならばホーン節群です.
(defun prove (goal bindings other-goals)
(let ((clauses (get-clauses (predicate goal))))
(cond
((null clauses) 'fail)
((atom clauses)
(funcall clauses
(rest goal) bindings other-goals))
(t
(dolist
(clause clauses 'fail)
(let*
((new-clause (rename-variables clause))
(result
(prove-all
(append (clause-body new-clause)
other-goals)
(unify goal
(clause-head new-clause)
bindings))))
(if (not (eq result 'fail))
(return result))))))))
Next: 6.2 ゴールの問い合わせ
Up: 6 バックトラッキング
Previous: 6 バックトラッキング
generated through LaTeX2HTML. M.Inaba 平成18年5月21日