List 在Prolog中查找大小为N的所有子列表
我不熟悉Prolog,我一直在写这个谓词。基本上,我得到了一个列表,我需要找到大小为N的最常见子列表。示例:List 在Prolog中查找大小为N的所有子列表,list,recursion,prolog,instantiation-error,List,Recursion,Prolog,Instantiation Error,我不熟悉Prolog,我一直在写这个谓词。基本上,我得到了一个列表,我需要找到大小为N的最常见子列表。示例: 最常见的子列表([1,2,2,3,2,2,4,2,2,3],1,L),输出应为L=[2] 最常见的子列表([1,2,2,3,2,2,4,2,2,3],2,L),输出应为L=[2,2] 最常见的子列表([1,2,2,3,2,2,4,2,2,3],3,L),输出应为L=[2,2,3] 我的方法是编写一个谓词,获取列表的前N个元素,编写第二个谓词,其作用类似于生成器(反复调用第一个谓词,
最常见的子列表([1,2,2,3,2,2,4,2,2,3],1,L)
,输出应为L=[2]
最常见的子列表([1,2,2,3,2,2,4,2,2,3],2,L)
,输出应为L=[2,2]
最常见的子列表([1,2,2,3,2,2,4,2,2,3],3,L)
,输出应为L=[2,2,3]
length([],0).
length([_|L],N) :- N is M+1, length(L,M).
// This will get the first N elements from the list.
// I tested it and it works.
sublist([H|_],1,[H]).
sublist([H|T],N,[H|LOP]) :- M is N-1, sublist(T,M,LOP).
// This is supposed to generate all the sublists,
// length is a predicate that returns the length of the list.
generator(L,N,L) :- length(L,M), N=:=M.
generator([H|T],N,[PN|LOP]) :- sublist([H|T],N,PN), generator(T,N,LOP).
这就是我得到的错误:
?- generator([1,2,3,4,5,6,7],2,X).
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR: [12] _6018 is _6024+1
ERROR: [11] length([1,2|...],_6052) at c:/users/ace_m/documents/prolog/bp.pl:44
ERROR: [10] generator([1,2|...],2,[1,2|...]) at c:/users/ace_m/documents/prolog/bp.pl:83
ERROR: [9] <user>
Exception: (10) generator([1, 2, 3, 4, 5, 6, 7], 2, _5204) ?
?-生成器([1,2,3,4,5,6,7],2,X)。
错误:参数没有充分实例化
错误:在:
错误:[12]_6018是_6024+1
错误:[11]长度([1,2 |…],_6052)在c:/users/ace_m/documents/prolog/bp.pl:44
错误:[10]生成器([1,2 |…],2[1,2 |…]),位于c:/users/ace|m/documents/prolog/bp.pl:83
错误:[9]
例外情况:(10)发电机([1,2,3,4,5,6,7],2,_5204)?
我知道这个错误意味着我没有传递正确的值,但我不知道我哪里出错了。任何帮助在算术表达式中的变量被绑定到值之前,您不能使用它。您的错误引用了使用
+
的表达式,但您发布的代码都没有。@ScottHunter我想这是从长度谓词中得出的,我也把它放在了我的代码中。1)为什么不使用内置的length/2
而不是使用自己的?2) 子列表的编写是正确的,但您可以更轻松地使用:Sublist(L,N,SL):-length(SL,N),append(SL,u,L)
3)在生成器/3的第1个子句中,M在调用length/2时未实例化,因此计算N is M+1将失败4)您可以使用制表吗?因为这听起来像是。。。(嘿,是时候使用Prolog 90年代老歌以外的其他功能了)@DavidTonhofer我不应该使用内置谓词,我应该自己编写它们。。。我想这是最好的,因为这是学习这些东西的最好方法,谢谢你的回答,尽管我解决了我的问题!