我有一个像这样的数组:
[[0,2,_9492],[2,_9510,_9516],[_9528,_9534,_9540]]
我希望将所有未绑定(即具有随机值)的元素填充到-1
所需的结果
[[0,2,-1],[2,-1,-1],[-1,-1,-1]]
我尝试过的
fillArray([H|T],[H1|T1]):-fillRow(H,H1),fillArray(T,T1).
fillRow([H|_], _):-nonvar(H),fail.
fillRow([0|_], _).
fillRow([H|T],[-1|B]):-fillRow(T,B).
我得到的是false
发布于 2019-05-26 00:27:47
代码的一个问题是,您还需要谓词的基本情况(终止递归所需的情况)。您可以像这样修复它:
fillArray([],[]).
fillArray([H|T],[H1|T1]):-
fillRow(H,H1),
fillArray(T,T1).
fillRow([],[]).
fillRow([H|T],[H|T1]):-
nonvar(H),
fillRow(T,T1).
fillRow([H|T],[-1|T1]):-
var(H),
fillRow(T,T1).
?- L = [[0, 2, -1], [2, -1, -1], [-1, -1, -1]]
false
您可以添加一些剪切来删除选择点。这是一个基本的解决方案。您还可以使用更高级的谓词,如maplist/3
。
发布于 2019-05-27 09:12:21
在SWI-Prolog中使用lambda表达式
SWI-Prolog中的一个高级解决方案是:
set_unbound(Value, Matrix) :-
Lambda = {Value} / [X]>>(var(X) -> X=Value ; true),
maplist(maplist(Lambda), Matrix).
示例:
?- M = [[0,2,_],[2,_,_],[_,_,_]], set_unbound(-1, M).
Ma = [[0, 2, -1], [2, -1, -1], [-1, -1, -1]].
?- M = [[0,_],[_,2]], set_unbound(9, M).
M = [[0, 9], [9, 2]].
?- M = [[1,_],[_,3]], set_unbound(V, M).
M = [[1, V], [V, 3]].
https://stackoverflow.com/questions/56306531
复制相似问题