说我需要一个谓词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).

两个问题:
  • 是不是有一些内置的(我找不到)?
  • 是否有更直接的方法?喜欢摆脱最后一个条款吗?这是必要的,因为当未实例化Times时,我找不到表达Times和RemTimes之间关系的方法。
  • 最佳答案

    我不了解专门的内置功能。这是使用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/

    10-15 17:07