Prolog - 递归地将数字附加到列表中

2023-12-21

我刚刚开始学习 Prolog,并且在理解递归概念时遇到了麻烦。现在,仅出于练习目的,我正在尝试编写一个程序,将 10 个数字附加到列表中,然后打印出该列表。

这个程序的自我强加的规则是列表必须在主谓词中“声明”(我不确定这对于 Prolog 来说是否是正确的词),它调用另一个谓词将数字附加到列表中。

这是我到目前为止所拥有的,我知道它不会起作用,因为我正在尝试重新定义List在结束时addToList谓词,这在该语言中是不允许的。

% Entry point that declares a list (`List`) to store the 10 numbers
printList(List) :-
    addToList(0, List),
    writeln(List).

% Base case - once we hit 11 we can stop adding numbers to the list
addToList(11, _).

% First case - this predicate makes adding the first number easier for me...
addToList(0, List) :-
    append([], [0], NewList),
    addToList(1, NewList),
    append([],  NewList, List). % This is valid, but List will just be [0] I think..

% Cases 1-10
addToList(Value, List) :-
    append(List, [Value], NewList),
    NextVal is Value+1,
    addToList(NextVal, NewList),
    append([], NewList, List). % This is INVALID since List is already defined

该程序将开始于:

printList(List).

有没有一种简单的方法可以更改我编写的损坏的程序,使其正常工作?我对如何获取存储在中的数字非常迷失List.


您正在按程序思考,在序言中您无法更改变量。您正在尝试自己构建列表。在序言风格中,您尝试声明所需列表的约束。如果nlist/2是一个给出 N 个数字列表的谓词,那么它的属性到底是什么?nlist(0, []). and if nlist(N, Xs) then nlist(N+1, [N+1 | Xs])。所以你只需编写这些并让 prolog 负责构建。

nlist(0, []).
nlist(N, [N | Xs]) :-
    N>0, N1 is N-1,
    nlist(N1, Xs).

如果您对递归调用的发生方式感到困惑,请尝试使用trace/0 or trace/1。您可以在以下跟踪中看到调用是如何完成的。您可以通过致电获取此信息trace(nlist).

?- nlist(3, X).
 T Call: nlist(3, _78)
 T Call: nlist(2, _902)
 T Call: nlist(1, _1464)
 T Call: nlist(0, _2026)
 T Exit: nlist(0, [])
 T Exit: nlist(1, [1])
 T Exit: nlist(2, [2, 1])
 T Exit: nlist(3, [3, 2, 1])
X = [3, 2, 1]

更程序化的代码如下

addToList(11, A, A).

% Cases 1-10
addToList(Value, List, NewList) :-
    Value < 11,  append(List, [Value], Temp),
    NextVal is Value+1,
    addToList(NextVal, Temp, NewList).

这给出了中间参数是累加器。当您达到 11 时,累加器就是答案。

?- addToList(1, [], X).
X = [1, 2, 3, 4, 5, 6, 7, 8, 9|...] 

?- addToList(5, [], X).
X = [5, 6, 7, 8, 9, 10] 

查看示例跟踪以及它们之间的差异nlist and addToList。尝试找出差异以及发生差异的原因。

?- addToList(7, [], X).
 T Call: addToList(7, [], _33565254)
 T Call: addToList(8, [7], _33565254)
 T Call: addToList(9, [7, 8], _33565254)
 T Call: addToList(10, [7, 8, 9], _33565254)
 T Call: addToList(11, [7, 8, 9, 10], _33565254)
 T Exit: addToList(11, [7, 8, 9, 10], [7, 8, 9, 10])
 T Exit: addToList(10, [7, 8, 9], [7, 8, 9, 10])
 T Exit: addToList(9, [7, 8], [7, 8, 9, 10])
 T Exit: addToList(8, [7], [7, 8, 9, 10])
 T Exit: addToList(7, [], [7, 8, 9, 10])
X = [7, 8, 9, 10] 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prolog - 递归地将数字附加到列表中 的相关文章

  • 如何按给定顺序对列表进行排序?

    我正在尝试执行以下操作 我有一个预定义的列表 用作给定列表上的 排序依据 my orderby car boat chicken cat dog mouse or my orderby car gt 0 boat gt 1 chicken
  • 为什么这个记忆器适用于递归函数?

    我不明白为什么下面的代码是这样的fib以线性而非指数时间运行 def memoize obj Memoization decorator from PythonDecoratorLibrary Ignores kwargs cache ob
  • 如何返回给定长度的所有列表元素?

    我正在尝试返回具有特定长度的单词 这是我到目前为止的代码 words是一个列表并且size是一个正整数 def by size words size for word in words if len word size 我不知道如何继续 b
  • 使用 contains 或循环列表之间有什么大的区别吗?

    性能方面 使用之间真的有很大区别吗 ArrayList contains o 与 foreach iterator LinkedList contains o 与 foreach iterator 当然 对于 foreach iterato
  • Python列表切片效率

    在下面的代码中 def listSum alist Get sum of numbers in a list recursively sum 0 if len alist 1 return alist 0 else return alist
  • Java 按日期作为字符串对列表 进行排序

    我有一个类型列表 我想按日期元素对该列表进行排序 我用谷歌搜索 看到了一些具有可比性的解决方案 但是是否有可能在不实现类中接口的情况下做到这一点 我的列表如下所示 列表 id 33 文本 test1 日期 06 02 15 id 81 文本
  • 从 XML 文档生成嵌套列表

    在 python 中工作 我的目标是解析我制作的 XML 文档并创建一个嵌套的列表列表 以便稍后访问它们并解析提要 XML 文档类似于以下代码片段
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • 使用 PHP 简单 DOM 解析器的递归

    由于某种原因 我在使用简单 DOM 解析器库时遇到了递归 我的 HTML 是这样的 div div class some div some text div div class field 1 misc1 a href Some text
  • C++ 递归变量

    我想我的问题真的很简单 但我现在尝试解决它几个小时 但我似乎不明白 我有一个 ast 树 用 boost library 创建 并通过递归迭代它 我将所有节点保存在 NodeDescriptions 列表中 其中包含实际节点的编号 实际节点
  • 如何访问对列表中对的每个元素?

    我有一个名为 对 的列表 pairs a 1 b 2 c 3 我可以通过以下方式访问元素 for x in pairs print x 其输出如下 a 1 b 2 c 3 但我想访问每对中的每个元素 就像在 c 中一样 如果我们使用pair
  • 比较通用列表和数组

    为什么 generic list 比 array 慢 通用列表比数组稍慢 但在大多数情况下您不会注意到 主要与稍微复杂的查找有关 据说 List 在幕后 使用数组 但不能保证以与数组相同的方式将节点保留在相邻内存中 然而 我早在 2005
  • 在 C# 中枚举时从 List 中删除项目的智能方法

    我有一个经典的案例 尝试从集合中删除一个项目 同时在循环中枚举它 List
  • “Java”“List”方法“size”如何工作?

    在Java中 有一个List接口和size 计算尺寸的方法List 当我打电话时List size 怎么算呢 是线性计数 还是确定计数后只返回值size 大小定义为列表中元素的数量 该实现未指定 size 成员函数如何操作 迭代成员 返回存
  • 在 Python 中使用列表理解来执行类似于 zip() 的操作?

    我是一名 Python 新手 我想做的事情之一就是围绕列表理解进行思考 我可以看到这是一个非常强大的功能 值得学习 cities Chicago Detroit Atlanta airports ORD DTW ATL print zip
  • Pandas DataFrame 中多列的映射方法

    我有一个 Pandas 数据框 其中的值是列表 import pandas as pd DF pd DataFrame X 1 5 1 2 Y 1 2 5 1 3 5 DF X Y 0 1 5 1 2 5 1 1 2 1 3 5 我想检查
  • Python 中的“Zip”列表字典

    我有一个列表字典 我想将它们合并到一个命名元组列表中 我想要第一个元组中所有列表的第一个元素 第二个元组中的第二个元素 依此类推 Example key1 1 2 3 key2 4 5 6 key3 7 8 9 我希望生成的列表如下所示 k
  • 列表列中的设置操作

    我正在尝试做集合运算在存储在列表列中的向量之间 例如this https stackoverflow com questions 38712196 text file to dataframe with a list column DT l
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 有没有办法查看 OSGi 应用程序中注册的服务?

    我有一个运行 Equinox 的 OSGi 应用程序 我想查看该应用程序提供的服务 我怎样才能做到这一点 从 gogo shell 类型 inspect cap service 这将显示所有捆绑包注册的所有服务 如果您想显示特定捆绑包的服务

随机推荐

  • 如何为异步等待调用创建包装器?

    据我所知 没有内置 或框架扩展 支持ConnectAsync AcceptAsync SendAsync ReceiveAsync等等 我将如何编写自己的包装器 该包装器将受到异步等待机制的支持 例如 我当前的代码处理ReceiveAsyn
  • Java 用 '(撇号/单引号)和 \(反斜杠)一起替换问题

    我好像遇到问题了我有一个查询字符串 其中的值可以包含单引号 这将破坏查询字符串 所以我试图做一个替换来改变 to 这是示例代码 This is it replace 其输出仍然是 This is it 它认为我只是在为引用做一个转义字符 所
  • 未能找到目标 Vuzix Corporation:Vuzix M300 SDK:23

    我正在尝试为 Vuzix M300 智能眼镜开发应用程序 我已经通过 Android SDK Manager 安装了 Vuzix SDK 我已遵循 Vuzix 文档中提到的所有步骤 我还将编译 SDK 版本设置为 Vuzix M300 SD
  • 你调用的对象是空的

    当我在 NUnit 中运行这个程序时 出现错误 你调用的对象是空的 虽然这不是原始程序 但我也遇到了类似的错误 任何帮助表示赞赏 异常发生于 driver Navigate GoToUrl http www yahoo com 程序 usi
  • 逐行将 .txt 读取到批处理变量中

    我有一个批处理脚本 可以将 ping 发送到某些 PC 可用的 PC 被写入文本文件中 因此每台 PC 都站在自己的行中 另一个批处理脚本将一些文件复制到 PC 目前它尝试复制到所有 PC 现在我想修改脚本 以便批处理读出文本文件并仅复制到
  • 图结构中拥有的指针

    在 Rust 社区的慷慨帮助下 我成功地获得了使用托管指针组装的拓扑数据结构的基础 这一切结合得相当好 总的来说我对 Rust 非常兴奋 然后我读了这个post http pcwalton github io blog 2013 06 02
  • reflog 过期并 gc prune 后推送到原点

    我使用以下命令删除了本地存储库中的一些无法访问和悬空的提交 git fsck unreachable dangling no reflogs git reflog expire expire now all git gc prune now
  • 如何使用react js在Fetch API中设置超时

    我在 React js 中使用 fetch post 方法 当向后端发送请求时 需要 7 分钟才能提供响应 然后前端会自动超时 你能帮我解决一下如何在 fetch 方法中设置 10 分钟的时间 让前端等待响应 并且只有当后端花费超过 10
  • 前缀/后缀增量运算符

    我想确保我正确理解按值传递与按引用传递 特别是 我正在查看增量的前缀 后缀版本 对象的运算符 假设我们有以下课程X class X private int i public X i 0 X operator i return this pr
  • 单选按钮在 Chrome 中显示不需要的白色背景。火狐浏览器没问题

    在 Google Chrome 中 单选按钮会在圆圈周围显示不需要的白色背景 这在 Firefox 中并未按预期显示 Please check these images 她是有问题的页面的直接链接 在 Firefox 和 Chrome 中检
  • 是否存在 setfable nthcdr 实现?

    我正在使用 clisp 我想知道是否有任何带有可设置版本的 nthcdr 的库可供我使用 你可以用以下方法解决它 let lst list 1 2 3 4 n 2 setf cdr nthcdr 1 n lst 5 6 7 l gt 1 2
  • 改装 400 错误请求

    这是我用于网络调用的函数 private void getSample Log d getSample OkHttpClient client new OkHttpClient HttpLoggingInterceptor intercep
  • 如何从批处理脚本检查Java安装?

    我需要编写一个批处理脚本来查找是否安装了Java 如果安装了 那么在什么路径下 我觉得它必须是类似这样的 for f j in java exe do set JAVA HOME 但我不明白 附 它必须与带有空格两个的路径一起使用 就像ja
  • Haskell主要函数

    module Main where qsort Ord a gt a gt a qsort qsort x xs qsort smaller x qsort larger where smaller a a lt xs a lt x lar
  • 使用 Android SIP 堆栈进行点对点 SIP 呼叫?

    我一直在寻找一种方法来设置 Android SIP 堆栈 以便能够以临时方式在同一网络上的两个设备之间建立 SIP 呼叫 即无需注册到 SIP 服务器 我无法让它工作 因为 SIP 演示包括服务器注册 如果没有此步骤 我无法让它拨打或接听电
  • python中的全局计数器线程安全吗?

    import threading import time counter 0 def increase name global counter i 0 while i lt 30 this for loop is for consuming
  • 具有固定参数值的路由的别名

    我有这条路线 Route get MyModel id MyController show 方法show 接受一个名为id我想设置一个别名 MyModel 1所以可以从 MyCustomURL 我已经尝试了一些组合 例如 Route get
  • 获取 powershell 显示驱动器上可以找到某个文件的所有路径

    我正在尝试构建一个函数 该函数将显示某个文件名所在的所有路径 该函数将采用一个参数 即文件名 结果要么是所有路径的列表 要么是一条消息说系统上没有这样的文件 我是 Powershell 新手 目前还没有掌握语法 我试过这个 Get Chil
  • 键盘不适用于 uiactionsheet 中的文本字段

    我在 uiactionsheet 中添加了 textfeld 作为 void showAction printf getting action ready n UIActionSheet asheet UIActionSheet alloc
  • Prolog - 递归地将数字附加到列表中

    我刚刚开始学习 Prolog 并且在理解递归概念时遇到了麻烦 现在 仅出于练习目的 我正在尝试编写一个程序 将 10 个数字附加到列表中 然后打印出该列表 这个程序的自我强加的规则是列表必须在主谓词中 声明 我不确定这对于 Prolog 来