next up previous
Next: 6.2 ゴールの問い合わせ Up: 6 バックトラッキング Previous: 6 バックトラッキング

6.1 Primitiveな述語

上のように人間に問い合わせた結果によってバックトラックするかしないかを 変えるためには,人間に問い合わせるという処理を内蔵した述語を作れる必要 がある.そのように特殊な述語は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))))))))


generated through LaTeX2HTML. M.Inaba 平成18年5月7日