使用prolog枚举子列表

时间:2012-03-13 19:01:53

标签: list prolog increment

我正在尝试编写一个以下列方式运行的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

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

1 个答案:

答案 0 :(得分:3)

  

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

你几乎得到了它。

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