エラーの理由は、これをやろうとしているように 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