@gusbro の回答 ( s(X)
) は、GNU のデバッガーを使用してこれをある程度解決する方法を示しています。ただし、進行中のすべての印刷を表示する余裕がない場合、または遅すぎる場合はlibrary(debug)
、Scryer のように次の「デバッガー」を利用できると考えることができます。
私は個人的に、Prolog システムが提供するデバッガーを使用していません。単純な理由は、それらのほとんどがあまりにも多くの出力を行い、しばしばバグが多く、常に変化する固有の規則を持っているためです。学ぶ余裕はありません。
:- op(900, fx, [@,$,$-]).
$-(G_0) :-
catch(G_0, Ex, ( portray_clause(exception:Ex:G_0), throw(Ex) ) ).
$(G_0) :-
portray_clause(call:G_0),
$-G_0,
portray_clause(exit:G_0).
@(G_0) :-
( $-G_0
*-> true
; portray_clause(badfail:G_0),
throw(goal_failed(G_0))
).
:- op(950, fy, *).
*(_).
使用するには、特定の目標の前に$-
、$
、またはを追加するだけです。@
$-
手段: このゴールを通過する例外のみを通知する
$
さらに通話を表示して終了する
@
少なくとも 1 つの回答があることを保証し、そうでない場合は報告され、例外がスローされます。
上記の注釈は控えめに使用してください。
*
ゴールを削除します。これは、純粋な単調プログラムでプログラムの変更/プログラムのスライスを行うプログラムを一般化するためのものです。これは、予期しない障害が発生した場合に必要です。使用方法の例については、次の回答/デバッグ セッション
1、
2、
3、
4、
5、
6、
7、
8、
9、
10を参照してください。
_/*term*/
項を無名変数に置き換えます。*
これにより、プログラムは単独ではなくさらに一般化されます。セッションの例:
1、
2、
3、
4、
5、
6、
7、
8、
9、
10。
このようにして、見る情報を大幅に減らすことができます。
SICStus、YAP、SWI などのディレクティブをサポートする他のシステムmeta_predicate
では、次のディレクティブを先頭に追加します。
:- meta_predicate(( $-(0), $(0), @(0) )).