【发布时间】: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(因为遇到 [ ] 意味着头部已经删除,现在我们只从尾部重新开始),一旦你有了'之前','之后'将只是([输入列表的长度] - '之前' - [子列表的长度]) .不幸的是,我完全不知道如何增加“之前”。 有什么想法吗?非常感谢! :)
【问题讨论】: