Prolog 将分钟转换为小时

2023-11-29

这是我创建的代码。

mins_to_hours(In, H, M):-
  In < 60,
  H = 0,
  M is In.
mins_to_hours(In, H, M):-
  In >= 60,
  H is H1+1,
  In1 is In-60,
  mins_to_hours(In1, H1, M).

当分钟数小于 60 时,效果很好,例如

?- mins_to_hours(20,H,M).
H = 0,
M = 20 ;
false.

然而,当尝试运行超过 60 分钟时

?- mins_to_hours(80,H,M).

它输出一个异常

ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:    [9] _3198 is _3204+1
ERROR:    [8] mins_to_hours(80,_3232,_3234) at c:/.../xyz.pl:11
ERROR:    [7] <user>

在该位置H is H1+1,.

任何想法如何解决这一问题?


这是您的代码的更正版本。

mins_to_hours(Minutes_in, H, M) :-
    mins_to_hours_helper(0, Minutes_in, H, M).

mins_to_hours_helper(H0, M0, H0, M0):-
  M0 < 60, !.
mins_to_hours_helper(H0, M0, H, M):-
  M0 >= 60,
  H1 is H0+1,
  M1 is M0-60,
  mins_to_hours_helper(H1, M1, H, M).

主要变化是:

  1. 为了避免错误消息(参数未充分实例化),因为您的代码是递归的,所以需要单独的传入和传出变量,即H0 with H1, and M0 with M1.
  2. 为了能够使用附加变量,需要添加辅助谓词,即mins_to_hours_helper.
  3. 辅助谓词中的分钟数和起始分钟数实际上是相同的。
  4. 递归代码会创建选择点,但答案预计是确定性的。这是通过在基本情况下进行切割(!)来解决的。

以下是一些测试用例(使用 SWI-Prolog):

:- begin_tests(mins_to_hours).

test(-1) :-
    mins_to_hours(-1,H,M),
    assertion(H == 0),
    assertion(M == -1).

test(0) :-
    mins_to_hours(0,H,M),
    assertion(H == 0),
    assertion(M == 0).

test(1) :-
    mins_to_hours(1,H,M),
    assertion(H == 0),
    assertion(M == 1).

test(59) :-
    mins_to_hours(59,H,M),
    assertion(H == 0),
    assertion(M == 59).

test(60) :-
    mins_to_hours(60,H,M),
    assertion(H == 1),
    assertion(M == 0).

test(600) :-
    mins_to_hours(600,H,M),
    assertion(H == 10),
    assertion(M == 0).

test(601) :-
    mins_to_hours(601,H,M),
    assertion(H == 10),
    assertion(M == 1).

:- end_tests(mins_to_hours).

运行测试用例:

?- run_tests.
% PL-Unit: mins_to_hours ....... done
% All 7 tests passed
true.

Note: run_tests.不适用于SWISH,

No permission to call sandboxed `'$current_module'(_4002,_4004)'

因此您必须手动输入每个查询并手动检查结果。

See: 沙箱.pl


现在有一个更好的方法来做到这一点。

mins_to_hours(Minutes_in, H, M) :-
    H is Minutes_in // 60,
    M is Minutes_in rem 60.

请注意,这是确定性的,不是递归的,并且通过了所有测试用例。

See: f-///2(整数除法)和rem/2(整数除法的余数)


Note.

由于您没有指定当分钟数为负数时应该发生什么,但确实提供了将分钟数小于 60 并将其移至结果的代码,因此此代码会重现该响应。

代码的一个变体是使用mod/2而不是 rem/2。根据输入,这将给出不同的答案,但可能是期望的结果。


根据@false 的反馈进行更新。

当编写的代码超出了简单的练习时,需要使用modes心里。

原来的答案代码写为

声明: mins_to_hours(++Minutes_in:int, -H:int, -M:int) 是 det。

意思是

Minutes_in 必须绑定到一个整数
H 必须是一个变量
M 必须是一个变量

然而正如@false 所指出的

?- mins_to_hours(Total, H, 1), Total = 61, H = 1.
false.

Declaration: mins_to_hours(-Minutes_in:int, -H:int, +M:int) is det.

?- Total = 61, H = 1, mins_to_hours(Total, H, 1).
Total = 61,
H = 1.

Declaration: mins_to_hours(+Minutes_in:int, +H:int, +M:int) is det.

第一个示例返回false,(失败)但应该返回true, 第二个示例返回相同值但模式不同的有效答案。

虽然我的答案仅适用于一种模式answer作者:Daniel Lyons 与他人合作是因为它使用约束。

?- mins_to_hours(Total, H, 1), Total = 61, H = 1.
Total = 61,
H = 1.

因此,为了避免返回 @false 的第一个示例false这实际上是错误的,它应该抛出一个Arguments are not sufficiently instantiated错误。 @false 还指出,最简单的方法是

削减后延迟统一

这是更新后的代码:

mins_to_hours(Minutes_in, H, M) :-
    mins_to_hours_helper(0, Minutes_in, H, M).

mins_to_hours_helper(H0, M0, H1, M1):-
  M0 < 60, !,
  H0 = H1,
  M0 = M1.
mins_to_hours_helper(H0, M0, H, M):-
  M0 >= 60,
  H1 is H0+1,
  M1 is M0-60,
  mins_to_hours_helper(H1, M1, H, M).

通过测试用例

?- run_tests.
% PL-Unit: mins_to_hours ....... done
% All 7 tests passed
true.

并给出第一个示例的错误:

?- mins_to_hours(Total, H, 1), Total = 61, H = 1.
ERROR: Arguments are not sufficiently instantiated
ERROR: In:
ERROR:   [11] _6584<60
ERROR:   [10] mins_to_hours_helper(0,_6612,_6614,1) at c:/XYZ.pl:23
ERROR:    [8] '<meta-call>'(user:(...,...)) <foreign>
ERROR:    [7] <user>
ERROR: 
ERROR: Note: some frames are missing due to last-call optimization.
ERROR: Re-run your program in debug mode (:- debug.) to get more detail.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prolog 将分钟转换为小时 的相关文章

  • Elixir 中的递归和匿名函数

    我正在尝试定义一个匿名函数来执行点积 我可以将其编码为私有函数 没有任何问题 但我正在努力解决匿名函数语法 我知道我可以以不同的方式实现这一点 但我试图了解如何使用模式匹配和递归来定义匿名函数 这是我当前的实现 dot fn i input
  • 为什么在具体化中将 clpfd 变量分配给实际值?

    我正在开发一个 SWI Prolog 程序 该程序使用 CLP FD 约束来找到特定问题的解决方案 为此 我碰巧需要两个列表的 未定位 重叠 那是 List La长度为A List Lb长度为 B A gt B 未定位的重叠列表是La Lb
  • Reactjs中的递归函数

    我正在使用递归函数制作动态菜单 并且我已经制作了菜单并且它以正确的顺序显示 没有任何问题 我从以下位置收到菜单数据服务 js文件 您可以在下面的代码沙箱示例中看到整个工作应用程序 https codesandbox io s reactst
  • 递归 - 与 Java 中不重复的数组相结合

    所以我知道如何获取组合的大小 数组大小 在我的例子中 除以所需数组子集大小的阶乘 我遇到的问题是获取组合 到目前为止 我已经阅读了 stackoverflow 上的大部分问题 但一无所获 我认为我发现的问题是我想将创建的组合子集中的元素添加
  • Java 中的递归回溯解决填字游戏

    我需要在给定初始网格和单词的情况下解决填字游戏 单词可以多次使用或根本不使用 初始网格如下所示 这是一个单词列表示例 pain nice pal id 任务是填充占位符 水平或垂直长度 gt 1 像那样 p pain pal id i c
  • Javascript 'this' 覆盖 Z 组合器和所有其他递归函数

    背景 我有一个由a实现的递归函数Z 组合器如图所示here https stackoverflow com questions 17645356 anonymous recursion any way to replace javascri
  • 生成总和为 N 的所有数字排列

    我正在编写一个程序来创建所有数字 起初 我尝试使用分区函数对数字进行分区 然后对每个数字集进行排列 但是我认为这行不通 最好的方法是递归排列 同时对数字求和 这超出了我的能力范围 抱歉 如果这听起来真的很愚蠢 但我真的不知道 Example
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 如何使用生成器遍历文件系统?

    我正在尝试创建一个实用程序类来遍历目录中的所有文件 包括子目录和子子目录中的文件 我尝试使用发电机 因为发电机很酷 然而 我遇到了困难 def grab files directory for name in os listdir dire
  • 文件/文件夹结构的递归搜索

    我正在尝试为返回文件和文件夹列表的 Web 服务构建递归搜索功能 我创建了这两个方法 因此它们充当递归搜索 它首先获取顶级内容 然后将任何文件添加到 fileList 并将任何子文件夹添加到 subFoldersList 我们传入访问级别
  • 问题 - 序言中的形式语言

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 如何停止 CTE 中的递归?

    我有一个数据库表 如下所示 ID PredecessorID Data 43b1e103 d8c6 40f9 b031 e5d9ef18a739 null 55f6951b 5ed3 46c8 9ad5 64e496cb521a 43b1e
  • Java 中的递归下降解析器

    我想在序言中说这是我三年级编程语言课的家庭作业 我正在寻求一些帮助 我的作业如下 截止日期 2013年2月22日晚上11点55分提交 请将以下内容上传到CMS 1 源代码2 程序执行的屏幕截图 包括您使用的输入文件 使用您喜欢的任何编程语言
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • Java中的递归排列生成错误结果

    问题是生成字典排列 起初 我的代码是这样的 public class Problem24 public static void main String args permutation 123 public static void perm
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • Prolog内存问题

    我想找到一种方法来分析我在序言中编写的谓词 一个巨大的谓词 的内存使用情况 我目前正在运行它swi http www swi prolog org and yap http www dcc fc up pt vsc Yap document
  • 在堆栈已满并给出分段错误之前,C/C++ 中的最大递归函数调用次数?

    我正在做一个问题 我使用递归函数来创建线段树 对于较大的值 它开始出现分段错误 所以我之前认为可能是因为数组索引值越界 但后来我认为这可能是因为程序堆栈太大 我编写这段代码是为了计算系统出现段错误之前允许的最大递归调用次数 include

随机推荐

  • 如何在 Swift 中保存从 UIImagePickerController 中选取的图像?

    我正在构建一个应用程序 让用户从其照片库中选择图像 我正在使用这段代码来保存它 func imagePickerController picker UIImagePickerController didFinishPickingImage
  • 捕获要在 ASP.NET 中处理的 IIS 级别错误

    我正在 IIS 7 上使用 C 开发一个 ASP NET 站点 但我希望得到一个也适用于 IIS 6 的答案 该网站的一部分功能是能够一次上传最多 5 张图像 我有一个很好的算法来调整上传的图像大小到我的最佳大小和比例 因此 我唯一真正的大
  • 使用正则表达式提取括号之间的文本

    在这样的句子中 x 阿尔法 33 贝塔 我提取一组括号内的数据作为 x 33 使用 VBA 正则表达式模式 x d 我无法直接将未括起来的数据数组提取为 x 33 使用网络资源建议进行模式 lt 这是 VBA 特定问题吗 即对其 Regex
  • Visual Studio Code - 如何向 python 路径添加多个路径?

    我正在尝试使用 Visual Studio Code 到目前为止 它看起来很棒 轻 快等 我正在尝试让我的 Python 应用程序之一运行 该应用程序使用虚拟环境 但也使用不在我的虚拟环境的站点包中的库 我知道在settings json
  • 公历到希伯来语

    如何将公历日期转换为等效的希伯来日期 另外请告诉我这些日历 因为我对此了解不多 有一个方便的类叫做NSCalendar 您可以像这样创建一个 NSCalendar gregorian NSCalendar alloc initWithCal
  • 自动 Killall 然后 Killall 9 级

    有时我想killall某个进程 但正在运行killall不起作用 因此 当我尝试再次启动该进程时 它会失败 因为前一个会话仍在运行 然后我就得无聊的跑killall 9在上面 所以为了简化我的生活 我创建了一个realkill脚本 它是这样
  • java.io.FileNotFoundException:(访问被拒绝)

    我试图读取文件夹内的文件 但是当我运行程序时它会抛出此异常 我也尝试过其他一些文件夹 它抛出相同的异常 Exception in thread main java io FileNotFoundException C backup Acce
  • Delphi 中重复直到中使用的函数 Sleep() 的奇怪行为

    我的功能是单击按钮时的反应 当我单击按钮时 它应该开始重复并写入数组中的值 并将它们显示在主窗体的标签中 问题在于功能睡眠 有一些错误或其他原因 因为当我单击按钮时 它等待了很长一段时间 然后它最终开始执行操作 但速度很快 让我们看看我的代
  • JavaScript 缩放整个 Div

    我正在寻找一个可以放大整个 div 的 JQuery 脚本 我找到了以下插件 http test dpetroff ru jquery iviewer test and 这些插件正是我需要的东西 只需用滚轮放大和缩小 但我有一个问题 我需要
  • npm install 在出现如此多的警告后给出错误

    我的 ReactJS 项目直到上周都运行良好 但从周日开始 它在 npm install 上出现以下错误 PS C Projects Interface ClientApp gt npm install npm WARN deprecate
  • 如何使用IpropertyStorage读取文件的属性?

    如何使用 iPropertyStorage 读取文件的属性 如标题 作者 页数等 谁知道c 中的代码请发布它 实际上 我正在尝试以编程方式 使用 c 读取文件属性 标题 摘要 作者 注释等 当您看到文件的属性时 摘要 选项卡上显示的内容 F
  • 事务回滚,但插入一条记录

    大家好 我已经使用 jsf spring 3 0 hybernate JPA 和atomikos 进行了 XA 交易管理 mysql 是我的后端 这里一切正常 但是插入操作 当异常抛出时 交易应该回滚 但是它没有发生 这是我们应用程序的一个
  • 使用jquery附加vue js组件

    我正在尝试动态附加vue使用 jquery 将组件添加到我的应用程序中 但什么也没有发生 附加元素没有渲染 div div 我想要的结果是附加时
  • HSM 和自定义模块

    我们正在实施安全关键系统 其中FIPS 140 2需要兼容的 HSM 硬件安全模块 来生成和存储密钥材料 执行加密 解密以及运行自定义代码 并为自定义模块设置以下要求 模块可通过 RPC 访问 模块可以访问所有 HSM 密钥和服务 模块具有
  • php shell命令错误GLIBCXX_3.4.9未找到

    我试图从 php 执行 shell 命令将文件转换为 pdf 但出现此错误 有人可以详细解释我如何修复它吗 我不太擅长linux 而且 如果我直接通过终端执行命令 一切都会正常 usr lib libreoffice program oos
  • 我为什么可以在 std::vector 中使用前向声明的类?

    我认为您只能创建指向前向声明类的引用或指针成员 然而 我惊讶地发现这个有效 include
  • 在 GAE 上使用 boto3 - 遇到 Popen 问题

    我正在尝试在 Google App Engine 中运行一些 python 代码 该代码向 Amazon SQS 发送消息 我已经安装了 boto3 但在尝试将其导入我的 AppEngine 服务时遇到错误 File base data h
  • 使用 R 中的 Match 函数查找“第一次出现”

    我是 R 和 Stackoverflow 的新手 所以请原谅我提出这个非常基本的问题 我正在尝试在我的数据集中找到第一个女性的 索引 代码快照 我的整个数据集称为 自行车 所以首先我认为分配一个仅包含性别的新向量是个好主意 bike gen
  • 使用填充堆叠不同长度的 Numpy 数组

    a np array 1 2 3 b np array 4 5 l a b 我想要一个功能stack padding这样 assert stack padding l np array 1 2 3 4 5 0 numpy 是否有实现的标准方
  • Prolog 将分钟转换为小时

    这是我创建的代码 mins to hours In H M In lt 60 H 0 M is In mins to hours In H M In gt 60 H is H1 1 In1 is In 60 mins to hours In