1

特定の目標をすべての最小部分に分割し、最終的にそれらを評価する小さなプログラムを作成しようとしています。これまでのところ、私は持っています:

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) :-明らかに、すべての可能なタイプの算術演算をキャッチするスタイルでルールを書くことはできません。

私の目標は、スローされたあらゆるタイプのルールを処理できるアブダクティブ メタインターピーターを最終的に作成することです。

これが意味をなさない場合はお知らせください。明確にしようとします:)

4

1 に答える 1

0

メタ インタプリタ Prolog の「長所」の 1 つです。この興味深いテーマについては、Markus Triska のこのページを参照してください。

Little Booby Tables がアドバイスしたように、次のような単純なもので算術演算をキャプチャできます。

test(X is Y) :- X is Y.

ところで、ここにタイプミスがあると思います

test((Goal1;Goal2)) :- test(Goal1), test(Goal2).

する必要があります

test((Goal1;Goal2)) :- test(Goal1) ; test(Goal2).

EDIT : 必要に応じて、演算子の操作を一般化できます。必要なビルトインの例:

?- X = (1+2), X =.. [F, A, B], current_op(U, V, F).
X = 1+2,
F = (+),
A = 1,
B = 2,
U = 200,
V = fy .
于 2013-05-21T09:27:56.293 に答える