特定の目標をすべての最小部分に分割し、最終的にそれらを評価する小さなプログラムを作成しようとしています。これまでのところ、私は持っています:
alien(X) :- fromMars(X), fromSaturn(X); fromJupiter(X), X = 'john'.
fromMars(john).
fromSaturn(john).
fromJupiter(john).
test(true) :- !.
test((Goal1,Goal2)) :- test(Goal1), test(Goal2).
test((Goal1;Goal2)) :- test(Goal1), test(Goal2).
test(X = Y) :- call(X = Y).
test(Goal) :- clause(Goal,Body),test(Body).
これまでのところ、これは節/2を使用してルールを再帰的に検査しますtest(alien(john)).
。Body
などの事実のみを含むポイントに到達すると、 andルールfromMars(X), fromSaturn(X); fromJupiter(X), X = 'john'
を使用してそれらを分割し、最終的に単一の事実に到達します。特異な事実が渡されると、それが解決できる場合、節/2 は true にインスタンス化されます。test((Goal1,Goal2)) :-
test((Goal1;Goal2)) :-
Body
算数で問題が発生します。上記のプログラムでは、最終的に特異なゴールが存在X = 'john'
します。これにより、句/2 (プライベート プロシージャ?) でエラーが発生します。test(X = Y) :-
別の方法で対処できるように、このケースをキャッチするルールを導入しました。しかし、私が本当に欲しいのは、すべての算術をキャッチするルールです。test(X = Y) :-
明らかに、すべての可能なタイプの算術演算をキャッチするスタイルでルールを書くことはできません。
私の目標は、スローされたあらゆるタイプのルールを処理できるアブダクティブ メタインターピーターを最終的に作成することです。
これが意味をなさない場合はお知らせください。明確にしようとします:)