【问题标题】:Enumerating a sublist with prolog使用 prolog 枚举子列表
【发布时间】:2012-03-13 19:01:52
【问题描述】:

我正在尝试编写一个以下列方式运行的 prolog 程序: 它枚举所有可能的连续(我不确定这是否是正确的短语,即 [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(因为遇到 [ ] 意味着头部已经删除,现在我们只从尾部重新开始),一旦你有了'之前','之后'将只是([输入列表的长度] - '之前' - [子列表的长度]) .不幸的是,我完全不知道如何增加“之前”。 有什么想法吗?非常感谢! :)

【问题讨论】:

    标签: list prolog increment


    【解决方案1】:

    到目前为止,我可以正确输出子列表,并输出它们的长度,就像这样 [...]

    你几乎明白了。

    只需将前缀和后缀绑定到变量,并确保前缀长度为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).
    

    【讨论】:

    • 啊!现在有道理了 :) 非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多