Matrix 如何在prolog中以以下格式打印矩阵

Matrix 如何在prolog中以以下格式打印矩阵,matrix,prolog,meta-predicate,Matrix,Prolog,Meta Predicate,我正在尝试以以下格式打印矩阵,但我不确定如何打印。这就是我要打印的格式 ************ ***35****35* ***2938**28* **28*2358*32 *3512**23*93 *28*3258*328 **92*329*21* *318*5913*13 *53*28**2345 *84*8125*21* **13**5329** **12****58** 这就是我创建矩阵的方式,我需要修改什么才能像上面那样打印出来 :- use_module(library(clpf

我正在尝试以以下格式打印矩阵,但我不确定如何打印。这就是我要打印的格式

************
***35****35*
***2938**28*
**28*2358*32
*3512**23*93
*28*3258*328
**92*329*21*
*318*5913*13
*53*28**2345
*84*8125*21*
**13**5329**
**12****58**
这就是我创建矩阵的方式,我需要修改什么才能像上面那样打印出来

:- use_module(library(clpfd)).

%Create Matrix
setMatrix(N, Matrix) :-
        length(Matrix, N),
        maplist(length_list(N), Matrix).

length_list(L, Ls) :- length(Ls, L).

在回答实际问题之前,我要补充几点:

  • 根据实体之间的关系进行思考,并描述其中所包含的内容。在这种观点中,“创建”、“设置”等措辞毫无意义:所描述的实体是通过多种方式描述它们而存在的,例如,直接将它们写下来

  • 考虑到前面的一点,例如,您可以使用:

    n_matrix(N, Matrix) :-
            length(Matrix, N),
            maplist(same_length(Matrix), Matrix).
    
  • 请注意,
    n_矩阵/2
    可用于所有方向,包括:使用部分填充矩阵,从给定或部分实例化矩阵确定
    n
    ,测试矩阵是否为n×n矩阵等。因此,我们选择了一个同时包含所有此类用例的名称,通过使用声明性措辞说明每个参数代表什么

  • 现在回答实际问题:

    试着回答一个更简单的问题:

    您将如何以您想要的方式打印此矩阵的单行

    一种方法是:

    print_row(Ls) :- maplist(write, Ls), nl.
    
    现在,您可以轻松地将其应用于打印整个矩阵:

    ?- n_matrix(N, Ms), maplist(print_row, Ms). ?-n_矩阵(n,Ms),地图列表(打印行,Ms)。
    在描述列表上的关系时,通常最好先定义单个元素的关系,然后使用s
    maplist/2
    maplist/N
    来描述整个列表的关系。

    谢谢您的解释,非常清楚。我对prolog非常陌生,主要是做Java,所以prolog的做事方式现在对我来说非常奇怪。这是意料之中的。与Prolog相比,Java是非常低级的,因此,不再被低级细节拖累,您现在可能第一次可以自由思考更有趣的事情,这也更难理解:您定义的关系的通用性和全方位性,为一般关系等寻找好的名称。对不起,我如何将其应用于声明的n_矩阵?我的意思是我该如何添加它。因为这是在一个单独的文件中,我调用它到SWI prolog中。最简单的方法是将
    n_matrix/2
    的定义添加到同一文件中的其他定义中。