从序言中的矩阵(列表列表)中提取列
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 的谓词(即,带有参数 Matrix、Index、Column ).
- 要将元素
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].
对于 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 的谓词(即,带有参数 Matrix、Index、Column ).
- 要将元素
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].