next up previous
Next: 5.8 実行例 Up: 5 Prolog処理系の実現 Previous: 5.6 問い合わせ部分

5.7 問い合わせの応答

そこで,ゴールの問い合わせに対して, ゴールを証明した結果はバインディング情報のリストに なっています. それぞれのリストごとが答えになっています. 含まれている変数

(defmacro ?- (&rest goals) `(top-level-prove ',goals))

(defun top-level-prove (goals)
  (show-prolog-solutions
   (variables-in goals)
   (prove-all goals)))
のように,与えられたゴールすべてに対してprove-allを 行ない,その結果がバインディング情報であるとして, 与えられたgoalsの変数と共に答えを表示することを 処理させます. 流れは次のようになります. (1)もし,prove-allのsolutionsがなければNoを返します. (2)solutionsがあって問い合わせゴールの中に変数がない場合 にはYESをすぐ返します. (3)問い合わせのゴールの変数がある場合には, それぞれの変数について答えのバインディング情報を substして変数の値を表示する. プログラムは以下のようになります.

(defun show-prolog-solutions (vars solutions)
  (if (null solutions)
      (format t "~&No.")
    (mapc #'(lambda (solution)
                (show-prolog-vars vars solution))
          solutions))
  (values))
;;; 
;;; (values)は結果を何も表示しないことになります.
;;;
(defun show-prolog-vars (vars bindings)
  (if (null vars)
      (format t "~&Yes")
    (dolist
       (var vars)
      (format t "~&~a = ~a" var
            (substitute-bindings bindings var))))
  (princ ";"))

;;format文の中で~&は改行がなされていなければ改行するという
;;指定フォーマットです.

next up previous
Next: 5.8 実行例 Up: 5 Prolog処理系の実現 Previous: 5.6 問い合わせ部分
generated through LaTeX2HTML. M.Inaba 平成18年5月21日