如何在prolog中打印n * n给定字符的平方?

时间:2013-05-13 16:13:55

标签: printing prolog

编写一个Prolog程序,在屏幕上打印出一个n * n给定字符的正方形。调用你的谓词square / 2。第一个参数应该是(正)整数。第二个参数是要打印的字符(任何Prolog术语)。例如:

?-square(5, '*').
*****
*****
*****
*****
*****
Yes

我刚开始学习这门语言。我这样做了:

square(_,'_').
square(N, 'B') :-
        N>0,
        write(N*'B').

根本不起作用。任何人都可以帮助我吗?

3 个答案:

答案 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正方形,您需要做两件事:

  1. 写N行
  2. 写一行,由N个字符后跟换行符组成。
  3. 第二个很简单:

    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.