1

私はこのようなリストから構築したいと思います:[name1(value1), name2(value2),...]このようなリスト:[value1, value2,...]、そして私は次のコードを持っています:

    construct_listv([],_).
    construct_listv([A0|T], Values) :-
        A0 =.. [_, Value],
        append([Value], [], Values),
        construct_listv(T, Values).

例えば入れたらconstruct_listv([su(2), se(5)], ResultList)

追加する2番目の呼び出しが失敗する理由とそれを行う正しい方法を誰かに教えてもらえますか?

4

2 に答える 2

3

Values2つの結果が必要な場合、つまり目的を超えて使用しています。

Construct_listv / 2の再帰的なケースは、最初の引数のHeadとTailの両方を処理する必要があることに注意してください。それぞれが2番目の引数の構築に貢献しますが、construct_listv / 2への再帰呼び出しがそれを決定する方法と矛盾して、その出力を決定するappend/3があります。

おそらくあなたが意味したのは:

construct_listv([],[]).
construct_listv([A0|T], [V|Values]) :-
    A0 =.. [_, V],
    construct_listv(T, Values).

これで、 append/3を呼び出す必要がなくなりました。再帰は、出力引数の作成を処理します。

于 2012-05-04T23:00:29.330 に答える
1

なぜだめですか

construct_list(L1, L2) :-
    maplist(construct_one, L1, L2).

construct_one(X, V) :-
    X =.. [_, V].
于 2012-05-05T08:04:03.757 に答える