替换列表列表中的元素 PROLOG

2023-12-10

我开发了一个谓词来替换索引的值Index一个列表的List with Value并创建一个新的更新列表NewList.

%replace(List,Index,Value,NewList)

replace([_|T], 0, X, [X|T]).
replace([H|T], I, X, [H|R]):-
        I > -1, 
        NI is I-1,
        replace(T, NI, X, R), !.
replace(L, _, _, L).

该谓词在常规列表上工作得很好,但我想让它在列表列表上工作,但我有点陷入了一小步。

subs([]).
subs([Head|Tail], Index) :-
        replace((Head), Index, 'r', Board2),
        printRow(Board2),
        subs(Tail).

原名单:

[ [  0 ,  1 ,  2 ,  3 ,  4 ] ,
  [  5 ,  6 ,  7 ,  8 ,  9 ] ,
  [ 10 , 11 , 12 , 13 , 14 ] ,  
  [ 15 , 16 , 17 , 18 , 19 ] ,  
  [ 20 , 21 , 22 , 23 , 23 ]
]

Output:

[ [  0 , r ,  2 ,  3 ,  4 ] ,  
  [  5 , r ,  7 ,  8 ,  9 ] ,  
  [ 10 , r , 12 , 13 , 14 ] ,  
  [ 15 , r , 17 , 18 , 19 ] ,  
  [ 20 , r , 22 , 23 , 23 ]
]

值得注意的是为什么会发生这种情况,因为它将值替换为Index = 1在每个子列表上。 为了解决这个问题,我考虑实施一个计数器。通过每次迭代将索引增加 5(每个子列表的大小),谓词现在应该输出以下(所需的)列表:

期望的输出:

[ [  0 ,  r ,  2 ,  3 ,  4 ] ,
  [  5 ,  6 ,  7 ,  8 ,  9 ] ,
  [ 10 , 11 , 12 , 13 , 14 ] ,  
  [ 15 , 16 , 17 , 18 , 19 ] ,
  [ 20 , 21 , 22 , 23 , 23 ]
]

问题在于如何实现该计数器。代码应该如下所示,但我遗漏了一些东西:

subs([]).
subs([Head|Tail], Index) :-
        replace((Head), Index, 'r', Board2),
        printRow(Board2),
        Index is Index + 5
        subs(Tail, Index).

Output: subs(<Original List>, 7).

0  1  2  3  4

谁能给我一些关于如何实施它的帮助?


你的问题描述有点不清楚。

从您的示例来看,您似乎希望将列表列表本质上视为二维数组,并替换该数组中的单个单元格。如果是这样,这是一种方法(可能不是最佳方法):

%
% replace a single cell in a list-of-lists
% - the source list-of-lists is L
% - The cell to be replaced is indicated with a row offset (X)
%   and a column offset within the row (Y)
% - The replacement value is Z
% - the transformed list-of-lists (result) is R
%
replace( L , X , Y , Z , R ) :-
  append(RowPfx,[Row|RowSfx],L),     % decompose the list-of-lists into a prefix, a list and a suffix
  length(RowPfx,X) ,                 % check the prefix length: do we have the desired list?
  append(ColPfx,[_|ColSfx],Row) ,    % decompose that row into a prefix, a column and a suffix
  length(ColPfx,Y) ,                 % check the prefix length: do we have the desired column?
  append(ColPfx,[Z|ColSfx],RowNew) , % if so, replace the column with its new value
  append(RowPfx,[RowNew|RowSfx],R)   % and assemble the transformed list-of-lists
  .

另一种方式(可能更优化):

replace( [L|Ls] , 0 , Y , Z , [R|Ls] ) :- % once we find the desired row,
  replace_column(L,Y,Z,R)                 % - we replace specified column, and we're done.
  .                                       %
replace( [L|Ls] , X , Y , Z , [L|Rs] ) :- % if we haven't found the desired row yet
  X > 0 ,                                 % - and the row offset is positive,
  X1 is X-1 ,                             % - we decrement the row offset
  replace( Ls , X1 , Y , Z , Rs )         % - and recurse down
  .                                       %

replace_column( [_|Cs] , 0 , Z , [Z|Cs] ) .  % once we find the specified offset, just make the substitution and finish up.
replace_column( [C|Cs] , Y , Z , [C|Rs] ) :- % otherwise,
  Y > 0 ,                                    % - assuming that the column offset is positive,
  Y1 is Y-1 ,                                % - we decrement it
  replace_column( Cs , Y1 , Z , Rs )         % - and recurse down.
  .                                          %
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

替换列表列表中的元素 PROLOG 的相关文章

  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 如何在 GNU Prolog 中使用“long int”?

    所以基本上看来 GNU Prolog 在我的 32 位 x86 Linux 上使用 28 位整数 下面的代码无法编译 foo A A0 is 0xdeadbeef A1 is A0 gt gt 8 A2 is A0 gt gt 16 A3
  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • Prolog 管线任务

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N
  • 以系统的方式报告 Prolog 中查询失败的“原因”

    我正在 Prolog 中寻找一种方法 模式或内置功能 我可以用它来返回why一组谓词失败 至少就数据库中的谓词而言 当用户在系统中提出查询时 我试图能够说的不仅仅是 那是错误的 例如 假设我有两个谓词 blue 1如果某物是蓝色的 则为真
  • 斜线(/)在序言中做什么?

    我有这个代码 set value X Value X T X Value T set value X Value Y V T Y V NewT X Y set value X Value T NewT set value X Value X
  • Prolog:子句在源文件中不在一起

    我有这段代码 Family tree female pen male tom male bob female liz female pat female ann male jim parent pam bob parent tom bob
  • Prolog家谱

    我做到了 但没有显示答案 当我询问兄弟姐妹 叔叔 阿姨时 这是我写的 有什么问题吗 uncle X Y male X sibling X Z parent Z Y uncle X Y male X spouse X W sibling W
  • 通过递归扩展 Prolog 目标?

    我 最终 实现了一些目标 这些目标将根据开始由 开始之后 and duration 然而 计划目标仅接受规定数量的任务 我想扩展计划目标的功能以接受单个列表并在计划时迭代该列表 不幸的是 我认为这将需要与can run and 冲突目标如下
  • 如何让 Prolog 解释你的结果超出真实的陈述

    我有以下事实和规则 flight sea msp flight msp jfk route A B flight A B route B A flight A B route A C flight A B flight B C 当查询rou
  • Prolog - 通过演绎减少知识库

    我需要创建一个规则来搜索与 my rule 匹配的事实 这些事实将用于改变知识库 my rule Conclusion Premise 我有这个知识库可以开始 dynamic is 2 is m1 house is m1 thing is
  • Prolog 列表列表获取所有元素

    我有一个列表列表 decide 1 2 3 2 3 6 4 K 我想按 返回所有可能的解决方案 规则是首先返回其列表大小为 1 的值 然后我想返回其大小大于1的值 size 0 size Xs L size Xs N L is N 1 he
  • 查找列表中的最大值 - Prolog

    我刚刚接触 Prolog 并尝试编写一个谓词来查找整数列表的最大值 我需要写一个从头开始比较的内容 另一个从最后开始比较的内容 到目前为止 我有 max2 R max2 X Xs R X gt R max2 Xs X max2 X Xs R

随机推荐

  • 需要获取字符串中第二个破折号之后的所有内容吗?

    我有如下的字符串值 string str1 123 456 test string str1 123 456 test test string str1 123 REQ456 test string str1 123 REQ456 test
  • Scala:列表[Future]到Future[List],忽略失败的未来

    我正在寻找一种将任意长度的 Future 列表转换为 Future of 列表的方法 我正在使用 Playframework 所以最终我真正想要的是Future Result 但为了让事情变得更简单 我们只是说Future List Int
  • Java 十进制格式 - 与给定的精度一样

    我正在与DecimalFormat 我希望能够以给定的精度读取和写入小数 我正在转换为BigDecimal 本质上 我想要一个DecimalFormat它强制执行以下模式 d d 即 至少一位数字 然后可选地 小数点分隔符后跟至少一位数字
  • 在 WPF 中填充数字显示

    我有一个非常简单的位置读数 它只是一个应用了样式的 TextBlock 在那种样式中 我只是这样设置 还有比这更多的属性 但为了简洁我把它们去掉了 现在 我有一个使用这种样式的显示器 它将显示 0 0 到 30000 0 之间的数字 问题是
  • 如何让 VLC 因预取错误而关闭?

    Python 2 7 lib vlc 不断打印 00000000081257d0 prefetch stream error unimplemented query 264 in control每当有新歌响起时 p play 导致了这个问题
  • 使用自修改代码观察 x86 上的陈旧指令获取

    我被告知并从英特尔手册中读到 可以将指令写入内存 但指令预取队列已经获取了过时的指令并将执行这些旧指令 我未能成功观察到这种行为 我的方法如下 英特尔软件开发手册第 11 6 节指出 对当前缓存在处理器中的代码段中的内存位置进行写入会导致关
  • 如何在 Neo4j 中使用 SSL 证书代替自签名证书(或 Snakeoil.cert)

    对于生产 Neo4j 服务器 我需要使用非自签名的 SSL 证书 我将在下面的回复中发布经验教训 sudo vi etc neo4j neo4j server properties uncomment org neo4j server we
  • MySql 嵌套 SP 会成为瓶颈吗?

    我们有这个 MySQL SP 它调用嵌套 SP 看起来它在负载下表现不佳 该 SP 在负载下可能会变慢 因为它调用嵌套 SP 并使用临时表将数据传递到主 SP DELIMITER drop procedure if exists GeoAr
  • SWT 浏览器无法运行?

    我在使用 SWT 浏览器组件时遇到了一些问题 我正在运行 Ubuntu 11 04 AMD64 和 Eclipse 3 7 以及 Sun 的 Java SE 1 6 我的问题是我的浏览器无法初始化 当我使用 SWT NONE 标志时 出现错
  • Symfony2 表单和 Doctrine2 - 更新指定实体中的外键失败

    我有个人资料和研究 一个人可以完成多项学业 表单正确呈现 有一个按钮 添加新研究 使用 jQuery 我添加了另一个基于数据原型的子表单 效果很好 当我提交带有新子表单的此类表单时 出现数据库错误 Integrity constraint
  • 如何选择最佳的自动化工具与硒的组合[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 这可能是基于意见的问题 但我对选择自动化工具组合感到非常困惑 到目前为止 我一直在使用 Selenium webdriver maven 和 Java 来构建自动化框架 这看起来完全工作正
  • 如何在谷歌应用程序脚本中的表单项中获取图像

    我有多个多项选择题和其中包含图像的复选框 我正在尝试将所有问题编译成一个文档文件 如何获取问题中的图像 它们不在单独的图像项中 https docs google com forms d 1qdqNcaaiKxOoi4IiNc 3xcr1X
  • MySQL - 使用触发器复制表

    我正在尝试复制一个表with触发器 我知道我以前这样做过 只是不记得我是如何做到的以及在哪里学会了如何做到这一点 我试过了CREATE TABLE newname LIKE oldname and CREATE TABLE newname
  • 找出哪个类调用了另一个类中的方法

    PHP 有没有办法找出哪个对象调用了另一个对象中的哪个方法 Exmaple class Foo public function construct bar new Bar bar gt test class Bar public funct
  • 使用 Apache FOP 添加 PDF 可填写表单 (acrofield)

    我正在尝试将可填写的表单 以便最终用户可以使用 acrobat reader 将信息插入其中 然后保存 添加到我使用 Apache FOP 生成的 PDF 中 如果可能的话 我似乎找不到任何有关如何完成此操作的信息 Google 没有提供太
  • android 改造将数组发送为 x-www-form-urlencoded

    我正在使用 Retrofit 作为我的网络库 并且我想发送一个 JSON 数组作为x www form urlencoded 但我不知道该怎么做 这是我的请求 API POST book FormUrlEncoded Call
  • 表达式中的变量赋值如何工作?

    这是我以前见过的做法 但并不常见 在对值本身进行求值的同时将变量分配给一个值 或者是对表达式本身进行求值 例子 Outputs The value is 1 value 1 if var value echo The value is va
  • Ext.JSON.decode():您正在尝试解码无效的 JSON 字符串

    我对此很陌生 两周以来一直在尝试解决我的问题 现在希望您能提供帮助 我的 JSON 输出似乎无效 但我不确定我的问题是来自 PHP 还是 extjs 脚本 我有一个组合框 当我单击它时 它应该显示一个选项列表 该列表基本上来自 Sql 表
  • 如何在 Scala 中将 CSV 列读入向量

    我有一个 CSV 文件 我的 CSV 文件 我想创建一个这样的地图 A gt Vector 10 75 10 75 10 47 B gt Vector 164 56 164 99 160 98 C gt Vector 7 1 7 4 9 4
  • 替换列表列表中的元素 PROLOG

    我开发了一个谓词来替换索引的值Index一个列表的List with Value并创建一个新的更新列表NewList replace List Index Value NewList replace T 0 X X T replace H