List 在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个元素,编写第二个谓词,其作用类似于生成器(反复调用第一个谓词,

我不熟悉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个元素,编写第二个谓词,其作用类似于生成器(反复调用第一个谓词,直到列表缩短为大小N),然后检查所有生成的子列表有多少次匹配,并获得最大值

    我被发电机卡住了,剩下的我很确定我知道怎么写

    这是我目前的代码:

    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我不应该使用内置谓词,我应该自己编写它们。。。我想这是最好的,因为这是学习这些东西的最好方法,谢谢你的回答,尽管我解决了我的问题!