arrays - 如何在prolog中访问二维数组以及如何循环其中的每个元素

标签 arrays matrix prolog

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

  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代码

那么我怎样才能把这个对象变成序言呢?

最佳答案

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

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

How to access two dimensional array in Prolog?

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

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

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

How do I loop each element and make every element +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]].

How can I make this object into Prolog?

由于标准 Prolog 不是 Java 并且没有对象(尽管有一些变体),所以我将扔掉“对象”一词并改为回答

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

这是 Prolog 中乍一看很难掌握的部分之一。在 Prolog 中,您不声明变量具有类型,也不创建构造函数方法来创建对象。在 Prolog 中,数据表示为 terms还有一些以大写字母开头的变量。因此,如果您希望 Prolog 中的某些内容可以保存行、列、成本和单位的值,您只需使用变量,例如RowColumnCostUnits,并且可以将它们组合成一个复合术语,例如(Row,Column,Cost,Units),如果需要,您还可以使用名称 cell(Row,Column,Cost,Units) 限定结构。

关于arrays - 如何在prolog中访问二维数组以及如何循环其中的每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55094480/

相关文章:

c++ - 为数组中的每个对象调用析构函数

list - 如何删除列表中的第一个元素

R矩阵行选择中的多个条件

prolog - 补图 - prolog

list - Prolog 错误参数

php - 将 MySQL 查询循环转换为 PHP 数组(表)

ruby-on-rails - 从字符串数组中删除数字

javascript - 仅显示数组中的一项

r - 使用回收创建矩阵

python - 计算一半对称 numpy 矩阵的更好方法?