B-Prolog 中带有累加器的嵌套循环

2024-03-04

B-Prolog 具有逻辑循环。例如,我们可以这样计算 [1,2,3] 的和:

test1 :-
    foreach(A in 1..3, [], ac(Sa, 0), (
            Sa^1 is Sa^0 + A
        )),
    writeln(sa(Sa)).

?- test1.
test1.
sa(6)
yes

但是当我尝试使用累加器进行两个嵌套循环时,出现错误:

test2 :-
    foreach(_A in 1..3, [Sb], ac(Sa, 0), (
            foreach(B in 1..3, [], ac(Sb, 0), (
                    Sb^1 is Sb^0 + B
                )),
            writeln(sb(Sb)),
            Sa^1 is Sa^0 + Sb
        )),
     writeln(sa(Sa)). 

?- test2.
test2.
*** error(invalid_argument,(+)/2)

另一种变体,不将 Sb 包含在外循环的局部变量列表中:

test3 :-
    foreach(_A in 1..3, [], ac(Sa, 0), (
            foreach(B in 1..3, [], ac(Sb, 0), (
                    Sb^1 is Sb^0 + B
                )),
            writeln(sb(Sb)),
            Sa^1 is Sa^0 + Sb
        )),
    writeln(sa(Sa)). 

?- test3.
test3.
sb(6)
*** error(invalid_argument,(+)/2)

B-Prolog 中是否可以使用累加器进行嵌套循环?

我的 B-Prolog 版本是 8.0#1。


您的程序编译后可以正确运行。

| ?- cl(谢尔盖)

Compiling::sergey.pl
** Warning: Variable 'Sb' is treated as global in foreach (17-25).
** Warning: Variable 'Sb' is treated as global in list_comprehension (36-38).
compiled in 0 milliseconds
loading...

yes
| ?- test1
sa(6)

yes
| ?- test2
sb(6)  
sb(6)
sb(6)
sa(18)

yes
| ?- test3
sb(6)
sb(6)
sb(6)
sa(18)

翻译人员一定有问题。这个累加器的东西非常丑陋,我从不使用它。在 B-Prolog 的后继者 Picat 中,您可以使用 := 来“更新”变量。

    test1 =>
        Sa = 0,
        foreach(A in 1..3)
            Sa := Sa+A
        end,
        writeln($sa(Sa)).

    test2 =>
        Sa = 0,
        foreach(_A in 1..3)
            Sb := 0,
            foreach(B in 1..3)
               Sb := Sb+B
            end,
            writeln($sb(Sb)),
            Sa := Sa+Sb
        end,
        writeln($sa(Sa)). 

更好的方法是使用列表理解。

    test1 =>
        Sa = sum([A : A in 1..3]),
        writeln($sa(Sa)).

    test2 =>
        Sa = sum([Sb : _A in 1..3, Sb=sum([B : B in 1..3])]),
        writeln($sa(Sa)). 

编译器将求和编译成使用“:=”的程序。由于列表实际上并未构建,因此没有开销。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

B-Prolog 中带有累加器的嵌套循环 的相关文章

  • 如何声明两个列表具有相同的长度?

    我需要知道如何比较 Prolog 中两个列表的长度 这是我到目前为止所拥有的 sum N1 N2 checklength N1 N2 checklength N1 N2 L1 is length N1 What L2 is length N
  • 在 Prolog 中编辑 Eliza 聊天机器人

    我一直在努力尝试在 Prolog 中编辑 Eliza 聊天机器人 每次我尝试编辑某些内容时 都会出现新的错误 它是否受到任何形式的编辑保护 我使用 SWI prolog 编辑器进行编辑 问题是我试图在没有完全理解代码的情况下最小化代码 我正
  • Prolog,如何在 write() 中显示多个输出

    go match Mn Fn write Matching Result nl write Mn write match with write Fn match Mn1 Fn1 person may female 25 blue perso
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • Prolog 追加与剪切运算符

    当我们使用append和cut操作符时会出现什么问题 append2 L L append2 H T L H TL append2 T L TL 我尝试了几种不同的输入 但总是成功 append2 1 2 5 L L 1 2 5 appen
  • Prolog 中的聊天机器人

    我一直在尝试在序言中创建一个聊天机器人 作为作业 到目前为止 我已经在 pl 文件中创建了一个数据库 并且列出了很多可能的对话 我知道序言是这样工作的 例如如果我们有 Chatbot good 然后我们输入 Chatbot good 它会回
  • 如何在 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
  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • Prolog 罗马数字(属性语法)

    我正在做一项作业prolog questions tagged prolog扫描数字列表并应返回该列表是否是有效的罗马数字以及数字的十进制值 前任 1 roman N I N 1 true 2 当我运行我认为应该工作的程序时 十进制值总是正
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • Prolog中如何选择bagof、setof和findall

    如何在 bagof setof 和 findall 之间做出选择 有什么重要的区别吗 哪个最常用 哪个最安全 感谢您的评论 回答 我检查了SWI Prolog 手册页findall 3 http www swi prolog org pld
  • 如何在 ISO Prolog 中定义(和命名)相应的安全术语比较谓词?

    标准术语顺序 ISO IEC 13211 1 7 2 术语顺序 针对所有术语 包括变量 进行定义 虽然这有很好的用途 想想实施setof 3 这使得 8 4 术语比较中内置函数的许多其他干净且合乎逻辑的使用成为声明式噩梦 到处都是 imps
  • 使用 prolog 添加另外两次出现

    我有一个清单 a b a a a c c 我需要为每个元素添加两次以上的出现 最终结果应该是这样的 a a a b b b a a a a a c c c c 如果列表中有一个与下一个项目相同的项目 那么它会继续下去 直到出现一个新项目 当

随机推荐

  • Spring 3.1实例化bean时出错

    我有以下课程 public abstract class AbstractBusinessModule public class MS3BusinessModule extends AbstractBusinessModule public
  • 在 Woocommerce 中添加运送区域的州而不是邮政编码

    我有一个 woocommerce 网站 默认情况下 在 woocommerce 中 我可以通过邮政编码限制运输区域 但是 如何在送货区域中添加我所在国家 地区的州 以便客户可以通过结账页面中的 下拉菜单 选择他们居住的州 而不是输入邮政编码
  • Heroku 给出 500 错误,信息很少 + 内部服务器错误

    Heroku 在页面上显示此消息 internal server error 此错误显示在控制台中 GET 500内部服务器错误 检查 Heroku 应用程序的日志以查看更多详细信息 您可以使用流式传输日志Heroku CLI https
  • 远程 logcat - Android Studio

    是否可以看到远程设备上的应用程序的logcat 简而言之 是否可以远程logcat 我向客户端发送了一个应用程序 这在您的设备中给出了错误 我使用同一版本的模拟器进行了测试 但仅发生了该错误 是否可以查看远程应用程序的 logcat 设备
  • Brushes.White 减慢了图形演示速度

    下面是 Conway 的生命游戏在 WPF 中的 非常幼稚的 实现 这只是一个演示 xaml
  • 这种方法名称/局部变量混合会发生什么?

    我在一些代码中发现了一个执行以下操作的方法 def method1 method1 1 2 2 3 4 5 5 return method1 uniq end ruby 如何处理这个问题 我知道这是错误的代码 但是 ruby 如何知道如何处
  • 从文件加载公钥数据

    在我的应用程序中 我生成一个公钥 私钥对并将它们存储在磁盘上以供以后使用 加载并重新初始化私钥工作正常 但对于私钥 我得到一个未知的 KeySpec 类型 java security spec PKCS8EncodedKeySpec 我不知
  • Jquery / Javascript - 添加迄今为止的年份变量

    我有一个小麻烦 如果能得到一些帮助就太好了 我正在创建一个小表单 我想将当前日期格式化 dd mm yyyy 并从下拉框中添加年份变量以创建最终到期日期 唯一的麻烦是我不知道如何将开始日期解析为日期变量以完成计算 任何想法或帮助将不胜感激
  • 在 Delphi 中读取/解析非类型二进制文件的最佳方法

    我想知道解析非类型二进制文件的最佳方法是什么 例如 EBML 文件 http ebml sourceforge net EBML 基本上是一个二进制 xml 文件 它基本上可以存储任何内容 但目前它的主要用途是 MKV 视频文件 matro
  • 从数据库sqlite获取信息

    如何从数据库中获取信息 我想执行这一行 String nom db execSQL select name from person where id id 任何人都可以纠正我这一行以从表中获取人名吗 如果您的 id 是整数数据类型 请尝试此
  • 检测设备是否支持通话?

    下面的代码可以可靠地用来确定设备是否支持通话吗 我担心的是 如果苹果将 iphone 字符串更改为其他内容 假设他们决定拥有 iphone 3g iphone 4 等 UIDevice currentDevice model isEqual
  • Xamarin.forms 在 web 视图中显示 PDF 不起作用

    我从我的服务器下载 pdf 流 在我的应用程序中 我将 bytearray 作为 pdf 保存到本地文件夹中 但是当我在网络视图中打开它时 它只显示一个白色页面 我按照这个例子 https developer xamarin com rec
  • java.lang.illegalstateException数据库未打开android

    当我尝试插入数据库日志时 猫显示如下错误java lang illegalstateexception database not open android 但我已经使用打开数据库 db SQLiteDatabase openDatabase
  • Rails Admin 与 Active Admin:Rails Admin 生成工具[重复]

    这个问题在这里已经有答案了 可能的重复 Rails Admin 与 ActiveAdmin https stackoverflow com questions 6542075 rails admin vs activeadmin 我知道已经
  • Laravel:路由中间件和策略之间的区别

    使用 Laravel 开发应用程序我意识到可以做什么Policy完全可以用Middleware 假设我想阻止用户更新路线 如果他 她不是信息的所有者 我可以轻松地从路线中进行检查 并且可以从策略中执行相同的操作 所以我的问题是为什么我应该使
  • 我如何使用 Passport-local.js 存储其他表单字段

    我正在研究 node passport js 身份验证 我制作了一个简单的登录 注册应用程序 它工作正常 但是它只存储用户名和密码 如何通过具有工作登录护照身份验证的 Signup html 页面将其他表单字段 例如电话号码 电子邮件 爱好
  • 检查后台限制数据是否开启?

    我有一个在主线程上运行而不是在后台运行的服务 在服务中 我正在通过广播接收器检查网络连接 当我启用限制数据已启用在 设置 中 广播接收器可以很好地捕捉意图 但我的应用程序已禁用互联网连接 移动数据 尽管它在我的设备上 我见过这个问题 htt
  • 如何测试 Spark RDD

    我不确定我们是否可以在 Spark 中测试 RDD 我发现一篇文章说模拟 RDD 不是一个好主意 是否有其他方法或最佳实践来测试 RDD 感谢您提出这个悬而未决的问题 出于某种原因 当谈到 Spark 时 每个人都过于专注于分析 以至于忘记
  • 此信封实现是否正确使用 C++11 原子?

    我编写了一个简单的 信封 类 以确保我正确理解 C 11 原子语义 我有一个标头和一个有效负载 编写器清除标头 填充有效负载 然后用递增的整数填充标头 这个想法是 读取器然后可以读取标头 memcpy 出有效负载 再次读取标头 如果标头相同
  • B-Prolog 中带有累加器的嵌套循环

    B Prolog 具有逻辑循环 例如 我们可以这样计算 1 2 3 的和 test1 foreach A in 1 3 ac Sa 0 Sa 1 is Sa 0 A writeln sa Sa test1 test1 sa 6 yes 但是