0

Prologを使用して小さなプログラムを書いています。再利用したいデータ構造があるので、変数に代入してみました。

CitizenProfile = voter_profile(citizen,not_in_prison).

次に、次のように使用しました。

state(alabama, [CitizenProfile]).

ただし、コンソールからファイルをコンパイルすると、次のエラーが発生します。

**[No permission to modify static_procedure `(=)/2'][1]**
==

等号を動的に宣言しようとしましたが、何も解決しませんでした。:(

:- dynamic (=)/2.
4

2 に答える 2

2

エラーの理由は、これをやろうとしているように Prolog に見えるためです:

=(CitizenProfile, voter_profile(citizen,not_in_prison)).

これは、他のファクト定義と同じように見えます。=/2同様に簡単に次のようになりますfoobar/2

foobar(CitizenProfile, voter_profile(citizen,not_in_prison)).

ここで、何らかのルール本体の途中にいた場合、これは変数バインディングを確立するための正当な方法である可能性があります。次に、すべてがこれで最高潮に達します。

foo :- ...,
    CitizenProfile = voter_profile(citizen,not_in_prison),
    state(alabama, [CitizenProfile]).

これは、次のように言うのと同じです。

foo :- ...,
    state(alabama, [voter_profile(citizen,not_in_prison)]).

この拡張が達成しようとしているものである場合、残念ながら、このようなファクト データベースで省略表現を作成する方法はありません。@hardmath が言うようassertz/1に、それを達成するために使用できます。これは次のようになります。

make_database :-
    CitizenProfile = voter_profile(citizen,not_in_prison),
    assertz(state(alabama, [CitizenProfile])).

ただし、静的情報を動的ストアに入れているため、これは大雑把な動作になります。私の経験では、通常、データベースに大きな構造を構築することは望ましくありません。通常は、いくつかの関係を構築し、それらを関係的に "結合" する方がクリーンで簡単です。あなたがここで何を望んでいるのかはわからないので、これは単なるスケッチですが、これは私が期待するものです。

voter_profile(voter1, alabama,    citizen, not_in_prison).
voter_profile(voter2, alabama,    citizen, in_prison).
voter_profile(voter3, new_mexico, citizen, not_in_prison).

あなたが(最終的に)構築していると私が推測するものではなく、私は次のように描いています:

 state(alabama,   [voter_profile(citizen,not_in_prison), voter_profile(citizen, in_prison)]).
 state(new_mexico,[voter_profile(citizen,not_in_prison)]).

たくさんのリストを作成したいという誘惑は理解できますが、Prolog のデータベースはそれらの処理にはあまり役に立ちません。多くの O(N) 検索に頼ることになり、member/2パフォーマンスが大幅に低下します。デフォルトでは、Prolog は最初の引数にインデックスを付けますが、各実装では、追加または代わりに 2 番目または N 番目の引数にインデックスを付けるために使用できるいくつかのインデックス宣言を定義します。すべての結果が必要な場合は、bagof/3またはを使用してリストを再構成できます。findall/3

于 2013-09-13T19:48:29.720 に答える
0

おそらくあなたが望むのは、動的述語を定義し、voter_profile/2その述語ストア (データベース)assertzによって「動的に」記憶される新しい事実を定義することです。私が「おそらく」と言ったのは、州 (たとえばアラバマ州) が特定の市民プロファイルとどのように関連しているべきかを明確にしていないからです。

SWI-Prolog の組み込みドキュメントと、SWI-Prolog のデータベース メカニズムに関する詳細については、こちらを参照してください。assertz/1

于 2013-09-12T14:57:34.220 に答える