使用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序言。
单个子句,不受发生检查的影响:
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)