cake(N) :- phrase(cake(N), L), string_to_list(S, L), write(S). cake(N0) --> { N is N0 - 1 }, tok_spacer_width("/\\", " ", N), "\n", tok_spacer_width("\\/", " ", N), "\n", { Ncan is N * 2 }, candle(Ncan, N), tok_spacer_width("oo", "o", N), "\n", body(N0, N0), tok_spacer_width("oo", "o", N), "\n". candle(0, _) --> []. candle(N, M) --> tok_spacer_width("||", " ", M), "\n", { N1 is N - 1 }, candle(N1, M). body(1, _) --> []. body(N, M) --> { N > 1 }, { N1 is N - 1 }, ubody(N, M), "\n", body(N1, M), lbody(N, M), "\n". ubody(N, M) --> { N1 is N - 1 }, { phrase(utok(N, M), Tok) }, tok_spacer_width(Tok, "o", N1). lbody(N, M) --> { N1 is N - 1 }, { phrase(ltok(N, M), Tok) }, tok_spacer_width(Tok, "o", N1). utok(N, M) --> { DN is M - N }, "/", repeat("xx", DN), "\\". ltok(N, M) --> { DN is M - N }, "\\", repeat("xx", DN), "/". tok_spacer_width(C, S, N) --> { N2 is N * 2 }, repeat(S, N), C, repeat(S, N2), C, repeat(S, N2), C, repeat(S, N2), C, repeat(S, N2), C, repeat(S, N). repeat(_, 0) --> []. repeat(C, N) --> { N > 0 }, C, { N1 is N - 1 }, repeat(C, N1).