(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文の中で~&は改行がなされていなければ改行するという ;;指定フォーマットです.