0

私はC ++の男で、プロローグはまったく初めてです。私はsicstusプロローグを使用しています。

私は以下のような必要性に出くわしました:

私は変数を持っているとしましょう

A={0,1,2,3}
B={-2,-1,0,1,2,3,4,5}

そして、私はハッシュのようなものを持っています

0-{3}
1-{4}

ここで、このハッシュを使用して A と B の値をフィルター処理する必要があるため、操作後に次のようになります。

A={0,1}
B={3,4}

ロジックは、A からの値がハッシュのキーと一致することです

キーが存在する場合は、値を確認します。値が B に存在する場合は、A の値が残ります。それ以外の場合は、値を削除する必要があります。同じように、ハッシュの値を使用して B に対して行う必要があります。A で検索し、存在しない場合は B で削除する必要があります。B では正反対の方法を意味します。

誰か助けてくれませんか?

4

2 に答える 2

1

Key-Valueリストを使用して A と B のキーと値を保持し、ペアのリストを使用してハッシュマップを保持することをお勧めします。そうすれば、組み込みのヘルパー述語include/3を使用memberchk/2して、ニーズに合わせることができます。

次に、A と B の項目をフィルター処理するプロシージャーを作成できます。

filter(A, B, Hash, FA, FB):-
  include(filterkey(B, Hash), A, FA),
  include(filtervalue(A, Hash), B, FB).

filterkey(B, Hash, Item):-
  memberchk(Item-Value, Hash),
  memberchk(Value, B).

filtervalue(A, Hash, Value):-
  memberchk(Item-Value, Hash),
  memberchk(Item, A).

あなたが持っているかどうか言ってください

A=[0,1,2,3]
B=[-2,-1,0,1,2,3,4,5]
Hash=[0-3, 1-4]

それから:

?- A=[0,1,2,3], B=[-2,-1,0,1,2,3,4,5], Hash=[0-3, 1-4], filter(A, B,Hash, FA, FB).
Hash = [0-3, 1-4],
FA = [0, 1],
FB = [3, 4].
于 2013-02-21T13:27:02.010 に答える
0

申し訳ありませんが、テストできるSicstusがないため、完全に軌道に乗らない可能性がありますが、非常に特殊な種類の変数を処理しています。検討

?- write_canonical({1,2,3,4}).
{}(','(1,','(2,','(3,4))))

?- {1,2,3,4}={A}.
A = (1, 2, 3, 4).

中括弧は実際にはタプルの固有の名前であり、AFAIKは、たとえばlibrary(clpqr )の制約のように、DSL(ドメイン固有言語)で読み取り可能なデータを導入するための構文デバイスとして使用されます。

私が言いたいのはそれか

  • タスクに間違った表現を使用しています(gusbroがこの問題に対処しました、+ 1)
  • Sicstusで使用できないclp制約拡張(フィルタリング?)を検索しています。しかし、その後、質問はより良い言葉で再定式化されるべきです。

とにかく、たとえば、追加すれば、プログラムを変更せずにgusbroの答えを適応させることができます。

member_set(E, {','(E,_)}).
member_set(E, {','(_,T)}) :- member_set(E, {T}).
member_set(E, {E}).

memberchkを交換します。include / 3も書き直す必要がありますが、それほど簡単ではありません。それ以外の場合、変換述語

set_list({','(A,B)}, [A|R]) :- set_list({B}, R), !.
set_list({E}, [E]).
set_list({}, []).

便利かもしれません:

?- set_list(S,[1,2,3]).
S = {1, 2, 3}.

?- set_list({1,2,3},L).
L = [1, 2, 3].
于 2013-02-21T15:35:49.257 に答える