list - 使用 prolog 枚举子列表

标签 list prolog increment

我正在尝试编写一个以下列方式运行的序言程序: 它列举了所有可能的连续(我不确定这是否是正确的短语,即 [a,c] 不是 [a,b,c] 的子列表)子列表,子列表的长度,与第一个的距离适当列表的元素到子列表的第一个元素以及从子列表的最后一个元素到适当列表的最后一个元素的距离。 所以输入/输出理想情况下应该是这样的:

| ?- sublist([a,b], SubList, Before, Len, After).
    SubList= [], After = 2, Before = 0, Len = 0 ? ;
    SubList= [a], After = 1, Before = 0, Len = 1 ? ;
    SubList= [a,b], After = 0, Before = 0, Len = 2 ? ;
    SubList= [], After = 1, Before = 1, Len = 0 ? ;
    SubList= [b], After = 0, Before = 1, Len = 1 ? ;
    SubList= [], After = 0, Before = 2, Len = 0 ? ;

到目前为止,我可以正确输出子列表,并输出它们的长度,如下所示:

sublist(L,S,Len) :-
    append(_,L2,L), %getting sublist
    append(S,_,L2), %getting sublist
    length(S,Len).  %getting length of sublist

但我无法弄清楚如何跟踪“之前”和“之后”。 这似乎是一种(也许是偷偷摸摸的?)这样做的方法是每次遇到 [ ] 值的子列表时,从 -1 开始 B 并将“Before”递增 1(因为遇到 [ ] 意味着头部已经删除,现在我们只从尾部开始),一旦你有了“之前”,“之后”就是([输入列表的长度] - '之前' - [子列表的长度]) .不幸的是,我完全不知道如何增加“之前”。 有什么想法吗?非常感谢! :)

最佳答案

So far I can output the sublists properly, and output their lengths, like so [...]

你几乎明白了。

只需将前缀和后缀绑定(bind)到变量上,并确保前缀的长度为Before,后缀的长度为After:

sublist_lengths(L, SubList, Before, Len, After) :-
    append(PrefSub, Suffix, L),
    append(Prefix, SubList, PrefSub),
    length(SubList, Len),
    length(Prefix, Before),
    length(Suffix, After).

关于list - 使用 prolog 枚举子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9690355/

相关文章:

java - 如何使用 lambda/java8 迭代递归列表

java - 在 Java 中返回递增的数字

php - mysql_fetch_array while 循环。它是如何工作的?

Python/SQLite 将列表存储为二进制文件 (blob)

python - 根据python中列表的值以不同的间隔拼接列表

javascript - 展开式可折叠 HTML 列表- ul - li

Prolog:如何对来自 shell 的输入执行术语扩展?

prolog - 递归谓词中的回溯

algorithm - Prolog排列

php - 点击按钮触发 SQL 查询?