list - Prolog:使用 nth1/3 增加列表中的值
问题描述
我正在尝试实现一个递归 Prolog 谓词,当给定一个ResultList
包含Dim
元素的全 0 列表和另一个值高达 的列表时Dim
,它运行通过第二个列表并将 +1 增加到第 n 个元素ResultList
并返回 ResultList,到目前为止我有:
increment_list([],_).
increment_list([Element|Tail],ResultList):-
nth1(Element,ResultList,_ is _+1),
increment_list(Tail,ResultList).
所以例如
?-increment_list([1,2,4,3,4],[0,0,0,0]).
将返回:
[1,1,1,2]
我显然遇到的困难和困惑是如何增加值,是否可以在不定义额外谓词或具有单例变量的情况下做到这一点?
解决方案
在 prolog 中,您不能修改列表中的值。你可以这样做:
increment_list([],L,L).
increment_list([H|T],LT,LO):-
increment_nth(H,1,LT,LT1),
increment_list(T,LT1,LO).
increment_nth(_,_,[],[]).
increment_nth(I,I,[H1|T1],[H2|T1]):-!,
succ(H1,H2).
increment_nth(I,C,[H|T1],[H|T2]):-
C1 is C+1,
increment_nth(I,C1,T1,T2).
基本上是一个嵌套循环。在每个循环中,您都会创建一个新列表,该列表与之前的列表相同,只是您考虑的索引处的值是之前的索引加一。
?- increment_list([1,2,4,3,4,1],[0,0,0,0],LO).
LO = [2, 1, 1, 2]
编辑
感谢 Daniel Lyons,我修改了谓词。
推荐阅读
- hide - 我需要帮助将我的页面/帖子的帖子/页面标题移动到我的特色图片下方,或完全隐藏它
- bash - 使用 Rsync 在 MAC 和 PC 之间同步文件时,是否需要考虑使用 --iconv 的字符代码差异?
- java - JButton 未显示在滚动窗格中
- python-3.x - 我收到 FileNotFoundError: [Errno 2] No such file or directory: 'dna.txt' on Pycharm?我在哪里放置文件来阅读?
- javascript - 如何为多个生成的元素设置 on.click?
- python-3.x - 处理没有''的字符串输入
- javascript - 使用 html 的 url 到 url 重定向
- java - 如何在正则表达式模式中包含某些字符?
- android - 是否可以使用 navigator.pop 刷新或重新加载页面...比如第 1(nav.push=>2)页面到第 2 页,然后从第 2(nav.pop,值)返回到第 1 页?
- javascript - 在 HTML 的搜索栏中创建一个下拉列表