说我需要一个谓词rep(?List,?Times,?TList),如果List在TList中重复了Times次(例如rep([a,c],2,[a,c,a,c])
),则它为true。只要实例化两个参数,它就应该起作用。这里是一个工作版本:
rep(_,0,[]).
rep(List,1,List).
rep(List,Times,TList) :- integer(Times), Times>1,
succ(RemTimes,Times), append(List,RemList,TList),
rep(List,RemTimes,RemList).
rep(List,Times,TList) :- var(Times),
append(List,RemList,TList),
rep(List,RemTimes,RemList), !,
succ(RemTimes,Times).
两个问题:
最佳答案
我不了解专门的内置功能。这是使用length / 2的生成能力的过程
rep(List, Times, TList) :-
( var(Times) ; Times > 0 ), % after joel76' comment...
( var(List) ; is_list(List) ), % after false' comment...
( var(TList) ; is_list(TList) ), % idem...
length(List, LA), LA > 0,
length(TList, LT), LT > 0,
Times is LT / LA,
findall(List, between(1, Times, _), [List|Ls]),
append([List|Ls], TList), !.
最后的选择避免了在任何列表空闲时循环播放。
关于lambda - 重复 list ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14599758/