首页 > 解决方案 > 如何在prolog中访问二维数组以及如何循环其中的每个元素

问题描述

如何在prolog中访问二维数组以及如何循环其中的每个元素例如如果我有一个矩阵问题1我如何在prolog中创建这样的二维列表:

  1 2 3
  4 5 6
  7 8 9

问题2:我如何循环每个元素并使每个元素+1变成

  2 3 4
  5 6 7
  8 9 10

问题 3

 public Cell(int row, int col, int cost, int units) {
        this.cost = cost;
        this.units = units;
        this.row = row;
        this.col = col;
    }

在矩阵中,每件事都是像单元格一样的对象我的任务是将 java 代码转换为 Prolog 代码

那么我怎么能把这个对象变成prolog呢?

标签: arraysmatrixprolog

解决方案


根据您提出问题的方式,即transfer java code into Prolog您似乎在程序或面向对象的代码中思考,并希望在学习 Prolog 时利用这些知识作为杠杆。我的建议是不要将您对过程或面向对象代码的知识用作帮助您学习 Prolog 的杠杆或后备,因为它会阻碍您使用 Prolog 的学习和效率。相反,通过学习按预期使用 Prolog 来尝试并拥抱 Prolog。

此外,在 Stackoverflow 上提问时,您应该包含您尝试过的代码。

如何在 Prolog 中访问二维数组?

所以你想在 Prolog 中创建一个可以将数据作为二维数组处理的数据结构。在不知道更多细节的情况下,列表列表应该可以工作,例如

[[[1],[2],[3]],[[4],[5],[6]],[[7],[8],[9]]]

还有其他可能性,但问题中没有足够的细节来为特定问题提出更具体的建议。

如何循环每个元素并使每个元素 +1。

首先它是使用递归完成的,因此您可以详细了解正在发生的事情

increment(Array,New_array) :-
    increment_rows(Array,New_array).

increment_rows([Row|Rows],[New_row|New_rows]) :-
    increment_row(Row,New_row),
    increment_rows(Rows,New_rows).
increment_rows([],[]).

increment_row([Cell|Columns],[New_cell|New_columns]) :-
    increment_cell(Cell,New_cell),
    increment_row(Columns,New_columns).
increment_row([],[]).

increment_cell(Cell,New_cell) :-
    New_cell is Cell + 1.

?- increment([[[1],[2],[3]], [[4],[5],[6]], [[7],[8],[9]]], New_array).
New_array = [[2, 3, 4], [5, 6, 7], [8, 9, 10]].

现在使用内置谓词maplist/3

increment_item(Item,New_item) :-
    New_item is Item + 1.

increment_list(List,New_list) :-
    maplist(increment_item,List,New_list).

increment_array(Array,New_array) :-
    maplist(increment_list,Array,New_array).

?- increment_array([[[1],[2],[3]], [[4],[5],[6]], [[7],[8],[9]]], New_array).
New_array = [[2, 3, 4], [5, 6, 7], [8, 9, 10]].

我怎样才能把这个对象变成 Prolog?

由于标准 Prolog 不是 Java 并且没有对象,(尽管有一些变体),我将扔掉对象这个词,而是回答

我怎样才能在 Prolog 中做到这一点?

这是 Prolog 中乍一看似乎很难掌握的部分之一。在 Prolog 中,您无需将变量声明为具有类型,也无需创建构造方法来创建对象。在 Prolog 中,数据表示为术语,并且存在以大写字母开头的变量。因此,如果您想要在 Prolog 中保存 , 的值,row并且您只需使用变量,例如,和,并且可以将它们组合成一个复合术语,例如,并且如果您愿意,您还可以使用 a 来限定结构名字。columncostunitsRowColumnCostUnits(Row,Column,Cost,Units)cell(Row,Column,Cost,Units)


推荐阅读