我有一个像这样的数组:
[[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
答案 0 :(得分:1)
您的代码的问题之一是您还需要谓词的基本情况(终止递归所需的情况)。 您可以这样修复它:
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
。
答案 1 :(得分:0)
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]].