这是我的问题:


编写一个过程distance(List, Nemptylist, SubList)/3来检查Sublist
List的子列表,项目约束之间的距离不超过NN
被实现为NemptylistN匿名变量的列表)。假设List
已完全实例化。只要答案数量有限,就可以重复答案。

例如,对于N = 2:

?- distance( [a,t,d,r,a,n,c,b,c] , [_,_], [a,b,c] ).
true

?- distance( [m,a,t,d,r,b,c,t] , [_,_] , [a,b,c] ).
false

?- distance([a, t, d, r, a, n, c, b], [_, _], [a, b, c]).
false

?- distance([c, c, c, a, c, c, c], [_, _], [a]).
true.



我坐了几个小时,试图解决这个问题,最终解决了例子
以上工作,但后来我进行了一些测试,他们失败了。

我现在的解决方案如下:

distance( L1 , L2 , [X]   ) :-
  member(X,L1) .
distance( L1 , L2 , [H|T] ) :-
  distance(L1,L2,T) ,
  append(Y,Z,L2) ,
  T=[Hs|Ts] ,
  append([H],Y,W) ,
  append(W,[Hs],R) ,
  sublist(R,L1) .

prefix(X,L) :- append(X, _, L).

suffix(X,L) :- append(_, X, L).

sublist(X,L) :- suffix(S,L) , prefix(X,S) .


当我尝试运行此测试时:

distance( [r,a,n,c,b,c],[],X) .


由于运行时超出错误而失败。

我调试了几个小时,真的很累。请帮我完成这个可怕的任务。

最佳答案

我发现您的实现存在两个主要问题:


您正在将NEmptyList中的元素与List目标中的sublist(R, L1)元素统一。将来的sublist目标可能会失败,因为NEmptyList不会与N中的任何List连续元素统一。如果您想使用附加操作(可以),则每次应最多生成一个新的长度列表,N(请参见下文)。
您可以使用来自SubList的相同唯一序列来验证来自List的不同序列。为了证明这一点,请尝试以下解决方案:

?- distance([a,a],[],[a,a,a,a,a,a]).
true ;
true ;
false.



这是一个解决方案:

distance(_, _, []).
distance(List, NEmpty, Sublist):-
    append(_, Right, List),   % The first element can be anywhere in the list
    distance2(Right, NEmpty, Sublist).

distance2([X|_], _, [X]).
distance2(List, NEmpty, [X|Sublist]):-
    length(NEmpty, N),
    between(0, N, N1),
    length(AtMostNEmpty, N1), % Make a different list each time of length <N
    append([X|AtMostNEmpty], Right, List),
    distance2(Right, NEmpty, Sublist).

10-08 18:28