谓词solve / 2,其第一个参数是非空列表,第二个参数是由零个或多个第一个参数的附加副本组成的列表

时间:2019-12-29 21:38:47

标签: prolog

solve([],[]).
solve([H|T] ,L2) :-
     solve(T,L2).
solve(L1,[H,H|T1]) :-
     solve(L1,T1).

期望值

solve([a,b,a,b,a,b,a,b], X).

X = [] ? ;

X = [a,b,a,b,a,b,a,b] ? ;

X = [a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b] ? ;

X = [a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b] ? ;

X = [a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b,a,b] ? ; 

这一直持续到无限

实际输出

X = [] ? ;

X = [A,A] ? ;

X = [A,A,B,B] ? ;

X = [A,A,B,B,C,C] ? ;

X = [A,A,B,B,C,C,D,D] ? ;

X = [A,A,B,B,C,C,D,D,E,E] ? ;

X = [A,A,B,B,C,C,D,D,E,E,F,F] ? 

我不确定为什么会发生这种情况,因为我无法将其乘以初始的第一个参数长度(从0开始并在2s内递增)是否对输出第一个论证0次或更多次有帮助?

1 个答案:

答案 0 :(得分:1)

我们将使用append/3https://www.swi-prolog.org/pldoc/man?predicate=append/3

solve(L1, []). 
solve(L1, L2) :- solve(L1, L3), append(L1, L3, L2).

空列表是第一个参数的0个副本。

如果L3n的{​​{1}}副本,并且L1L2L1串联的,则L3L2的{​​{1}}个副本。

修改

为了使在第一个参数中搜索解决方案成为可能,我们进行了两项更改:

  1. 保证第一个参数至少包含一个元素。
  2. 首先放置n+1要求。

代码现在如下:

L1