2

現在、(Key、Value)ペアのリストがあり、別の関数で使用するためにすべてのキーを引き出したいと思います。

私が呼ばれるリストを持っているように

PairsList 

そして私はしたい

retractall(map(Key,_).

私が試してみました:

retractall(map(PairsList[(Key,_)],_).

しかし、それは構文エラーをスローするだけです。

どんな助けでも素晴らしいでしょう!

4

2 に答える 2

2

撤回するこれは強力なPrologメモリツールであり、動的な情報管理に役立ちますが、悪用しないことが重要です。あなたの質問では、無関係のようです。ペアのリスト(Key、Value)がある場合は、

  • SWI-Prologを使用できる場合は、この興味深いライブラリ(ペア)があります。(A,B)を使用する代わりにA-B、表現の変更のためにあなたは多くを得る。そのライブラリでは、使用するビルトインはpairs_keys(Pairs、Keys)です。

  • ライブラリがなければ、関数(ただし、関数ではなくリレーションです)は純粋なPrologで非常に簡単に記述できます。

    keys([(Key、_)| Pairs]、[Key | Keys]):-keys(Pairs、Keys)。
    キー([]、[])。
    
  • 最良の方法は、library( apply)のmaplistと、非常に単純な述語を使用することだと思います。

    キー(ペア、キー):-maplist(キー、ペア、キー)。
    key((K、_)、K)。
    

    このようにして、「実際の」ペア表現から抽象化されたロジックを再利用できることに注意してください。

    キー(K-_、K)。
    推奨されるPrologの方法を処理する

于 2012-11-08T00:37:19.647 に答える
1

SWI-Prologとmodule(lambda)を使用する場合は、次のように記述できます。

maplist(\X^Y^(X = (Y,_)), L, L1),

たとえば、このコード:

:- use_module(library(lambda)).


t(L, L1) :-
    maplist(\X^Y^(X = (Y,_)), L, L1).

与える

?- t([(1,a), (2,b), (3,c)], L).
L = [1,2,3].
于 2012-11-08T00:13:17.243 に答える