Как я могу повторить список в прологе SWI? - PullRequest
0 голосов
/ 04 декабря 2018

Как я могу повторить список в swi prolog?

{ex: repeat (X, Y, N), чтобы быть истинным, когда Y является списком, состоящим из каждого элемента X, повторенного N раз (например, repeat ([a, b], [a, a, a, б, б, б], 3) верно).}

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Хитрость здесь в том, чтобы иметь вложенные итерации - итерации по N..1, вложенные в итерации по элементам исходного списка.Это работает в SWI-Prolog: repeat_list ([], [], _): -!.

repeat_list(_,[],0) :- !.

repeat_list(X,Y,N) :-
    N > 0,
    repeat_list(N,N,X,Y),
    !.

repeat_list(_,_,[],[]) :- !.

repeat_list(1,N,[H|List1],[H|List2]) :-
    repeat_list(N,N,List1,List2).

repeat_list(M,N,[H|List1],[H|List2]) :-
    L is M - 1,
    repeat_list(L,N,[H|List1],List2).

NB Старайтесь не использовать имена стандартных предложений, такие как repeat, для целей, отличных от стандартных намеренийиспользовать его для.

0 голосов
/ 06 декабря 2018

В Haskell ...

rep ls n = [i |i <- ls, _ <- [1 .. n]] main = print $ rep ["1", "2"] 3 </p>

В прологе

: - forall (I,между (1,3), Ls), Ls = [1,2,3].

...