вложенных циклов, в основном соединения между последовательностями, и большинство обработки списков в Прологе лучше всего выражается без индексации:
?- L=[a,b,c], findall(foo(X,Y), (member(X,L),member(Y,L)), R).
L = [a, b, c],
R = [foo(a, a), foo(a, b), foo(a, c), foo(b, a), foo(b, b), foo(b, c), foo(c, a), foo(c, b), foo(..., ...)].
редактировать
Когда-то целые числа позволяют захватывать смысл простым способом , В качестве примера, мое решение для одного из более простых викторинов в Prolog.
icecream(N) :-
loop(N, top(N)),
left, loop(N+1, center), nl,
loop(N+1, bottom(N)).
:- meta_predicate loop(+, 1).
loop(XH, PR) :-
H is XH,
forall(between(1, H, I), call(PR, I)).
top(N, I) :-
left, spc(N-I+1), pop,
( I > 1
-> pop,
spc(2*(I-2)),
pcl
; true
),
pcl, nl.
bottom(N, I) :-
left, spc(I-1), put(\), spc(2*(N-I+1)), put(/), nl.
center(_) :- put(/), put(\).
left :- spc(4).
pop :- put(0'().
pcl :- put(0')).
spc(Ex) :- V is Ex, forall(between(1, V, _), put(0')).
Запуск в SWI-Прологе:
?- icecream(3).
()
(())
(())
/\/\/\/\
\ /
\ /
\/
\/
true.
?- forall(loop(3,[X]>>loop(2,{X}/[Y]>>writeln(X-Y))),true).
1-1
1-2
2-1
2-2
3-1
3-2
true.
Пожалуйста, объясните, что именно вы пытаетесь для того чтобы достигнуть, а также то, что вы уже пробовали. :) – Reflic
И почему вы пытаетесь сделать императивное программирование на языке логического программирования? – Enigmativity