在序言中的特定元素之前和之后拆分列表(不使用“split”谓词?)

2023-12-19

我试图将列表拆分为特定元素(特别是“停止”一词)之前的项目以及该元素之后的项目。我知道你可以使用 split 来做到这一点,但我是序言新手,所以我正在尝试在当前不使用这些函数的情况下操作事物,所以我真的很想知道这是否可能? (也许还有一些正确方向的指针)

即与列表;

L = [tea,coffee,sugar,cake,stop,meat,fish,eggs,flour]

理想情况下,我想在“停止”处拆分列表,留下,

L2 = [tea, coffee, sugar, cake] // and
L3 = [meat, fish, eggs, flour]

Using seq//1 https://stackoverflow.com/a/24106828/772868:

list_splitonstop(Xs, As, Bs) :-
   phrase( ( seq(As), [stop], seq(Bs) ), Xs).

该版本按您的预期工作:

?- L = [tea,coffee,sugar,cake,stop,meat,fish,eggs,flour],
       list_splitonstop(L, L1, L2).
   L = [tea,coffee,sugar,cake,stop,meat,fish,eggs,flour],
      L1 = [tea,coffee,sugar,cake], L2 = [meat,fish,eggs,flour]
;  false.

但是,这真的是最好的解决方案吗?这; false最后可能表明事实并非如此。但我们不能肯定地说这一点。我们必须找出该解决方案无法按预期工作的另一种情况。在其他编程语言中,您也面临类似的问题,必须很大程度上依赖程序员的想象力来找出边界情况等。

幸运的是,我们在这里使用 Prolog,它可以帮助我们理解我们实际定义的内容。

一个非常简单的第一步是询问最一般的查询。就像那样:

?- list_splitonstop(L, L1, L2).
   L = [stop], L1 = [], L2 = []
;  L = [stop,_A], L1 = [], L2 = [_A]
;  L = [stop,_A,_B], L1 = [], L2 = [_A,_B]
;  L = [stop,_A,_B,_C], L1 = [], L2 = [_A,_B,_C]
; ... .

看看每个答案!我们以第三个为例。L = [stop,_A,_B]意味着这个答案包括all包含三个元素的列表,其中第一个元素是stop。所以我们在这里寻找一个infinity解决方案都已用几个字符进行了紧凑的描述!甚至不bzip2 -99可以做到这一点!

这些是唯一包含三个元素的列表吗?我们不能仅从这个单一的查询中说出这一点,因为 Prolog 可能会在一个unfair方式。想象一下,你要求某人告诉你所有的自然数,但那个人从 0, 2, 4, ... 开始,显然,这种枚举对奇数非常不公平。同样,有些答案可能会丢失......

在 Prolog 中,我们可以坚持只查看长度为 3 的列表:

?- L = [_,_,_], list_splitonstop(L, L1, L2).
   L = [stop,_A,_B], L1 = [], L2 = [_A,_B]
;  L = [_A,stop,_B], L1 = [_A], L2 = [_B]
;  L = [_A,_B,stop], L1 = [_A,_B], L2 = []
;  false.

因此,我们可以在单个查询中询问长度为 3 的所有相关案例。请注意,这些_A and _B变量代表任何术语!请花点时间欣赏您正在查看的内容:长度为 3 的列表的所有案例。没有其他案例需要考虑!

当您查看这些答案时,可能会出现一些问题。就像:这三个答案是否重叠,或者它们真的是脱节的? Prolog 知道答案。只需重复实际目标并计算结果答案:

?- L = [_,_,_], list_splitonstop(L, L1, L2), list_splitonstop(L, L1, L2).
(answers same as above)

所以我们得到了完全相同的答案。不存在固有的冗余。

另一个问题可能是:L总是恰好有一种可能的分裂? (换句话说:是否存在函数依赖性?)

我们可以通过询问来实现这一点L具有不同的L1 and L2:

?- L = [_,_,_], dif(L1-L2,L1x-L2x),
     list_splitonstop(L, L1, L2), list_splitonstop(L, L1x, L2x).
   L = [stop,stop,_A], L1 = [], L2 = [stop,_A], L1x = [stop], L2x = [_A]
;  L = [stop,_A,stop], L1 = [], L2 = [_A,stop], L1x = [stop,_A], L2x = []
;  L = [stop,stop,_A], L1 = [stop], L2 = [_A], L1x = [], L2x = [stop,_A]
;  L = [_A,stop,stop], L1 = [_A], L2 = [stop], L1x = [_A,stop], L2x = []
;  L = [stop,_A,stop], L1 = [stop,_A], L2 = [], L1x = [], L2x = [_A,stop]
;  L = [_A,stop,stop], L1 = [_A,stop], L2 = [], L1x = [_A], L2x = [stop]
;  false.

那么,我现在可以问你:你想要上面的案例吗?如果出现多次stop?显然,您没有具体说明这一点,我们需要您提供更多信息。 Prolog 至少有助于识别此类情况。


如何识别冗余答案。

在上面的例子中,我们观察到没有多余的答案。但当他们出现的时候,他们又是如何出现的呢?这是这样一个例子:member/2它是内置的并产生(有时)冗余的答案和memberd/2 https://stackoverflow.com/a/21971885没有这种冗余。实际的问题是:

二元素列表看起来像这样e作为元素/成员?

?- Xs = [_,_], member(e, Xs).
   Xs = [e,_A]
;  Xs = [_A,e].    
?- Xs = [_,_], member(e, Xs), member(e, Xs).
   Xs = [e,_A]
;  Xs = [e,e]                %  <--- redundant
;  Xs = [e,e]                %  <--- redundant
;  Xs = [_A,e].
?- Xs = [_,_], memberd(e, Xs).
   Xs = [e,_A]
;  Xs = [_A,e], dif(_A,e)
;  false.
?- Xs = [_,_], memberd(e, Xs), memberd(e, Xs).
   Xs = [e,_A]
;  Xs = [_A,e], dif(_A,e)
;  false.

如果您只想查看那些允许裁员的答案,您可以改为:

?- Xs = [_,_], member(e, Xs), \+ \+ call_nth(member(e, Xs), 2).
   Xs = [e,_A]
;  Xs = [_A,e].

换句话说,all的答案member/2允许此类裁员。注意member/2并不总是容易出现冗余。特别是,如果列表包含不同的(不可统一的)元素,则根本不存在冗余。这是一个常见的用例。

?- Xs = [a,b], member(X, Xs), \+ \+call_nth(member(X, Xs),2).
   false.

事实上,在这种情况下,即在查询时X, member/2可能比memberd/2.

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

在序言中的特定元素之前和之后拆分列表(不使用“split”谓词?) 的相关文章

  • 为什么Python中pop()的大O与pop(0)不同[重复]

    这个问题在这里已经有答案了 他们不应该都是O 1 因为从 Python 列表中的任何位置弹出一个元素涉及销毁该列表并在新的内存位置创建一个元素 蟒蛇的list实现使用动态调整大小的 Carray在引擎盖下 删除元素usually要求您移动后
  • JasperReports:传入列表列表作为数据源

    我需要用不同对象的列表填充一些子报表 基本上可以说我有以下内容 二手车子报告新车子报告 我创建一个车辆 bean 类 其中变量作为字符串 并为其创建 getter 和 setter 方法 然后在我的数据源中我传入一个List
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • 根据对象内的值将对象数组分成两部分

    我一直在尝试 并努力 弄清楚如何根据键值对拆分对象数组 长话短说 我有一个火车正在停靠的车站列表 需要将之前的停靠点和未来的停靠点分开 我正在使用的数据如下所示 station code SOC station name Southend
  • 在 python 上获取大目录文件列表的最佳方法?

    我有一个疯狂的大目录 我需要通过 python 获取文件列表 在代码中我需要获取迭代器 而不是列表 所以这不起作用 os listdir glob glob uses listdir os walk 我找不到任何好的库 帮助 也许是c li
  • C# 中两种不同类型的列表

    我目前在为客户提供购物车时遇到问题 他希望能够在 CartItems 之间添加文本 所以我想知道是否有某种方法仍然只有一个列表 我的解决方案是有两个列表 其中一个是 IList 类型 在计算购物车的重量和总体价格时会迭代 而另一个 ILis
  • 创建动态对象

    如何动态创建对象 string columnNames EmpName EmpID PhoneNo List
  • 嵌套 NumPy 数组并使用拆分等方法

    我是 NumPy 的新手 正在尝试在我的代码中使用它来处理某些表 我有一个如下所示的坐标列表 coordinates 2 0 0 1 3 4 并想这样写 coordinatesNumpy np array 2 0 0 1 3 4 在常规 P
  • List 或其他类型上的 string.Join

    我想将整数数组或列表转换为逗号分隔的字符串 如下所示 string myFunction List
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • 在 SELECT 中将列值拆分为两列?

    我在 varchar 列中有一个字符串值 它是一个由两部分组成的字符串 在它到达数据库之前分割它不是一个选择 该列的值如下所示 one column part1 part2 part1 part2 所以我想要的是一个如下所示的结果集 col
  • 如何使用 PHP 将字符串按大写字母分解?

    我有一个字符串 CamelCaseString 我想对大写字母进行explode split 或一些更好的方法来将该字符串分解为单个单词 最简单的方法是什么 解决方案更新 此链接指向一个略有不同的问题 但我认为答案通常比本页当前问题的答案更
  • 在r中拆分数据并将所有拆分文件保存在csv中

    我有一个名为 data 的数据集 Model Garage City Honda C Chicago Maruti B Boston Porsche A New York Honda B Chicago Honda C New York 它
  • Prolog DCG:找到最后一个元素

    我正在尝试更好地理解 DCG 的用途 为了做到这一点 我尝试将 LearnPrologNow 书中的一些练习转换为 DCG 表示法 然而 我却失败得很惨 我试图编写一个程序 仅命名列表中的最后一个元素 就这样 我只是想不出正确的 DCG 语
  • 将数字转换为整数列表[重复]

    这个问题在这里已经有答案了 我该如何写magic下面的函数 gt gt gt num 123 gt gt gt lst magic num gt gt gt gt gt gt print lst type lst 1 2 3
  • Bash如何使用awk在空行上分割文件

    我有一个文本文件 A in 我想将其拆分为多个文件 每次发现空行时都应该进行拆分 文件名应该是渐进的 A1 in A2 in I found this https stackoverflow com questions 16483507 s
  • 将一个列表的元素除以另一个列表的元素

    我有两个清单 比如说 a 10 20 30 40 50 60 b 30 70 110 正如你所看到的 列表 b 由一个列表的元素总和组成 其中 window 2 b 0 a 0 a 1 10 20 30 etc 如何获得另一个列表 该列表由
  • C#中如何从字符串中提取十进制数

    string sentence X10 cats Y20 dogs 40 fish and 1 programmer string digits Regex Split sentence D 对于此代码 我在数字数组中获取这些值 10 20
  • 是否可以创建根据输入对象名称自行命名的列表?

    能够创建 R 列表对象而无需指定每个元素的名称对我来说非常有帮助 例如 a1 lt 1 a2 lt 20 a3 lt 1 20 b lt list a1 a2 a3 inherit name TRUE gt b a1 1 1 a2 1 20
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public

随机推荐

  • 使用 jQuery AJAX 加载 JSON 数据

    我需要在单击按钮并按日期排序时打印此信息 到目前为止我有这个 我有看起来像这样的 json 文件 但我无法在页面上打印它 但仍然没有得到到按日期排序部分 我不确定问题是否出在我正在使用的 ajax 版本的链接上 或者是什么问题 因为我在 y
  • UITextView委托多次调用

    我正在使用 UITextView 并实现委托功能 var count 0 func textView textView UITextView shouldChangeTextIn range NSRange replacementText
  • 为什么连接到 OLEDB 时出现连接错误

    我有以下代码连接到我的数据库并从表中检索一些数据 string connectionString Data Provider SQLOLEDB Data Source myserver Initial Catalog Db Integrat
  • Slick.js:隐藏滑块直到图像加载

    Using Slick js http kenwheeler github io slick 如何隐藏幻灯片直到图像加载或至少加载第一个图像 我尝试使用init但无法让它发挥作用 控制台也没有输出任何内容 var slider slider
  • 使用 ZXing.net 生成条形码

    我正在尝试使用 ZXing NET 为 dot net core asp net 应用程序生成条形码 我不知道如何用条形码显示文本 而且文档似乎真的非常缺乏 有谁知道如何让它发挥作用吗 这是我的代码 主要取自另一篇关于SO的文章 Barco
  • 双向方差分析后箱线图上的 TukeyHSD 结果

    我有类似的代码在单向方差分析上运行良好 并且我的所有命令似乎都有效 但字母没有绘制 我的控制台中没有收到任何错误 因此我们将不胜感激 My data gt dput BodyComp structure list TimePoint str
  • 如何从代码隐藏中设置列表视图内的标签文本

    实际上 我正在使用 c 和 ASP NET 开发一个 Web 模板 我的连接字符串是
  • 为什么“async”不是保留字?

    据我所知 两者the spec https tc39 github io ecmascript asyncawait Identifiers and 文档 https developer mozilla org en US docs Web
  • 我应该如何根据用户设置加载CSS样式?

    在我的 ASP NET MVC 网站中 人们可以选择不同的 css 样式 将来这些 css 样式的名称将存储在数据库中 我有以下方法 尚未与数据库通信 public FileResult CssStyle string style Cont
  • 在 Snow Leopard 及更高版本上从音频输出设备录制音频环回

    我想以编程方式在 C C ObjC 中的 OSX 10 6 上记录来自音频输出设备 而不是输入 的音频环回 它应该从所有进程而不是像 SoundFlower 这样的特定进程捕获音频输出 PCM 原始数据 对此有什么想法吗 None
  • 我如何检查我的应用程序是否正在运行

    如何检查我的 Android 应用程序是否已在运行以防止重复启动 如何进行 硬退出 以防止我的应用程序在后台运行 双发射 是不可能的 如果您的应用程序已经在运行 并且您尝试启动另一个实例 那么您将恢复第一个启动实例 您可以通过添加来完成活动
  • 使用注释扩展 Hibernate 实体

    我需要扩展一个具有相同特征的实体 而不使用抽象类 我可以编写如下代码吗 Entity Table name ABC SequenceGenerator sequenceName SEQ ABC name idGenerator alloca
  • 如何在 C++ 中将光标位置设置为行首?

    所以我试图制作代码的一部分 在其中写入一些内容 然后覆盖它 像这样 10 seconds have passed 11 seconds have passed 12 seconds have passed 而不使用新行来打印它 所以我不想使
  • Java EJB JNDI Bean 查找失败

    我有以下结构
  • 如何在 Apple Silicon M1 上原生安装 NodeJS?

    我正在尝试在新的 Apple Silicon MacBook Pro 上安装 NodeJS 但我无法找到在基于 ARM 的 Apple M1 上安装它的方法 标准安装将在 Intel 模拟模式下运行 但我看到他们已经有 ARM Linux
  • Hudson 无限循环轮询 Git 存储库中的更改?

    Hudson 的 git 插件运行良好 但是 构建脚本必须更新存储库中文件的版本号 提交并推送回存储库 当 Hudson 轮询下一步以检查更改时 它会进入无限循环 因为它看到提交作为 更改 再次构建 从而提交更改 因此它再次构建 然后提交另
  • 库未加载:/opt/local/lib/libffi.5.dylib 但我正在使用自制软件

    我正在尝试在 Mac OS X Lion XCode 4 3 OSX GCC Installer Homebrew 上运行守卫 错误信息 Library not loaded opt local lib libffi 5 dylib 我没有
  • 如何使用实体框架检索插入实体的 ID?

    我在 ASP NET 中的实体框架方面遇到问题 每当我向数据库添加对象时 我都想获取 Id 值 我怎样才能做到这一点 根据实体框架 https entityframework net 解决办法是 using var context new
  • 使用 plyr、doMC 和 summarise() 处理非常大的数据集?

    我有一个相当大的数据集 约 140 万行 我正在对其进行一些拆分和总结 整个事情需要一段时间才能运行 而我的最终应用程序依赖于频 繁运行 所以我的想法是使用doMC和 parallel TRUE像这样使用 plyr 进行标记 稍微简化一下
  • 在序言中的特定元素之前和之后拆分列表(不使用“split”谓词?)

    我试图将列表拆分为特定元素 特别是 停止 一词 之前的项目以及该元素之后的项目 我知道你可以使用 split 来做到这一点 但我是序言新手 所以我正在尝试在当前不使用这些函数的情况下操作事物 所以我真的很想知道这是否可能 也许还有一些正确方