这是我的问题:
编写一个过程distance(List, Nemptylist, SubList)/3
来检查Sublist
是List
的子列表,项目约束之间的距离不超过N
(N
被实现为Nemptylist
– N
匿名变量的列表)。假设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).