我正在尝试编写一个以下列方式运行的序言程序: 它列举了所有可能的连续(我不确定这是否是正确的短语,即 [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/