【问题标题】:Prolog inserting multiple elements into listProlog将多个元素插入列表
【发布时间】:2013-06-06 19:41:49
【问题描述】:

我想实现一个谓词 (vecLine2BitLine),它执行以下操作: 得到两个列表和一个数字第一个列表是块的长度(块的元素是'$'),第二个列表包含这些块应该放置的索引含义:

vecLine2BitLine([1,2,1],[2,5,9],12,BitLine).
BitLine=[' ','$',' ',' ','$','$',' ',' ','$',' ',' ',' ']. 

解释:长度为 1 的块在索引 2 处 一个长度为 2 的块在索引 5 处,依此类推..

insert_at_mul : 插入一个元素 N 次(效果很好,dupli 和 my_flatten 之前已经实现,所以我使用它们)

当 N 是列表 X 和 Y 的长度时,我已经尝试激活 insert_at_mul N 次 在谓词 vecLine2BitLine 中。

dupli(L1,N,L2) :- dupli(L1,N,L2,N).
dupli([],_,[],_).
dupli([_|Xs],N,Ys,0) :- dupli(Xs,N,Ys,N).
dupli([X|Xs],N,[X|Ys],K) :- K > 0, K1 is K - 1, dupli([X|Xs],N,Ys,K1).

my_flatten(X,[X]) :- \+ is_list(X).
my_flatten([],[]).
my_flatten([X|Xs],Zs) :- my_flatten(X,Y), my_flatten(Xs,Ys), append(Y,Ys,Zs).

insert_at_mul(L,X,K,R,N):-dupli([X],N,XX) , insert_at(L,XX,K,L1) , my_flatten(L1,R).

get_num_spaces(L,N,X):-sum(L,S), X is N-S.
generate_spaces(N,L,X):- insert_at_mul(L,'',1,X,N).


vecLine2BitLineAux([],[],_,_,_).
vecLine2BitLineAux([X|Tail1],[Y|Tail2],N,L,Lnew):- insert_at_mul(L,'*',Y,Lnew,X) ,vecLine2BitLineAux(Tail1,Tail2,N,Lnew,R). // problem here!!!
vecLine2BitLine(X,Y,N,L):- get_num_spaces(X,N,Z) , generate_spaces(Z,[],ZZ) , vecLine2BitLineAux(X,Y,N,ZZ,L).

现在的问题是在函数 vecLine2BitLine 中我无法激活 insert_at_mul N 次(这就是我试图在这段代码中执行的操作,但失败了)。

如何通过实际激活谓词 insert_at_mul N 次来修复 vecLine2BitLine 以使其正常工作,以返回正确的输出? 谢谢! 补充:

vecLine2BitLine : 输入参数 : (L1,L2,N,Result) N:激活谓词后Result的长度为N。

L1:L1是一个数字列表,每个数字表示一个块的长度,一个块由'$'的序列组成。

L2:L2 是一个数字列表,这些数字是 L1 中的块应该放置的位置的索引。

示例:

vecLine2BitLine([3,2],[1,5],9,BitLine).

我们可以将输入更好地视为元组:

vecLine2BitLine[(3,1),(2,5)],9,BitLine).

(3,1) : 在索引 1 处有 3 次 '' 序列 (2,5) : 在索引 5 处有 2 次 '' 序列 在我们的示例中,9 是末尾的 BitLine 的长度,我们必须插入 列出“特殊字符”“*”的 BitLine 3+2,但列表中还剩下 9-(3+2) 个位置 所以我们在这些地方添加'',然后我们得到:

BitLine=['$','$','$','','$','$','','','',''].

【问题讨论】:

    标签: prolog


    【解决方案1】:

    这是一个很好的问题,因为您可以将参数用作循环计数器。 K 参数可让您找到正确的索引。让我们以遍历列表并找到特定索引为例。请注意,基本情况是您在正确的元素处,而归纳情况在正确的元素之前。

    traverse(1, [X|_], X).
    traverse(N, [_|Xs], X) :- N > 0, N0 is N-1, traverse(N0, Xs, X).
    

    我们将把该模式应用到insert_at/4 以到达列表中的正确位置。现在让我们编写一个repeat/3 谓词,它在新列表 L 中重复 X N 次。这次的基本情况是我们添加了所有我们关心的重复,而归纳情况是我们将添加另一个实例。

    repeat(1, X, [X]).
    repeat(N, X, [X|Xs]) :- N > 0, N0 is N-1, repeat(N0, X, Xs).
    

    你可以看到这两者的结构相似。尝试将它们组合成一个谓词。既然这是作业,我就停在这里。你离目标只有几英寸。

    【讨论】:

    • 秒,我明白你的意思我需要一些时间来实现它(没有很多经验)
    • 我认为通过提出这个问题,我可以解决一个更大的问题,我已经使用我已经定义的其他谓词实现了 insert_at_mul。我怎么给你看代码(不能在这里发布,因为你什么都看不到)电子邮件?
    • 编辑问题或发布答案。我只想看insert_at_mul/5,有问题的谓词,我不需要看其他的。
    • @A'merMograbi 你能用文字告诉我这个谓词应该做什么吗?或者给出正确的输入/输出组合?无论哪种方式,我都会继续探讨它,但只有操作定义我可能会错过更好的简化。
    • 编辑了我的问题,我添加了这个谓词应该做什么。(在底部)@DanielLyons
    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2013-02-17
    相关资源
    最近更新 更多