Prolog如何创建新的数字列表

Prolog如何创建新的数字列表,prolog,Prolog,我有一个原始列表,其格式为[名称+名称+标记,名称+名称+标记] 我想做的是创建一个新列表,它的元素只有mark,比如[mark1,mark2](mark是number!)。所以我做了一个密码 getAvg([], NEWLIST). getAvg([_+_+Mark|Xs], R) :- getAvg(Xs, T) , append(T, [Mark], R). 但是唯一一件事getAvg([susan+andy+43,susan+mike+43],A)返回的是 R = [4

我有一个原始列表,其格式为
[名称+名称+标记,名称+名称+标记]
我想做的是创建一个新列表,它的元素只有mark,比如
[mark1,mark2]
(mark是number!)。所以我做了一个密码

getAvg([], NEWLIST).
getAvg([_+_+Mark|Xs], R) :-
    getAvg(Xs, T) ,
    append(T, [Mark], R).
但是唯一一件事
getAvg([susan+andy+43,susan+mike+43],A)
返回的是

R = [43, 43] ;
R = [_2918, 43, 43] ;
R = [_2918, _2930, 43, 43] ;
R = [_2918, _2930, _2942, 43, 43] ;
R = [_2918, _2930, _2942, _2954, 43, 43] ;
R = [_2918, _2930, _2942, _2954, _2966, 43, 43] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, 43, 43] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, 43, 43] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, _3002, 43|...] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, _3002, _3014|...] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, _3002, _3014|...] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, _3002, _3014|...] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, _3002, _3014|...] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, _3002, _3014|...] ;
R = [_2918, _2930, _2942, _2954, _2966, _2978, _2990, _3002, _3014|...] 
如何使它只返回
R=[43,43]

错误在这里:

getAvg([], NEWLIST).
这应该是:

getAvg([], []).
因为对于空列表,您需要返回空列表

虽然这里关于效率的另一件事是在规则中:

getAvg([_+_+Mark|Xs], R) :-
    getAvg(Xs, T) ,
    append(T, [Mark], R).
你有了标记,然后继续处理列表的其余部分,最后使用append,它将遍历所有列表以添加标记。更有效的方法是:

getAvg([_+_+Mark|Xs], [Mark,T]) :-getAvg(Xs, T).

给你;不要遍历任何列表来添加标记,只需将其放在头部即可。即使这改变了最终列表的顺序,这样做也会更有效,最终会反转输出列表以获得与上一个程序相同的行为。

噢,标记的顺序对我来说并不重要,这个版本的效率更高。谢谢你的帮助