塞尔平斯基地毯在序言中

  • 本文关键字: recursion prolog
  • 更新时间 :
  • 英文 :


在这里看到了这个问题,因为我是一个prolog新手,我尝试制定一个解决方案,但没有成功。以下是到目前为止我设法对此所做的:

rewrite('X', [['X','X','X'],['X',' ','X'],['X','X','X']]).
rewrite(' ', [[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']]).
rec(1, [], CurrentList, [CurrentList]).
rec(_, [], CurrentList, CurrentList).
rec(0, L, CurrentList, Result):- append(CurrentList, [L], Result).
rec(N, [H|T], CurrentList, Result):-
    atom(H),
    N > 0,
    rewrite(H, L),
    K is N - 1,
    rec(K, L, CurrentList, Temp),
    rec(N, T, Temp, Result).
rec(N, [H|T], CurrentList, Result):-
    N > 0,
    rec(N, H, CurrentList, Temp),
    rec(N, T, Temp, Result).
carpet(N):-
    N > 0,
    rewrite(Item, _),!,
    rec(N, [[Item]], [], Result),
    write(Result).
本质上,我

尝试扩展我的第一个元素,然后扩展由上一个扩展创建的每个元素。

然后我写了第一个 rec 事实,基本上是将前一个到最后一个扩展的所有扩展元素放在一个列表中,并指示将放置换行符的位置,但将括号从下一个扩展组的开始到结束放置,而不是从下一个扩展组的开始到它的结尾。

我可能有很多错误的逻辑,所以任何其他解决此问题的方法都是受欢迎的。

使用 rec 作为谓词名称并不是在帮自己一个忙。它应该做什么?

这是我的方法。它基于首先简化问题,只考虑一个非空符号行的一个级别的重写。然后,通过迭代来考虑几行就很简单了。

% expand_row(Row, Expansion): Row is a list of symbols representing one row
% of the Sierpinski carpet. Expansion is a list of rows, i.e., a list of
% lists of symbols, resulting from rewriting each symbol in Row.
expand_row([C], Expansion) :-
    rewrite(C, Expansion).
expand_row([C,D|Cs], Expansion) :-
    rewrite(C, ExpansionC),
    expand_row([D|Cs], ExpansionRest),
    maplist(append, ExpansionC, ExpansionRest, Expansion).
carpet_(1, [['X']]).
carpet_(N, Carpet) :-
    N > 1,
    N1 is N - 1,
    carpet_(N1, Carpet1),
    maplist(expand_row, Carpet1, CarpetExpanded),
    % remove one level of nesting
    append(CarpetExpanded, Carpet).

请注意,这仅计算地毯,不打印地毯。最好单独完成:

write_row(Row) :-
    maplist(write, Row),
    nl.
write_carpet(Carpet) :-
    maplist(write_row, Carpet).
carpet(N) :-
    carpet_(N, Carpet),
    write_carpet(Carpet).

测试:

?- between(1, 4, N), carpet(N).
X
N = 1 ;
XXX
X X
XXX
N = 2 ;
XXXXXXXXX
X XX XX X
XXXXXXXXX
XXX   XXX
X X   X X
XXX   XXX
XXXXXXXXX
X XX XX X
XXXXXXXXX
N = 3 ;
XXXXXXXXXXXXXXXXXXXXXXXXXXX
X XX XX XX XX XX XX XX XX X
XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXX   XXXXXX   XXXXXX   XXX
X X   X XX X   X XX X   X X
XXX   XXXXXX   XXXXXX   XXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX
X XX XX XX XX XX XX XX XX X
XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXX         XXXXXXXXX
X XX XX X         X XX XX X
XXXXXXXXX         XXXXXXXXX
XXX   XXX         XXX   XXX
X X   X X         X X   X X
XXX   XXX         XXX   XXX
XXXXXXXXX         XXXXXXXXX
X XX XX X         X XX XX X
XXXXXXXXX         XXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX
X XX XX XX XX XX XX XX XX X
XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXX   XXXXXX   XXXXXX   XXX
X X   X XX X   X XX X   X X
XXX   XXXXXX   XXXXXX   XXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX
X XX XX XX XX XX XX XX XX X
XXXXXXXXXXXXXXXXXXXXXXXXXXX
N = 4 ;
false.

相关内容

  • 没有找到相关文章

最新更新