是否可以声明升序列表?

2023-12-12

我可以像这样制作升序整数列表:

?- findall(L,between(1,5,L),List).

我知道我还可以使用以下方法生成值:

?- length(_,X).

但我不认为我可以在 findall 中使用它,就像下面的循环一样:

?- findall(X,(length(_,X),X<6),Xs).

我还可以使用生成列表clpfd.

:- use_module(library(clpfd)).

list_to_n(N,List) :-
   length(List,N),
   List ins 1..N,
   all_different(List),
   once(label(List)).

or

list_to_n2(N,List) :-
   length(List,N),
   List ins 1..N,
   chain(List,#<),
   label(List).

最后一种方法对我来说似乎最好,因为它是最具声明性的,并且不使用once/1 or between/3 or findall/3 etc.

还有其他方法可以做到这一点吗?在“纯”Prolog 中是否有一种声明性的方式来做到这一点?有“最好”的方法吗?


“最佳”方法取决于您的具体用例!这是另一种使用方法clpfd:

:- use_module(library(clpfd)).

我们定义谓词equidistant_stride/2正如@mat 在评论中所建议的相关问题的先前回答:

equidistant_stride([],_).
equidistant_stride([Z|Zs],D) :- 
   foldl(equidistant_stride_(D),Zs,Z,_).

equidistant_stride_(D,Z1,Z0,Z1) :-
   Z1 #= Z0+D.

基于equidistant_stride/2,我们定义:

consecutive_ascending_integers(Zs) :-
   equidistant_stride(Zs,1).

consecutive_ascending_integers_from(Zs,Z0) :-
   Zs = [Z0|_],
   consecutive_ascending_integers(Zs).

consecutive_ascending_integers_from_1(Zs) :-
   consecutive_ascending_integers_from(Zs,1).

让我们运行一些查询!首先,您的原始用例:

?- length(Zs,N), consecutive_ascending_integers_from_1(Zs).
  N = 1, Zs = [1]
; N = 2, Zs = [1,2]
; N = 3, Zs = [1,2,3]
; N = 4, Zs = [1,2,3,4]
; N = 5, Zs = [1,2,3,4,5]
...

With clpfd,我们可以提出非常笼统的问题,并且也能得到逻辑上合理的答案!



?- consecutive_ascending_integers([A,B,0,D,E]).
A = -2, B = -1, D = 1, E = 2.

?- consecutive_ascending_integers([A,B,C,D,E]).
A+1#=B, B+1#=C, C+1#=D, D+1#=E.
  

的替代实现equidistant_stride/2:

我希望新代码能够更好地利用约束传播。

感谢@WillNess 提出了激发这次重写的测试用例!

equidistant_from_nth_stride([],_,_,_).
equidistant_from_nth_stride([Z|Zs],Z0,N,D) :-
   Z  #= Z0 + N*D,
   N1 #= N+1,
   equidistant_from_nth_stride(Zs,Z0,N1,D).

equidistant_stride([],_).
equidistant_stride([Z0|Zs],D) :-
   equidistant_from_nth_stride(Zs,Z0,1,D).

新旧版本与 @mat 的 clpfd 的比较:

首先是旧版本:

?- equidistant_stride([1,_,_,_,14],D).
_G1133+D#=14,
_G1145+D#=_G1133,
_G1157+D#=_G1145,
1+D#=_G1157.                               % succeeds with Scheinlösung

?- equidistant_stride([1,_,_,_,14|_],D).
  _G1136+D#=14, _G1148+D#=_G1136, _G1160+D#=_G1148, 1+D#=_G1160
; 14+D#=_G1340, _G1354+D#=14, _G1366+D#=_G1354, _G1378+D#=_G1366, 1+D#=_G1378
...                                        % does not terminate universally

现在让我们切换到新版本并提出相同的问题!



?- equidistant_stride([1,_,_,_,14],D).      
false.                                     % fails, as it should

?- equidistant_stride([1,_,_,_,14|_],D).
false.                                     % fails, as it should
  

更多,现在,再来一次!我们可以通过尝试性地采用冗余约束来提前失败吗?

之前,我们建议使用约束Z1 #= Z0+D*1, Z2 #= Z0+D*2, Z3 #= Z0+D*3代替Z1 #= Z0+D, Z2 #= Z1+D, Z3 #= Z2+D(这个答案中的第一个版本的代码就是这样做的)。

再次感谢@WillNess 激发了这个小实验 注意到目标equidistant_stride([_,4,_,_,14],D)不会失败,而是会成功实现未完成的目标:

?- Zs = [_,4,_,_,14], equidistant_stride(Zs,D).
Zs = [_G2650, 4, _G2656, _G2659, 14],
14#=_G2650+4*D,
_G2659#=_G2650+3*D,
_G2656#=_G2650+2*D,
_G2650+D#=4.

让我们添加一些冗余约束equidistantRED_stride/2:

equidistantRED_stride([],_).
equidistantRED_stride([Z|Zs],D) :-
   equidistant_from_nth_stride(Zs,Z,1,D),
   equidistantRED_stride(Zs,D).

示例查询:

?- Zs = [_,4,_,_,14], equidistant_stride(Zs,D), equidistantRED_stride(Zs,D).
false.

完毕?还没有!一般来说,我们不想要二次数量的冗余约束。原因如下:

?- Zs = [_,_,_,_,14], equidistant_stride(Zs,D).
Zs = [_G2683, _G2686, _G2689, _G2692, 14],
14#=_G2683+4*D,
_G2692#=_G2683+3*D,
_G2689#=_G2683+2*D,
_G2686#=_G2683+D.

?- Zs = [_,_,_,_,14], equidistant_stride(Zs,D), equidistantRED_stride(Zs,D).
Zs = [_G831, _G834, _G837, _G840, 14],
14#=_G831+4*D,
_G840#=_G831+3*D,
_G837#=_G831+2*D,
_G834#=_G831+D,
14#=_G831+4*D,
_G840#=_G831+3*D,
_G837#=_G831+2*D,
_G834#=_G831+D,
D+_G840#=14,
14#=2*D+_G837,
_G840#=D+_G837,
14#=_G834+3*D,
_G840#=_G834+2*D,
_G837#=_G834+D.

但如果我们使用双重否定技巧,那么在成功的情况下,剩余部分仍然存在......

?- Zs = [_,_,_,_,14], equidistant_stride(Zs,D), \+ \+ equidistantRED_stride(Zs,D).
Zs = [_G454, _G457, _G460, _G463, 14],
14#=_G454+4*D,
_G463#=_G454+3*D,
_G460#=_G454+2*D,
_G457#=_G454+D.

... 和 ...



?- Zs = [_,4,_,_,14], equidistant_stride(Zs,D), \+ \+ equidistantRED_stride(Zs,D).
false.
  

...我们检测到的故障案例比以前更多!


让我们再深入挖掘一下!我们能否在更广泛的用途中及早发现故障?

根据目前提供的代码,这两个逻辑错误的查询不会终止:



?- Zs = [_,4,_,_,14|_], \+ \+ equidistantRED_stride(Zs,D), equidistant_stride(Zs,D).
...                                        % Execution Aborted

?- Zs = [_,4,_,_,14|_], equidistant_stride(Zs,D), \+ \+ equidistantRED_stride(Zs,D).
...                                        % Execution Aborted
  

有修复吗?破解了!



?- use_module(library(lambda)).
true.

?- Zs = [_,4,_,_,14|_], 
   \+ ( term_variables(Zs,Vs), 
        maplist(\X^when(nonvar(X),integer(X)),Vs),
        \+ equidistantRED_stride(Zs,D)),
   equidistant_stride(Zs,D).
false.
  

该黑客行为并不能保证冗余约束“部分”的终止,但在我看来,对于快速的第一次射击来说,这还不算太糟糕。考试integer/1在实例化任何变量时Zs是为了允许clpfd求解器将变量域限制为单例,而 cons-pairs 的实例化(这直接导致基于列表的谓词的非终止)被抑制。

I do意识到黑客可以通过多种方式轻松破解(例如,使用循环术语)。欢迎任何建议和意见!

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

是否可以声明升序列表? 的相关文章

  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • python 中的基本矩阵转置

    我尝试了 python 中矩阵转置的最基本方法 但是 我没有得到所需的结果 接下来是代码 A 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 print A def TS A B A for i in range len A
  • Java 阻止列表实现

    我在 SO 和 Google 上搜索了这个问题的答案 但到目前为止找不到合适的解决方案 我目前正在研究图形路由问题中的 LayerManager 管理器负责提供和重置一组固定的层 我想使用阻止列表来实现消费者 生产者模式 以便只要没有可用的
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 以特定方式填充列表

    我需要填充一个包含 5 个位置的列表 new list 我收到 2 个列表 并且有一个默认值来填充新列表 现在开始解决问题 好的方式是 我从列表中接收 2 个值 从列表中接收 2 个值并添加默认值 A1 A2 DEFAULT B1 B2 但
  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • 我想将对象列表添加到 firestore 文档中,-flutter

    我想将对象列表添加到 firestore 文档 我定义了产品数据模型 我还有类别数据模型 我想将类别列表添加到 firestore 中的产品文档中 我将类别添加到临时列表 然后将值放入product categories 产品 类别 类别t
  • 在不同进程之间共享列表?

    我有以下问题 我编写了一个函数 它将列表作为输入 并为列表中的每个元素创建一个字典 然后我想将这本字典附加到一个新列表中 这样我就得到了一个字典列表 我正在尝试为此生成多个进程 我的问题是 我希望不同的进程访问由其他进程更新的字典列表 例如
  • 如何将列表转换为元组列表?

    我想转换 z z a z z a a z to z 2 a 1 z 2 a 2 z 1 我该怎么做 所以 我需要累积以前的值 它的计数器和元组列表 我已创建记录 record acc previous counter tuples 重新定义
  • 如何从Python列表中的字符串中删除双引号?

    我正在尝试在字典列表中获取一些数据 数据来自 csv 文件 因此都是字符串 文件中的键都有双引号 但由于这些都是字符串 我想删除它们 这样它们在字典中看起来像这样 key value 而不是这个 key value 我尝试简单地使用 str
  • 检查子字符串是否在字符串列表中?

    我之前已经找到了这个问题的一些答案 但它们对于当前的Python版本来说似乎已经过时了 或者至少它们对我不起作用 我想检查字符串列表中是否包含子字符串 我只需要布尔结果 我找到了这个解决方案 word to check or wordlis
  • 斜线(/)在序言中做什么?

    我有这个代码 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
  • Python 将列表追加到列表中

    我正在尝试编写一个通过矩阵的函数 当满足条件时 它会记住该位置 我从一个空列表开始 locations 当函数遍历行时 我使用以下方法附加坐标 locations append x locations append y 函数末尾的列表如下所
  • 使用 LINQ 洗牌

    我正在尝试编写一个简单的纸牌游戏 为了想出一个好的洗牌算法 我遇到了 Jeff Atwood 的post http www codinghorror com blog 2007 12 shuffling html关于恐怖编码 但是 当我在调
  • 将字符串连接到python列表中所有元素的末尾

    我想知道如何将字符串连接到列表中所有元素的末尾 例如 List1 1 2 3 string a output 1a 2a 3a 在列表理解和使用中重建列表str format在两个参数上 gt gt gt string a gt gt gt
  • Prolog:子句在源文件中不在一起

    我有这段代码 Family tree female pen male tom male bob female liz female pat female ann male jim parent pam bob parent tom bob
  • 如何在 R 中合并同名列表中的数据框?

    我有一个包含很多数据框的列表 如果它们具有相同的名称 我想合并它们 即合并所有具有相同名称 a 和 b 的数据框 像这样 a lt aaaaa b lt bbbbb c lt ccccc g lt list df1 lt data fram
  • 使用for循环时如何获取前一个元素? [复制]

    这个问题在这里已经有答案了 可能的重复 Python 循环内的上一个和下一个值 https stackoverflow com questions 1011938 python previous and next values inside
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 使用 pandas 单元格中列表的长度选择行[重复]

    这个问题在这里已经有答案了 我有一张表 df a b c 1 x y x 2 x z c d 3 x t e f g 只是想知道如何使用 c 列的长度选择行 such as df loc len df c gt 1 我知道这是不对的 正确的

随机推荐

  • 将 iPad 应用程序转换为 iPhone 应用程序?

    我编写了一个基于选项卡的 iPad 应用程序 效果很好 我从来没有打算让它成为一个 iPhone 应用程序 因为它显示的内容确实不适合这么小的屏幕 然而 我收到了很多要求该应用程序也与 iPhone 兼容的请求 有人可以向我指出一些文档的方
  • Javascript 无缘无故地将浮点数转换为整数

    我编写了一个函数 它的行为根据其参数的数字类型而有所不同 整数或浮点数 使用这个问题中的一些代码如何检查一个数字是浮点数还是整数 很容易检测是否浮动 但后来我偶然发现了 javascript 强制转换的情况1 0 to 1如果您使用该号码调
  • 莫里斯图未更新

    我的更新有问题morris js条形图 当页面加载时 我有以下函数 它运行良好并创建了一个漂亮的图表 document ready function if projectViewTotal length chart Morris Bar e
  • 从数据库中检索一行作为 Hibernate 中的映射

    Table Players ID name email age 1 bob null 23 该表是类的实例Player被持久化 每个实例一行 没有组合等 冬眠Session 我如何获得该行 假设 id PK 等于 1 作为 Java 地图
  • 具有波斯语/阿拉伯语字符的Python 3 print() 函数[重复]

    这个问题在这里已经有答案了 我简化了代码以便更好地理解 这是问题所在 case 1 coding utf 8 text also using u results the same print text output UnicodeEncod
  • 在 AWS Lambda 中将 DynamoDB 数据格式化为普通 JSON

    我在用着AWS Lambda扫描数据DynamoDB桌子 这就是我得到的回报 videos file S file1 mp4 id S 1 canvas S This is Canvas1 file S main mp4 id S 0 ca
  • 如何将 CSV 文件直接发送到 FTP 服务器

    我的问题是如何将 CSV 文件发送到 FTP 服务器 如您所见 以下脚本是我当前的代码 代码示例 def download outage info all request upload data download data form req
  • WordPress 致命错误:第 1832 行的 wp-includes/wp-db.php 中允许的内存大小 536870912 字节已耗尽(尝试分配 77 字节)

    我最近注意到我的 WordPress 网站有时会收到 500 内部服务器错误 我检查了日志 有很多行 例如 2016 年 10 月 3 日星期一 01 25 24 357439 fcgid 警告 pid 12840 客户端 83 27 21
  • 在父 div 内对角排列 2 个 div

    我试图在父 div 内排列 2 个 div 这样看起来父 div 被对角线分成两部分 下图将显示需要什么 这是我尝试过的代码 App js import React Component from react import App css c
  • Cube on Cube 碰撞检测算法?

    我试图找到最有效的方法来检查两个任意大小的立方体是否相互碰撞 立方体的边长不一定都相等 盒子是可能的 考虑到这些限制 我如何有效地检查它们是否发生冲突 每个盒子有 24 个顶点 谢谢 它们是轴对齐的 由于两个框都是轴对齐的 因此您可以比较它
  • 升级到 VS2010 和 Re#5 后 SQLite 相关的 nUnit 测试出现问题

    使用 ReSharper5 转换为 Visual Studio 2010 后 我的一些单元测试开始失败 更具体地说 这适用于使用 NHibernate 和 SQLite 的所有单元测试 这个问题似乎与 SQLite 有关 不涉及NHiber
  • 如何在没有边框的表单周围添加阴影?

    我试图弄清楚如何使用 WinForms 在无边框表单周围添加完整的阴影 我正在考虑在表格的四个侧面周围添加阴影 我尝试过使用 DropShadow 类 尽管它只将阴影添加到底角和右侧角 我之前在搜索中多次看到这个问题被问到 但我发现没有任何
  • 如何仅在线性布局的一侧绘制边框?

    我能够将边框绘制到线性布局 但它是在所有侧面绘制的 我想将其限制为仅在右侧 就像在 CSS 中所做的那样 border right 1px Solid red 我已经尝试过这个 但它仍然吸引各方
  • CSS 变量在 Microsoft Edge 中的工作方式是否有所不同?

    我正在开发一个网站 并针对 Firefox 和 Chrome 对其进行了优化 该项目包含一个名为base css它包含在所有页面中 并且包含一些全局设置和定义 包括我用来存储颜色值的变量列表 如下所示 root yellow 1 fff8e
  • Internet Explorer 的永恒重新加载页面

    我在 Internet Explorer 7 上使用 FB 应用程序时遇到问题 我正在使用FB前一段时间提供的这段代码 auth url http www facebook com dialog oauth client id FACEBO
  • 指令集架构的定义是什么?

    我试图弄清楚指令集架构 ISA 到底是什么 根据我所读到的内容 我有两种解释 我的第一个解释是 ISA 是所有寄存器 汇编指令和伪指令 汇编指令以及构成汇编语言的指令格式的集合 可用于对实现指令集的处理器进行编程 我的第二种解释是 ISA
  • 清除 C# 表单上所有控件的最佳方法是什么?

    我记得不久前看到有人问过类似的问题 但我进行了搜索 但找不到任何东西 我试图想出最干净的方法来将表单上的所有控件清除回默认值 例如 清除文本框 取消选中复选框 你会怎么做呢 到目前为止我想出的是这样的 public static class
  • C 宏的作用域规则

    我不是一个 C 程序员 但我假设 C 宏几乎是一种查找和替换功能 其中预处理器获取宏定义并将其放在它看到宏名称的任何位置 这是 Dragon Book 的动态范围规则及其如何应用于宏的示例 define a x 1 int x 2 void
  • 在 null Laravel 5.4 上调用成员函数 connection()

    尝试编写一个单元测试 我需要执行 sql 查询 class UpdateThrowsTest extends TestCase protected bgame protected game id 95 public function set
  • 是否可以声明升序列表?

    我可以像这样制作升序整数列表 findall L between 1 5 L List 我知道我还可以使用以下方法生成值 length X 但我不认为我可以在 findall 中使用它 就像下面的循环一样 findall X length