从序言中的矩阵(列表列表)中提取列

Extract a column from a matrix (list of lists) in prolog

对于 extract_column([[1,2], [3, 4], [5,6]], 0, X). 这样的输入,我希望看到的结果是 [1,3,5]。我不确定我的基本情况是否正确或如何继续递归逻辑。

重点是获取表头(列表)的Ith元素,追加到结果列表R,递归应用该逻辑适用于大列表中的所有列表。

extract_column([], [R1]).
extract_column([H|T], I, [R]) :-
   extract_column([T], I, [R1]),
   nth0(I, [H], num1),
   append([R], num1, R1).

确实,基本情况不正确,而且没有必要使用append/3

  • 基本情况应定义 arity 3 的谓词(即,带有参数 MatrixIndexColumn ).
  • 要将元素 Y 添加到列表 Ys 的开头,只需写入 [Y|Ys].
  • 为了提高效率,最好使用尾递归(将递归调用移到子句的末尾)。

因此,一个可能的解决方案是:

extract_column([], _, []).
extract_column([X|Xs], I, [Y|Ys]) :-
    nth0(I, X, Y),
    extract_column(Xs, I, Ys).

示例:

?- extract_column( [[1,2], [3, 4], [5,6]], 0, Col).
Col = [1, 3, 5].

?- extract_column( [[1,2], [3, 4], [5,6]], I, Col).
I = 0,
Col = [1, 3, 5] ;
I = 1,
Col= [2, 4, 6].