【发布时间】:2014-11-04 04:15:25
【问题描述】:
我开发了一个谓词,它用Value 替换列表List 的索引Index 的值,并创建一个新的更新列表NewList。
%replace(List,Index,Value,NewList)
replace([_|T], 0, X, [X|T]).
replace([H|T], I, X, [H|R]):-
I > -1,
NI is I-1,
replace(T, NI, X, R), !.
replace(L, _, _, L).
谓词在常规列表上工作正常,但我想让它在列表列表上工作,我有点卡住了。
subs([]).
subs([Head|Tail], Index) :-
replace((Head), Index, 'r', Board2),
printRow(Board2),
subs(Tail).
原名单:
[ [ 0 , 1 , 2 , 3 , 4 ] ,
[ 5 , 6 , 7 , 8 , 9 ] ,
[ 10 , 11 , 12 , 13 , 14 ] ,
[ 15 , 16 , 17 , 18 , 19 ] ,
[ 20 , 21 , 22 , 23 , 23 ]
]
输出:
[ [ 0 , r , 2 , 3 , 4 ] ,
[ 5 , r , 7 , 8 , 9 ] ,
[ 10 , r , 12 , 13 , 14 ] ,
[ 15 , r , 17 , 18 , 19 ] ,
[ 20 , r , 22 , 23 , 23 ]
]
发生这种情况的原因很明显,因为它将每个子列表上的值替换为Index = 1。
为了解决这个问题,我考虑过实现一个计数器。通过每次迭代将索引增加 5(每个子列表的大小),谓词现在应该输出以下(所需的)列表:
所需的输出:
[ [ 0 , r , 2 , 3 , 4 ] ,
[ 5 , 6 , 7 , 8 , 9 ] ,
[ 10 , 11 , 12 , 13 , 14 ] ,
[ 15 , 16 , 17 , 18 , 19 ] ,
[ 20 , 21 , 22 , 23 , 23 ]
]
问题在于如何实现这个计数器。代码应如下所示,但我遗漏了一些内容:
subs([]).
subs([Head|Tail], Index) :-
replace((Head), Index, 'r', Board2),
printRow(Board2),
Index is Index + 5
subs(Tail, Index).
输出: subs(<Original List>, 7).
0 1 2 3 4
谁能给我一些关于如何实现它的帮助?
【问题讨论】:
-
我有点困惑。您究竟希望
subs在列表列表中做什么?你现在有两个subs子句。一个接受一个参数 (subs([]).),另一个接受两个参数 (subs([Head|Tail], Index) :-...)。当L是一个列表时,请准确解释subs(L, Index)的含义。 -
它应该替换列表列表的Index = 'Index'的元素。虽然它会替换董事会的每个子列表。
标签: prolog