【问题标题】:Replacing elements in matrix in prolog在prolog中替换矩阵中的元素
【发布时间】:2021-10-27 23:07:08
【问题描述】:

我是 prolog 的新手,我正在尝试创建一个特定的矩阵。 我已经拥有的:

  • 一个用所有 0-s 填充的矩阵
  • 数字对列表,用于 expl。 [1-1, 2-3, 2-4]

我想要做的是将矩阵中由数字对指示的位置中的 0-s 替换为 1-s。我已经有一个谓词,给定矩阵和行号和列号,会从 0 切换到 1,但是在遍历对列表时我被卡住了。 我正在尝试这样做:

%replace(Mx, RowId, ColumnId, Value, ResultMx)
%generateMx(Mx, ListOfPairs, ResMx)
generateMx(_, [], _).
generateMx(Mx, [I-J|Tail], Res) :-
    generateMx(Mx, Tail, Res1),
    replace(Res1, I, J, 1, Res).

但由于某种原因,它给出了奇怪的结果。

我也试过了:

generateMx(Mx, [], Res) :- Res is Mx.
generateMx(Mx, [I-J|Tail], Res) :-
    replace(Mx, I, J, 1, Res1),
    (Tail == []) -> Res is Res1 ; generateMx(Res1, Tail, Res2).

为此我得到一个错误,但我至少看到它正在尝试将正确的结果矩阵与原样条件下的某个值进行比较。我猜它应该不会停止迭代?

有人能帮我弄清楚我的错误以及我应该怎么做吗?

【问题讨论】:

    标签: matrix prolog


    【解决方案1】:

    generateMx(_, [], _). 是错误的。如果您想将输入和输出限制为相同,则应明确说明:generateMx(X, [], X).generateMx(X, [], Y) :- X = Y.。两者是等价的,但第一个更惯用。

    通过在两个地方使用_,只要对列表为空,generateMx 就可以成功处理任何输入和任何输出。当它不应该成功时,它会成功。

    ?- generateMx([[0, 0], [0, 0]], [], [[1, 1], [1, 1]]).
    true 
    

    至于第二部分

    • 我不知道你的矩阵是如何表示的,但is/2 只能用于算术。它不是一个通用的相等运算符。你应该使用=
    • -> 优先级错误。如果你写A, B -> C; D,你实际上是指(A, B) -> C; D
    • 如果您正在检查一个空的Tail,第一个子句有点多余。您的第一个答案有更好的方法。
    generateMx(Mx, [I-J|Tail], Res) :-
        replace(Mx, I, J, 1, Res1),
        ( Tail == [] -> Res = Res1 ; generateMx(Res1, Tail, Res) ).
    

    【讨论】:

    • 谢谢,解决了!我很确定其他地方有问题,所以这对我学习很重要
    猜你喜欢
    • 2012-11-11
    • 2017-05-09
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多