用Prolog中的给定值填充2D矩阵

时间:2019-05-25 16:06:22

标签: 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|T],[-1|B]):-fillRow(T,B).

我得到的是false

2 个答案:

答案 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中使用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]].