lambda - 重复列表

标签 lambda prolog

假设我需要一个谓词 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/

相关文章:

java - 在以下代码中使用 map 时出错

Haskell 函数采用可变参数函数作为参数(并返回除该函数之外的其他内容),无需灵活实例,纯 Haskell2010

Prolog:全局堆栈出错,对我来说看起来像是一级递归

string - Prolog - Prolog 新手,很难理解代码片段

c++ - LAMBDA错误: conditional expression of type 'void' is illegal

java - 如何在 Beanshell 中使用或转义 java 8 Lambda 表达式

php - 匿名递归 PHP 函数

prolog - 实践中的一阶逻辑,如何处理不可判定性?

list - Prolog 仅删除唯一元素

prolog - 使用 `library(aggregate)` 计算两个序列中匹配元素的复杂度