gpt4 book ai didi

lambda - 重复列表

转载 作者:行者123 更新时间:2023-12-02 03:50:22 26 4
gpt4 key购买 nike

假设我需要一个谓词 rep(?List, ?Times, ?TList) 当且仅当 ListTList 中重复 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).

两个问题:

  1. 难道没有一些内置的(我找不到)可以做到这一点吗?
  2. 有没有更直接的方法来做到这一点?就像摆脱最后一个条款?这是必要的,因为当 Times 未实例化时,我找不到一种方法来表达 TimesRemTimes 之间的关系。

最佳答案

你使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com