List Prolog使用=../2构造列表

List Prolog使用=../2构造列表,list,prolog,List,Prolog,我想从这样的列表中构造:[name1(value1),name2(value2),…]这样的列表:[value1,value2,…],我有以下代码: construct_listv([],_). construct_listv([A0|T], Values) :- A0 =.. [_, Value], append([Value], [], Values), construct_listv(T, Values). 例如,如果我把c

我想从这样的列表中构造:
[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失败的原因以及正确的方法吗?

您使用的是
值,其中需要两个结果,因此是交叉使用的

请注意,construct_listv/2的递归情况需要处理第一个参数的开头和结尾。每个参数都有助于第二个参数的构造,但是您有append/3来确定该输出,这与递归调用construct\u listv/2想要确定它的方式相冲突

也许你的意思是:

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

现在您不再需要调用append/3。递归负责为您构建输出参数

在需要两个结果的地方,您使用的是
,因此是交叉使用的

请注意,construct_listv/2的递归情况需要处理第一个参数的开头和结尾。每个参数都有助于第二个参数的构造,但是您有append/3来确定该输出,这与递归调用construct\u listv/2想要确定它的方式相冲突

也许你的意思是:

construct_listv([],[]).
construct_listv([A0|T], [V|Values]) :-
    A0 =.. [_, V],
    construct_listv(T, Values).
现在您不再需要调用append/3。递归负责为您构建输出参数

为什么不呢

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

construct_one(X, V) :-
    X =.. [_, V].
为什么不呢

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

construct_one(X, V) :-
    X =.. [_, V].