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)

谁能告诉我为什么第二次调用 append 失败以及正确的方法?

4

2 回答 2

3

您正在使用Values需要两个结果的地方,因此有交叉用途。

请注意,construct_listv/2的递归情况需要同时处理第一个参数的 Head 和 Tail。每个都将有助于第二个参数的构造,但是您让append/3确定该输出,这与对construct_listv/2的递归调用想要确定它的方式相冲突。

也许你的意思是:

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 回答