1

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

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

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

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

它根本不起作用。谁能帮我?

4

4 回答 4

3

所以你的问题基本上是“我如何编写一个嵌套在循环中的循环?”

这是您为计数器编写一个带有整数的空循环的方法:

loop(0).
loop(N) :- N > 0, N0 is N-1, loop(N0).

在 C 中是:

for(i=0; i < n; ++i) { }

而且您似乎已经知道如何打印 ( write(foo))。

于 2013-05-13T18:00:18.577 回答
0

分解问题。要写一个 NxN 正方形,你需要做两件事:

  1. 写N行
  2. 写一行,由 N 个字符和一个换行符组成。

第二个很简单:

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) .

简单的!

于 2013-05-14T17:16:52.443 回答
0

这样做:

square2(0,_). % base case, recursion stops when X reaches 0, second argument is irrelevent    

square2(X,Symbol):-
  X1 is X - 1,
  write(Symbol),
  square2(X1,Symbol).

使用查询,结果为:

?- square2(5,'* ').
* * * * *

因此,我们需要另一个循环来使其写入 X 次。

square1(0,_,_). % base case, recursion stops when X reaches 0

square1(X,Y,Symbol):-
  X1 is X - 1,
  square2(Y,Symbol), % with the same Y passed in square2 predicate to print a line of symbols
  nl, % creates a new line
  square1(X1,Y,Symbol).

但是,问题是要求格式为square(5, '* '). 所以,

square(X,Symbol):-
  square1(X,X,Symbol).

总结一下:

square(X,Symbol):-
  square1(X,X,Symbol).

square1(0,_,_).      
square1(X,Y,Symbol):-
  X1 is X - 1,
  square2(Y,Symbol), 
  nl,
  square1(X1,Y,Symbol).

square2(0,_).    
square2(X,Symbol):-
  X1 is X - 1,
  write(Symbol),
  square2(X1,Symbol).
于 2021-05-21T15:14:32.460 回答
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.

于 2018-03-04T22:14:45.213 回答