【问题标题】:Prolog print array failsProlog 打印数组失败
【发布时间】:2013-11-23 16:15:54
【问题描述】:

我是 Prolog 的新手,遇到以下问题:

我表示一个二维数组如下:

[[ROW1], [ROW2],..]

我写了一个谓词打印出二维数组如下:

valueAt(1, [BEGIN | _], BEGIN).
valueAt(POSITION, [FIRST | REST], VAL) :- NPOS is POSITION - 1,
                                          valueAt(NPOS, REST, VAL). 

printRowValues([], _).
printRowValues(ROW, STARTIDX) :- valueAt(STARTIDX, ROW, VALUE),
                                 print(VALUE), print(' '),
                                 NEXTIDX is STARTIDX + 1,
                                 printRowValues(ROW, NEXTIDX).

printContainer(CONTAINER) :- printRows(CONTAINER, 1).

printRows([]).
printRows([ROW | REST]) :- printRowValues(ROW, 1),
                           printRows(REST).

这会打印第一行,然后给出 false。我真的没有在这里看到我的问题..

PS:函数 printRowValues 使用索引是因为我用它来测试我的 valueAt 函数。我知道我可以更简单地编写 printrow 函数(见下文),但这不是重点。我在这里缺少一些 Prolog 知识。

更简单的版本,使整个事情工作:

printRow([]).
printRow([HEAD | REST]) :- print(HEAD), print(' '),
                           printRow(REST).  

示例查询:

[debug] [1] 41 ?- printRows([[1, 1, 1], [2, 2, 2], [3, 3, 3]]).
1 1 1 
false

【问题讨论】:

    标签: prolog


    【解决方案1】:

    您的实现的问题是永远不会到达printRowValues 的第一个(基本)子句,因为第二个子句不会减少列表以使其更短。它总是传递同一个列表,因此 Prolog 解释器永远不会到达基本子句。

    您可以通过将基本子句更改为使用len/1 谓词来解决此问题:

    printRowValues(List, N) :- N is 1 + len(List).
    

    这将在 N 达到列表长度加一时终止(您需要加一,因为您的索引是基于一的)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2010-10-02
      • 2014-07-01
      • 2012-10-31
      • 1970-01-01
      • 2016-08-17
      相关资源
      最近更新 更多