2013-05-13 78 views
0

編寫一個Prolog程序,在屏幕上打印出n * n個給定字符的正方形。調用你的謂詞square/2。第一個參數應該是(正)整數。第二個參數是要打印的字符(任何Prolog術語)。例如:如何在prolog中打印n * n給定字符的平方?

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

我剛開始學習這門語言。我這樣做:

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

它根本不起作用。誰能幫我?

+2

你能寫一個字嗎? '? - write_one('c')。'會打印'c'。你能寫這個謂詞嗎? – 2013-05-13 16:21:15

+0

'write(N *'B')'要求Prolog寫出表達式'N *'B''。 Prolog不會評估'is/2'表達式之外的算術表達式,除此之外,沒有辦法通過這種方式重複其他原子來創建原子。更加努力。你可以做到,你只需要非常明確。 – 2013-05-13 17:25:46

回答

2

所以你的問題基本上是「我該如何編寫一個嵌套在循環中的循環?」

這是怎麼寫的與反整數空循環:

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

這在C將是:

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

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

0

分解問題。寫一個N×N的平方,你需要做兩件事情:

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

簡單!

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.