2013-11-05 62 views
0

如何在序言中創建nxn矩陣並在矩陣內部列出n爲1. 我可以爲生成列表創建編碼,但不知道如何創建矩陣nxn:序言:nxn矩陣的n列表

make_num_list(N, List) :- 
    make_list(N, List). 

make_list(N, []) :- 
    N =< 0, 
    !. 
make_list(N, [N|Rest]) :- 
    N > 0, 
    N2 is N - 1, 
    make_list(N2, Rest). 
+0

有在Prolog中是沒有 「矩陣」 的數據類型,所以我們經常求助於使用列表列表(其中這些列表對應於矩陣的行)。有了耐心和專注,就有可能爲這種表示實現矩陣算術。 – hardmath

回答

1

重複使用您的代碼和您的想法。

make_num_matrix(N, Matrix) :- 
    make_matrix(N, N, Matrix). 

make_matrix(_, N, []) :- 
    N =< 0, 
    !. 
make_matrix(M, N, [R|Rs]) :- 
    make_list(M, R), 
    N2 is N - 1, 
    make_matrix(M, N2, Rs). 

make_list(N, []) :- 
    N =< 0, 
    !. 
make_list(N, [N|Rest]) :- 
    N > 0, 
    N2 is N - 1, 
    make_list(N2, Rest). 

?- make_num_matrix(4, M). 
M = [[4, 3, 2, 1], [4, 3, 2, 1], [4, 3, 2, 1], [4, 3, 2, 1]]. 
1

最Prolog的那裏有between/3,而必將有findall/3

make_matrix(N, M) :- findall(Ns, (between(1,N,_), make_list(N,Ns)), M). 
+0

@mat:你的意思是make_matrix/2,我想。但之後,我們需要maplist ...我認爲學習findall對於一個新手來說(更)是基礎... – CapelliC

+0

@mat:我不明白... make_list/2是OP原始代碼。我不得不使用make_num_list來代替... – CapelliC