首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Prolog中用给定值填充2D矩阵

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

Stack Overflow用户
提问于 2019-05-26 00:06:22
回答 2查看 105关注 0票数 0

我有一个像这样的数组:

代码语言:javascript
复制
[[0,2,_9492],[2,_9510,_9516],[_9528,_9534,_9540]]

我希望将所有未绑定(即具有随机值)的元素填充到-1

所需的结果

代码语言:javascript
复制
[[0,2,-1],[2,-1,-1],[-1,-1,-1]]

我尝试过的

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-26 00:27:47

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-05-27 09:12:21

在SWI-Prolog中使用lambda表达式

SWI-Prolog中的一个高级解决方案是:

代码语言:javascript
复制
set_unbound(Value, Matrix) :-
    Lambda = {Value} / [X]>>(var(X) -> X=Value ; true),
    maplist(maplist(Lambda), Matrix).

示例:

代码语言:javascript
复制
?- 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]].
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56306531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档