Next: 5.8 実行例
Up: 5 Prolog処理系の実現
Previous: 5.6 問い合わせ部分
そこで,ゴールの問い合わせに対して,
ゴールを証明した結果はバインディング情報のリストに
なっています.
それぞれのリストごとが答えになっています.
含まれている変数
(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: 5.8 実行例
Up: 5 Prolog処理系の実現
Previous: 5.6 問い合わせ部分
generated through LaTeX2HTML. M.Inaba 平成18年5月21日