在Prolog中查找最大子列表

2023-12-28

我是 Prolog 新手,正在尝试解决以下问题的实例最大子数组问题 https://en.wikipedia.org/wiki/Maximum_subarray_problem.

我有以下相当优雅的 C++ 代码:

int maxSubArray(vector<int> List)
{
    int maxsofar = 0;
    int maxendinghere = 0;
    for (int i = 0; i < List.size(); i++)
    {
        maxendinghere = max(maxendinghere+List[i], 0);
        maxsofar = max(maxsofar, maxendinghere);
    }
    return maxsofar;
}

这是我的 Prolog 代码:

max(X,X,X).
max(X,Y,X) :- X>Y.
max(X,Y,Y) :- X<Y. %define max function

prev(L,T,H) :-
   reverse(L,[H|T1]),
   reverse(T,T1).  %split L to H(last element) and T(the remaining list)

f([],0,0).
f(L,M,N) :-
   f(L1,M1,N1),
   prev(L,L1,E),
   max(M1,N,M),
   max(K,0,N), 
   K is N1+E.

我尝试从中获得最大总和f(L,M,N), where L是列表,M是我想要得到的结果(最大和,也像C++代码中的变量“maxsofar”),N是一个中间变量,如 C++ 代码中的“maxendinghere”。我想得到以下答案L从以前的列表中L1,变量关系与C++代码相同。

但是,以下查询不起作用:

?- f([1,2,3],X,Y).
is/2: Arguments are not sufficiently instantiated

我不知道问题出在哪里。


这个答案显示了 Prolog 端口卡丹算法 /questions/tagged/kadanes-algorithm基于clpfd /questions/tagged/clpfd:



:- use_module https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/mpg_002dref_002duse_005fmodule.html(library https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/The-Prolog-Library.html#The-Prolog-Library(clpfd https://sicstus.sics.se/sicstus/docs/latest4/html/sicstus.html/lib_002dclpfd.html)).
  

我们定义zs_maxmum/2像这样:

zs_maxmum(Zs, MSF) :-
   zs_maxmum_(Zs, 0,_, 0,MSF).

zs_maxmum_([], _,_, MSF,MSF).
zs_maxmum_([Z|Zs], MEH0,MEH, MSF0,MSF) :-
   max(0,MEH0+Z)  #= MEH1,
   max(MSF0,MEH1) #= MSF1,
   zs_maxmum_(Zs, MEH1,MEH, MSF1,MSF).

示例查询:

?- zs_maxmum([-2,1,-3,4,-1,2,1,-5,4], Max).
Max = 6.

?- zs_maxmum([-2,3,4,-5,8,-12,100,-101,7], Max).
Max = 100.

几点说明:

  • 我们实际上并不是对数组进行操作,而是对lists.
  • 我们承认任意子列表,包括[]。目标zs_maxmum([-2,-3,-4], 0)成功了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Prolog中查找最大子列表 的相关文章

  • 寻找最大最小值集合

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

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • Prolog 中的迷你数独求解器中途停止

    我正在学习 七周七种语言 我只是想从书中找到一个例子 它解决迷你数独网格 4x4 作者使用的是 gprolog 但我使用的是 swi prolog 无论出于何种原因 我都无法让 gprolog 在我的虚拟机上工作 但 swi prolog
  • 为什么在具体化中将 clpfd 变量分配给实际值?

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

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • Prolog 实现 and/2、or/2、nand/2、nor/2、xor/2 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在序言中实现以下谓词并将它们用于真值表 and 2 or 2 nand 2 nor 2 xor 2 也许有人可以告诉我如何实现和
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 列表中的连续元素

    我正在阻止一个谓词来编码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
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • 斜线(/)在序言中做什么?

    我有这个代码 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
  • 查找相邻成员

    我必须找出列表中的两个成员是否相邻 限制是使用append 3谓词 到目前为止 我已经完成了下面的操作 如果它是真的 它就有效 否则我得不到答案 就像它永远运行一样 adjacent X Y L append L1 X Y T1 appen
  • 如何验证涉及 diff/2 约束的交换性?

    围绕 diff 2 约束有很多炒作 特别是作为对 2 和 2 的某些非声明性的救援 这种非声明性通常被描述为非单调性 并给出了非交换性的例子 但是测试涉及 diff 2 的测试用例是否可交换的方法是什么 这是我想要做的元解释 我做了交换性测
  • 如何为这个“移动块”Prolog 练习实现求解谓词?

    我正在使用 Ivan Bratko 的书 人工智能编程 学习 Prolog 我发现实施拟议练习的最后部分有些困难 该练习是一个使用图形来决定如何移动块并按顺序排列它们的程序 这是与程序必须执行的操作相关的图像 正如您在上图中看到的 可以使用
  • Prolog - 通过演绎减少知识库

    我需要创建一个规则来搜索与 my rule 匹配的事实 这些事实将用于改变知识库 my rule Conclusion Premise 我有这个知识库可以开始 dynamic is 2 is m1 house is m1 thing is
  • 查找列表中的最大值 - Prolog

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

    在下面封闭世界假设 https en wikipedia org wiki Closed world assumption 目前未知的事实是错误的 Prolog 的语义通常被认为遵循封闭世界假设 例如 here https cstheory
  • Prolog 谓词参数中实例化模式指示符的含义

    查看Prolog文档 谓词签名有时会写成如下 foo Bar Baz Qux Mop 什么是 and 我该如何解释它们 另外 这些是唯一存在的还是还有更多 在这种情况下 这些前缀运算符代表实例化模式 即它们告诉您哪些参数应该是变量或在调用谓
  • 简单的布尔表达式测试

    user compiling user for byte code formula 0 P Q P Q P user compiled 2 lines read 768 bytes written 37208 ms yes formula

随机推荐

  • 排除 Dplyr 中 Dot 中的周末

    这是这个答案的延续问题 https stackoverflow com a 45254762 5893585 https stackoverflow com a 45254762 5893585 我正在使用do函数于dplyr内prophe
  • Django更新到1.6后Android http post请求返回403

    我正在编写一个 Android 应用程序 它将 JSON 格式的数据发送到本地服务器上运行的 Django REST API 它是与服务器的 https 连接 所有必要的证书都集成到应用程序中 在我们更新到 Django 1 6 之前 我们
  • 如何在 Pycharm 中复制和粘贴?

    每次我尝试将网址复制并粘贴到 PyCharm 中时 我什至尝试过 简单粘贴 但我什么也没看到 是否有任何力量可能阻止试图粘贴信息的人 我真的不知道发生了什么事 您很可能在首次安装 PyCharm 时安装了 IdeaVim 支持 要卸载插件
  • 如何使用 Maven 将我的 Web 应用程序和 Tomcat 打包在一起?

    我想分发打包为嵌入 Apache Tomcat 中的 WAR 的应用程序 也就是说 我想将 Tomcat 与我的应用程序一起分发 如何使用 Maven 来完成这种分发打包 我见过Maven 货物插件 http cargo codehaus
  • 为什么将 float32 转换为 float64 时会丢失精度?

    在 Go 中 将 float32 数字转换为 float64 精度会丢失 例如 将 359 9 转换为 float64 会产生 359 8999938964844 如果 float32 可以精确存储 为什么 float64 会失去精度 示例
  • git:如何找到已经合并的两个分支的共同祖先

    为了找到 2 个 git 分支的共同祖先 需要执行以下操作 git merge base branch another branch 好的 但是 如果两个分支已经合并怎么办 当我使用merge base在这种情况下 我得到的提交是合并之前的
  • 如何检测 OS X 是否处于深色模式?

    我的可可应用程序在新的 OS X 黑暗模式 下运行时必须更改其行为 有没有办法检测 OS X 风格是否设置为该模式 认为还没有可可方法来检测它 但是您可以使用defaults read检查 OSX 是否处于深色模式 defaults rea
  • 如何更改 Xcode 4.0(内部版本 4A304a)中的默认公司名称[重复]

    这个问题在这里已经有答案了 可能的重复 我在哪里设置我的公司名称 https stackoverflow com questions 2956464 where do i set my company name 我刚刚安装了 Xcode 4
  • Django:基于 DRF 令牌的身份验证 VS JSON Web 令牌

    我正在构建一个现实世界的应用程序 用户将主要从 Android iOS 设备以及桌面访问该应用程序 从我的基础研究中 我意识到与基于会话的身份验证相比 基于令牌的身份验证机制对于客户端 服务器模型来说更加更好和更优雅 在 Django 中
  • 仅在 Vim 中启用 .h 和 .cpp 文件的某些插件和选项

    我在 Vim 中安装了 delimitMate 以完成大括号 但它针对所有文件运行 而不仅仅是 h 和 cpp 文件 DelimitMate 有一个在缓冲区中禁用自身的选项 因此我需要在 vimrc 中添加一些内容 表示 在除 h 和 cp
  • 从应用程序脚本中的电子表格更新下拉列表

    我正在尝试学习 Google 的 HTML Service UI 服务 并且正在努力弄清楚如何根据电子表格中的数据更新 UI 中的下拉列表 我从以下位置复制了以下代码这个谷歌教程 https developers google com ap
  • 授权 Google Drive Android API

    我尝试通过以下方式访问 Google 云端硬盘中的数据谷歌云端硬盘 Android API https developers google com drive android auth 不是 Web API 令人疯狂的是 当我使用此访问权限
  • Windows 上的 script/generate:“script”未被识别为内部或外部命令

    每当我尝试使用 Rails 时script generate or script install命令我收到这种错误 C workspace gt script generate bigcommand script is not recogn
  • 如何在 MySQL 中创建表别名

    我正在将 MS Access 应用程序 已将表链接到 MSSQL Server 迁移到 MySQL 作为克服一些 MSAccess 表命名问题的方法 我正在寻求一种解决方案来添加 MySQL 表别名 该别名将指向 MySQL 数据库中的现有
  • Javascript 隐藏所选选项

    我有这段代码来隐藏选定的选项 function connect selectbox option show selectbox each function i var obj selectbox option value this val
  • Django自定义用户管理员change_password

    我成功地在 django 中使用了自定义用户模型 最后要做的事情是超级用户更改任何用户密码的 AdminChangePasswordForm 目前 来自 admin myapp user 的更改密码链接给出了 404 答案 覆盖 get u
  • 数组的长度属性在哪里定义?

    我们可以确定一个的长度ArrayList
  • 如何在 C# 中将 SID 转换为帐户名

    我有一个 C 应用程序 可以扫描目录并收集一些信息 我想显示每个文件的帐户名 我可以通过获取 FileInfo 对象的 SID 在本地系统上执行此操作 然后执行以下操作 string GetNameFromSID SecurityIdent
  • C++ 相当于 Python __getattr__(self, name)

    我喜欢 Python 的原因之一是它的方式自定义属性访问 https docs python org 2 reference datamodel html customizing attribute access class Foo obj
  • 在Prolog中查找最大子列表

    我是 Prolog 新手 正在尝试解决以下问题的实例最大子数组问题 https en wikipedia org wiki Maximum subarray problem 我有以下相当优雅的 C 代码 int maxSubArray ve