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).
给你;不要遍历任何列表来添加标记,只需将其放在头部即可。即使这改变了最终列表的顺序,这样做也会更有效,最终会反转输出列表以获得与上一个程序相同的行为。噢,标记的顺序对我来说并不重要,这个版本的效率更高。谢谢你的帮助