计算 Prolog 中数字的连续出现次数

2023-12-03

你好,我正在尝试在 Prolog 中编写一个程序,给定一个列表,它会计算列表中每个连续元素的出现次数,如下所示:

count(1,[1,1,1,2,2,2,3,1,1],0,X)

结果将是X=[ [1,3],[2,3],[3,1][1,2] ]又名每个子列表是[element,occurrences]

就我而言,我相信基本情况有问题,但我无法解决它。你能帮助我吗?

%append an element to a list
append([ ],Y,Y).
append([X|Xs],Ys,[X|Zs]):-append(Xs,Ys,Zs).

%c is the counter beginning with 0 
count(_,[],_,[]).
count(X,[X],C,[L]):-count(X,[],C,[L|[X,C]]).

%increase counter
count(X,[X|Tail],C,L):-Z is C+1,count(X,Tail,Z,L).
count(X,[Head|Tail],C,[L]):-append(L,[X,C],NL),count(Head,Tail,1,NL).

我们可以解决您的问题and保存逻辑纯粹性!

下面让Xs be [1,1,1,2,2,2,3,1,1],您在问题中使用的列表。

First,我们映射Xs到列表列表Yss这样每个列表Ys in Yss只包含取自的相同元素Xs。 我们通过使用元谓词来做到这一点splitlistIfAdj/3与具体化的不平等谓词相结合dif/3:

?- Xs = [1,1,1,2,2,2,3,1,1], splitlistIfAdj(dif,Xs,Yss).
Xs  = [ 1,1,1,  2,2,2,  3,  1,1 ],
Yss = [[1,1,1],[2,2,2],[3],[1,1]].

Second,我们映射列表的列表Yss to Zss。中的每一项Zss有形式[Element,Amount]。 看看上面查询的答案,我们发现我们需要做的就是映射[1,1,1] to [1,3], [2,2,2] to [2,3], [3] to [3,1], and [1,1] to [1,2]. run_pair/2正是这样做的:

run_pair(Ys,[Element,Amount]) :-
   Ys = [Element|_],
   length(Ys,Amount).

让我们使用run_pair/2映射每一项Yss,借助元谓词maplist/3:



?- Yss = [[1,1,1],[2,2,2],[3],[1,1]], maplist(run_pair,Yss,Zss).
Yss = [[1,1,1],[2,2,2],[3]  ,[1,1]],
Zss = [[1,3],  [2,3],  [3,1],[1,2]].
  

Done!是时候把它们放在一起了:

count(Xs,Zss) :-
   splitlistIfAdj(dif,Xs,Yss),
   maplist(run_pair,Yss,Zss).

让我们看看上面的查询是否仍然有效:)

?- count([1,1,1,2,2,2,3,1,1],Zss).
Zss = [[1,3],[2,3],[3,1],[1,2]].      % succeeds deterministically

作为实施count/2 is monotone,即使使用非基础术语,我们也会得到逻辑上合理的答案。让我们看看实际效果!

?- Xs = [A,B,C,D], count(Xs,Zss).
Xs = [D,D,D,D],     A=B,      B=C ,     C=D , Zss = [                  [D,4]] ;
Xs = [C,C,C,D],     A=B,      B=C , dif(C,D), Zss = [            [C,3],[D,1]] ;
Xs = [B,B,D,D],     A=B,  dif(B,C),     C=D , Zss = [      [B,2],      [D,2]] ;
Xs = [B,B,C,D],     A=B,  dif(B,C), dif(C,D), Zss = [      [B,2],[C,1],[D,1]] ;
Xs = [A,D,D,D], dif(A,B),     B=C ,     C=D , Zss = [[A,1],            [D,3]] ;
Xs = [A,C,C,D], dif(A,B),     B=C , dif(C,D), Zss = [[A,1],      [C,2],[D,1]] ;
Xs = [A,B,D,D], dif(A,B), dif(B,C),     C=D , Zss = [[A,1],[B,1],      [D,2]] ;
Xs = [A,B,C,D], dif(A,B), dif(B,C), dif(C,D), Zss = [[A,1],[B,1],[C,1],[D,1]].
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算 Prolog 中数字的连续出现次数 的相关文章

  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • 如何将嵌套的数字列表转换为字符串列表?

    我有下面的列表 p 1 2 3 4 2 3 4 1 如何将子列表放入字符串中 例如 期望的结果是 p 1234 2341 可以通过将每个整数转换为字符串并连接字符串来完成 p join map str sub list for sub li
  • Python 递归搜索带有嵌套键的字典

    我最近必须使用嵌套的字典 列表组合来解决实际数据系统中的问题 我为此工作了很长一段时间并提出了解决方案 但我非常不满意 我不得不求助于使用globals 和一个命名的临时全局参数 我不喜欢使用全局变量 这只是要求注入漏洞 我觉得必须有一种更
  • JSON 列表中元素的顺序是否保留?

    我注意到 JSON 对象中元素的顺序不是原始顺序 JSON 列表的元素怎么样 他们的秩序是否得到维持 是的 JSON 数组中元素的顺序会被保留 从RFC 7159 JavaScript 对象表示法 JSON 数据交换格式 https www
  • C#动态创建Type数组

    在 C 中 我需要能够在运行时基于以字符串形式传递给函数的逗号分隔数据类型列表创建 Type 对象数组 基本上 这就是我想要实现的目标 create array of types Type paramTypes typeof uint ty
  • 如何对 glob.glob 进行数字排序?

    我在一个文件夹中有一堆按数字排序的文件 当我尝试对 glob glob 进行排序时 我从来没有以正确的顺序获得文件 文件示例和预期输出排序 folder C Users user Desktop folder 1 sample mp3 C
  • 在 Python 中获取数组作为 GET 查询参数

    我知道在 php 中我可以使用 GET key1 key2 检索以数组形式发送的 GET 数据 但这在 Python 中是可能的 因为我只收到一个字符串 但它不被识别为数组 列表 如果重要的话我使用flask werkzeug 参数名称的深
  • 在Python中将字符串转换为字典或列表?

    在Python中将此字符串转换为列表或字典 u f i r s t n a m e u j o h n u l a s t n a m e u s m i t h u a g e 2 0 u m o b
  • 如何使用流从两个列表或数组乘法中查找元素对

    我有两个数字列表 我想找到所有可能的数字对 例如 给定列表 1 2 3 and 3 4 结果应该是 1 3 1 4 2 3 2 4 3 3 3 4 我知道我可以使用for loop但有没有更简洁的方法来使用Java 8 流 我尝试了以下操作
  • Python列表内存存储[重复]

    这个问题在这里已经有答案了 据我了解 Python 列表本质上是 C 数组 它们分配特定的顺序内存块 但是 这些内存块实际上存储列表中的数据还是它们只是指向内存中存储实际数据的另一个位置 它可能取决于列表中存储的对象的大小吗 因为您可以轻松
  • 如何显示在 Emacs 中 hippie-expand 命令创建的所有可能的补全?

    我想列出所有项目hippie expand创建 然后通过移动光标并按 RET 键从中进行选择 有什么办法可以做到这一点吗 这是我为此目的使用的 global set key kbd M i complete with helm requir
  • 查找字典中列表的最大值

    我有一个字典 每个键后面都有一个存储的列表 看起来像这样 dict with values u New York u New York u NY datetime datetime 2014 8 13 0 0 10 u New York u
  • 寻找嵌套列表中的最低值?

    我正在尝试编写一个函数 它接受一个列表并可以打印该列表中的最小整数 现在我试图弄清楚在嵌套列表中该怎么做 如果最低数字位于这些嵌套列表之一中 那么总的来说它将打印该数字 我的代码在这里 def listMin list2 3 4 2 99
  • 将嵌套列表转换为嵌套列表

    我知道可以将项目列表从一种类型转换为另一种类型 但是如何将嵌套列表转换为嵌套 List 已经尝试过的解决方案 List
  • 如何在 Python 中使用 .format() 打印“for”循环中的列表?

    我是 Python 新手 我正在编写一段非常简单的代码 使用 for 循环打印列表的内容 format 我想要如下的输出 但我收到此错误 names David Peter Michael John Bob for i in names p
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • 简单的布尔表达式测试

    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
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng
  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • 在 HTML 下拉列表中有一个滚动条

    我正在寻找一种在 HTML 的下拉列表中添加滚动条的方法 这样如果下拉列表包含的内容超过例如 5 项 将出现滚动条以查看其余项 这是因为我将被迫列出一些大清单 过去几个小时我一直在谷歌上搜索它 但没有运气 它需要适用于 IE8 FF 和 C

随机推荐

  • codeigniter 中的浏览器缓存问题

    我是代码点火器的新手 我创建了一个登录表单和一个注销部分 当我按下注销部分时 页面将重定向到登录部分 当我单击浏览器中的后退按钮时 它将显示以前的页面 当我单击清除最近历史记录和选择缓存 然后按后退按钮时 它不会显示最近的页面 它只显示登录
  • Glassfish 上的 Spring Boot

    我在 Spring Boot 部署到 GF3 4 期间得到了这个 虽然这是知道问题看到 弹簧启动问题 another 除了 GF 源代码中的 try catch 破解之外 没有其他解决方案 整个问题是关于 Conditional Sprin
  • Java拖放自定义光标

    我使用 JPanel 定义了一个自定义画布样式组件 它将支持将对象拖动到画布上 我似乎无法弄清楚如何使用 TransferHandler 将拖放 DnD 光标更改为自定义光标 例如 我想用我自己的代替 DnD 期间的默认链接光标 有没有办法
  • XCode 4.2.1 上的临时分发 - 权利

    我正在尝试构建我的应用程序以进行临时分发 在 TestFlight 上 我已阅读所有说明并进行了大量网络搜索 我的问题是如何在 Xcode 4 2 1 上创建 entitlements plist 所有说明均表示转到 新建文件 然后在代码签
  • 使用动作监听器获取 JButton 的文本

    有没有理由getText导致error cannot find symbol在代码中显示的动作侦听器内 另外 如果有 我该如何修复这个错误 class openNewPaneActionListener implements ActionL
  • jquery中仅选择第一级元素

    如何仅选择父级的链接元素 ul 从这样的列表中 ul li a href Link a li li a href Link a ul li a href Link a li li a href Link a li li a href Lin
  • 重写实例上的特殊方法

    考虑以下代码 gt gt gt class A object pass gt gt gt def repr self return A gt gt gt from types import MethodType gt gt gt a A g
  • wp_get_attachment_url() 中不带域名的文件路径

    wp get attachment url 处理完整文件路径 例如 http example com wp content uploads 2014 12 aura mp3 我想要没有的网址http example com 所以 我想要上面
  • 在外部库协议中添加和使用新方法时发出警告

    我正在使用外部库 并且我的视图控制器之一正在注册为该框架中的类的委托 现在 在一个地方我想在这个委托类上执行一些代码 我正在为此编写一个方法并在我的委托上调用它 现在 一切正常 但我收到一条警告 称这个新添加的方法不是协议的一部分 这是我的
  • 正则表达式仅允许 1 个字符

    rex lt gt i 我在使用这个正则表达式时遇到了问题 这个想法是检查输入字段中是否存在某些字符 如果存在 则抛出错误 对于每个长度超过 1 个字符的字符串 此正则表达式会引发错误 谁能告诉我我做错了什么 编辑 人们说他们不明白我想用这
  • ruby:批量初始化实例变量

    有没有一种简单的方法来批量分配实例变量 def initialize title nil label left nil label right nil color set nil title title label left label l
  • 为什么在初始化 Spring 时会出现 NullPointerException

    我在服务器上运行批处理作业时遇到问题 而它在我的开发工作站上的 Eclipse 中运行良好 我已经使用 Roo 设置了 Spring 环境 创建了一个实体 并制作了一个可以完成一些工作的批处理 并在我的开发盒上对其进行了良好的测试 我初始化
  • 如何在 Firemonkey 中使用动画 gif?

    如何在 Firemonky 中使用动画 GIF 我可以使用 Timage 加载 gif 但它不是动画 我正在使用 Delphi 10 2 东京 也许有点晚了 但在此页面上找到了一个简单的解决方案 http www raysoftware c
  • Python 将空格分隔的文件行读取为单独的行

    这是在 Windows Server 2008 R2 上 我有一个输入文件 每行一个输入 一些输入中包含空格 我尝试使用下面的简单代码 但它分离出每个单词而不是每行 我最终应该有 208 个新文件夹 删除所有空格 但因此我最终得到 230
  • 为 .NET 5 Core 控制器单元测试模拟或创建实用的 ODataQueryOptions

    我正在将现有的 API 迁移到 net 5 并且面临单元测试迁移的问题 我想保留测试和测试控制器 但我找不到处理 ODataQueryOptions 的方法 因为此类已更改 我无法再找到创建 ODataQueryOptions 的方法 与我
  • JOptionPane - 检查用户输入并防止关闭,直到满足条件

    请有人告诉我是否有一种方便的方法可以防止JOptionPane除非满足用户输入字段的条件 否则单击 确定 后关闭 或者我别无选择只能使用JFrame 到目前为止我的验证逻辑 似乎不起作用 因为由于某种原因这些按钮是一次性可点击的 final
  • Typhoon 与 Storyboard,实例化 ViewController

    在台风中使用故事板时 如果我在程序集中执行类似的操作 id myController return TyphoonDefinition withClass BigController class configuration TyphoonD
  • 如何为 https Web 服务器创建 .pem 文件

    我使用 Node js 中的 Express 框架来创建 Web 服务器 我想使用 ssl 进行 Web 服务器的连接 创建 https Web 服务器的代码如下 var app express createServer key fs re
  • 如何在发出原始 HTTP 请求时轻松解码 HTTP-chunked 编码字符串?

    我想发出 HTTP 请求而不依赖于 cURL 和allow url fopen 1通过打开套接字连接并发送原始 HTTP 请求 Make HTTP GET request param string the URL param int wil
  • 计算 Prolog 中数字的连续出现次数

    你好 我正在尝试在 Prolog 中编写一个程序 给定一个列表 它会计算列表中每个连续元素的出现次数 如下所示 count 1 1 1 1 2 2 2 3 1 1 0 X 结果将是X 1 3 2 3 3 1 1 2 又名每个子列表是 ele