编写一个Prolog程序,在屏幕上打印出一个n * n给定字符的正方形。调用你的谓词square / 2。第一个参数应该是(正)整数。第二个参数是要打印的字符(任何Prolog术语)。例如:
?-square(5, '*').
*****
*****
*****
*****
*****
Yes
我刚开始学习这门语言。我这样做了:
square(_,'_').
square(N, 'B') :-
N>0,
write(N*'B').
根本不起作用。任何人都可以帮助我吗?
答案 0 :(得分:3)
所以你的问题基本上是“如何编写一个嵌套在循环中的循环?”
这是你用计数器的整数写一个空循环的方法:
loop(0).
loop(N) :- N > 0, N0 is N-1, loop(N0).
在C中将是:
for(i=0; i < n; ++i) { }
您似乎已经知道如何打印(write(foo)
)。
答案 1 :(得分:0)
分解问题。要编写NxN正方形,您需要做两件事:
第二个很简单:
do_line(0,_) :-
nl
.
do_line(N,C) :-
N > 0 ,
write(C) ,
N1 is N-1 ,
do_line(N1,C)
.
第一个并不困难:
do_lines(0,_,_).
do_lines(M,N,C) :-
M > 0 ,
do_line(N,C) ,
M1 is M-1 ,
do_lines(M1,N,C)
.
你需要做的就是把它包起来:
write_square(N,C) :- do_lines(N,N,C) .
容易!
答案 2 :(得分:0)
你需要画一行N星/字符
line(N,X):- N>0, N1 is N-1, line(N1,X), write(X), fail; true.
然后你将绘制一列N行星/字符。
s(N,Chr):-sAux(N,0,Chr).
sAux(N,N,Chr).
sAux(N,C,Chr):-C<N, C1 is C+1, sAux(N, C1, Chr), line(N,Chr),nl.
s(N,Chr):- N>0, N1 is N-1, s(N1,X), linie(N,X), nl, fail;true.