用Prolog中的给定值填充二维矩阵

用Prolog中的给定值填充二维矩阵,prolog,Prolog,我有这样一个数组: [[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

我有这样一个数组:

[[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

代码的一个问题是您还需要谓词的基本情况(终止递归所需的情况)。 您可以这样修复它:

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

代码的一个问题是您还需要谓词的基本情况(终止递归所需的情况)。 您可以这样修复它:

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
可以添加一些剪切以删除选择点。这是一个基本的解决办法。您还可以使用更高级的谓词,例如在SWI Prolog中使用lambda表达式的
maplist/3

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]].
在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]].