假设我需要一个谓词 rep(?List, ?Times, ?TList) 当且仅当 List 在 TList 中重复 Times 次(例如,rep([a,c],2,[a,c,a,c])
)。只要实例化了两个参数,它就应该可以工作。这是一个有点工作的版本:
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 之间的关系。
最佳答案
你使用 SWI-Prolog,所以你可以这样做:
:- use_module(library(lambda)).
rep(Lst, N, R) :-
( numlist(1,N, NL)
-> foldl(\_X^Y^Z^append(Y, Lst, Z), NL, [], R)
; R = []).
为了解决 CapelliC 的评论,不报告 X 绑定(bind)到 rep(X,2,[a,b,a,b]) 你必须写
foldl(Lst +\_X^Y^Z^append(Y, Lst, Z), NL, [], R)
[编辑] 谢谢@false!有趣的是
rep(Lst, N, R) :-
( nonvar(N)
-> length(NL, N),
foldl(Lst +\_^Y^append(Y, Lst), NL, [], R)
; foldl(Lst +\_^Y^append(Y, Lst), NL, [], R),
length(NL, N)),
!.
但不幸的是,它循环使用 rep([a,b], N, [a,c,a,c]) !
关于lambda - 重复列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14599758/