所有包含三个重复元素的列表

fal*_*lse 6 prolog

使用Prolog prologue可以轻松定义具有单个元素的所有列表:

?- maplist(=(_),L).
   L = []
;  L = [_A]
;  L = [_A,_A]
;  L = [_A,_A,_A]
;  ... .
Run Code Online (Sandbox Code Playgroud)

所以这个元素被一遍又一遍地重复。美好的。但是,如何定义始终以相同顺序重复三个元素的所有列表呢?这样我得到的答案是:

?- Query_with_L.
   L = []
;  L = [_A]
;  L = [_A,_B]
;  L = [_A,_B,_C]
;  L = [_A,_B,_C,_A]
;  L = [_A,_B,_C,_A,_B]
;  L = [_A,_B,_C,_A,_B,_C]
;  L = [_A,_B,_C,_A,_B,_C,_A]
;  ... .
?- L = [a,_,_,b|_], Query_with_L.
   false.
?- L = [_,a,_,_,b|_], Query_with_L.
   false.
?- L = [_,_,a,_,_,b|_], Query_with_L.
   false.
Run Code Online (Sandbox Code Playgroud)

这一切只是使用Prolog序言

not*_*ria 6

单个子句,不受发生检查的影响:

repeat3(Es) :-
    append([_,_,_], Es, Fs),
    append(Es, [_,_,_], Fs).
Run Code Online (Sandbox Code Playgroud)

最后:

repeat3(Es) :-
    append(Es, [_,_,_], [_,_,_|Es]).
Run Code Online (Sandbox Code Playgroud)


not*_*ria 4

最小:

repeat3(Es) :-
    append(Es, _, [_,_,_|Es]).
Run Code Online (Sandbox Code Playgroud)