2013-03-09 43 views
1

我需要編寫一個遞歸謂詞rectangle,這樣rectangle(M, N)寫出一個大小爲M x N星號的實心矩形,即矩形中應該有M行和N列。例如:寫一個prolog程序,顯示一個M * N網格的星號?

?- rectangle(3,8). 
******** 
******** 
******** 
true 

到目前爲止,我有聲明line,打印一行N星號:

line(0). 
line(N) :- write('*'), A is N-1 , line(A). 

我嘗試了一切,但我不斷收到星號的無限電網。這是我到目前爲止:

rectangle(0,0). 
rectangle(M,N) :- 
    line(M), 
    write('*'), nl, A is N-1, line(A-1), 
    rectangle(M,A). 
+3

這是很好的,你已經嘗試了一切,但它會更容易幫助你,如果你告訴我們,你已經嘗試了什麼。 – 2013-03-09 17:21:31

+0

到目前爲止我所得到的是:矩形(0,0)。 (M,N): - 行(M), 寫('*'),n1,A是N-1,行(A-1)。它只顯示無數星號。謝謝 – user2152012 2013-03-09 17:24:12

+0

爲什麼你把M傳給行,看起來M是行數而不是列數?你爲什麼打兩次電話?你爲什麼寫一個星號?你真的可以用正常的語言寫下程序的邏輯,而不是序言嗎?它可能會幫助你。 – 2013-03-09 19:16:01

回答

1

我知道你的任務需要一個遞歸過程,那麼你不應該認爲這是一個答案。但是我想用一個metapredicate來展示一個可能的簡明解決方案:

loop_n(P, N) :- forall(between(1, N, _), P). 
rectangle(R, C) :- loop_n((loop_n(write(*), C), nl), R). 

並非每個Prolog支持都調用一個變量。例如,在我的舊Prolog解釋器中,我會寫loop_n(P, N) :- forall(between(1, N, _), call(P)).

0

獲取星號的無限網格是因爲您沒有定義矩形(M,0)。 所以,代碼應該如下:

rectangle(0,0). 
rectangle(M,0). 
rectangle(M,N) :- 
    line(M),nl, A is N-1, rectangle(M,A). 
line(0). 
line(B) :- write('*'), Z is B-1 , line(Z). 
相關問題