在列表内计数。帮助我理解这段代码

2023-12-22

我找到了一个3年前的老问题,帮助我计算列表中变量出现的次数 https://stackoverflow.com/questions/9088062/count-the-number-of-occurrences-of-a-number-in-a-list/9088528#9088528。这个问题的答案如下。该代码有效。但我不明白如何,有人可以帮助我理解这一点吗?

这是我找到的代码的答案,用引号括起来是答案的一部分:

count([],X,0). 
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([X1|T],X,Z):- X1\=X,count(T,X,Z).

'但是请注意,第二个参数 X 应该被实例化。所以例如count([2,23,3,45,23,44,-20],23,C) 会将 C 与 2 统一。如果您想要每个元素的计数,请使用'

:- use_module(library(lists)).

count([],X,0).
count([X|T],X,Y):- count(T,X,Z), Y is 1+Z.
count([X1|T],X,Z):- X1\=X,count(T,X,Z)

countall(List,X,C) :-
   sort(List,List1),
   member(X,List1),
   count(List,X,C).

“然后你就得到了”

 ?- countall([2,23,3,45,23,44,-20],X,Y).
   X = -20,
   Y = 1  ;
   X = 2,
   Y = 1 ;
   X = 3,
   Y = 1  ;
   X = 23,
   Y = 2  ;
   X = 44,
   Y = 1  ;
   X = 45,
   Y = 1  ;
   no

我对Prolog很陌生,我只理解这段代码的一部分,就是这个

sort(List,List1),
member(X,List1),

我希望能对整个事情进行解释,特别是 Y 是如何打印的。


关于计数,首先尝试思考meaning的代码。

list_member_occ([], _, 0).       % list is empty, 0 occurrences
list_member_occ([X|Xs], X, N) :- % list has the element at the head
    list_member_occ(Xs, X, N0),  % count number of elements in the tail
    succ(N0, N).                 % the number of occurrences is the
                                 % next natural number
list_member_occ([Y|Xs], X, N) :-
    dif(X, Y),                   % head and the element are different
    list_member_occ(Xs, X, N).   % occurrences in the tail of the list
                                 % is the total number

在这段代码中,succ(N0, N)(可以说)是更好的说法“N是后面的自然数N0" than N is N0 + 1。原因之一是succ/2 http://eu.swi-prolog.org/pldoc/doc_for?object=succ/2旨在用于各个方向:

?- succ(2, 3).
true.

?- succ(X, 4).
X = 3.

?- succ(1, X).
X = 2.

... 尽管is/2 http://eu.swi-prolog.org/pldoc/doc_for?object=%28is%29/2 should与未绑定的左操作数一起使用。接受这个查询

?- list_member_occ([1,1,2,1], X, 3).

...举个例子N是一个数字而不是自由变量。

使用谓词:

?- list_member_occ([1,2,1], X, N).
X = 1,
N = 2 ;
X = 2,
N = 1 ;
N = 0,
dif(X, 1),
dif(X, 2),
dif(X, 1).

的一个有趣的属性dif/2 http://eu.swi-prolog.org/pldoc/doc_for?object=dif/2,相对于\=/2,它对变量施加了约束X在最后一个解决方案中:X从现在开始,不能采用任何值1, or 2.

因为您使用以下方式获得所有答案的原因dif/2, 考虑:

?- X = Y. % unify X and Y and succeed
X = Y.

?- X \= Y. % succeed if you cannot unify X and Y
false.

?- dif(X, Y). % succeed if X and Y are and will be different
dif(X, Y).

当你使用X \= Y,Prolog 试图统一它的论点和如果统一成功则失败。这意味着您只能得到所有自由变量彼此统一的解决方案,但您会错过自由变量彼此不同的解决方案。

有关Y = ...,当您在顶层进行查询时,它会向您报告在成功证明该查询期间进行的所有新变量绑定。作为最简单的例子:

3 和 5 之间的数字都包括哪些?

?- between(3, 5, X).
X = 3 ;
X = 4 ;
X = 5.

当然,您不需要打印出以下值X用手;只需输入分号即可获得下一个答案。在最后一个答案之后,你会得到一个句号并返回到?- prompt.

关于排序:它对整个列表进行排序,但仅shows你是排序列表的前 9 个元素。看此常见问题解答页面来自 SWI-Prolog http://eu.swi-prolog.org/FAQ/AllOutput.html。简而言之,最简单的就是输入; true查询后,确保至少有一个选择点,然后使用w and p在显示整个术语和仅显示部分术语之间切换。

?- string_chars("the quick brown fox jumps over the lazy dog", Cs), sort(Cs, S) ; true.
Cs = [t, h, e, ' ', q, u, i, c, k|...],
S = [' ', a, b, c, d, e, f, g, h|...] [write]
Cs = [t, h, e, ' ', q, u, i, c, k, ' ', b, r, o, w, n, ' ', f, o, x, ' ', j, u, m, p, s, ' ', o, v, e, r, ' ', t, h, e, ' ', l, a, z, y, ' ', d, o, g],
S = [' ', a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z] .

?- string_chars("the quick brown fox jumps over the lazy dog", Cs), sort(Cs, S) ; true.
Cs = [t, h, e, ' ', q, u, i, c, k, ' ', b, r, o, w, n, ' ', f, o, x, ' ', j, u, m, p, s, ' ', o, v, e, r, ' ', t, h, e, ' ', l, a, z, y, ' ', d, o, g],
S = [' ', a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z] [print]
Cs = [t, h, e, ' ', q, u, i, c, k|...],
S = [' ', a, b, c, d, e, f, g, h|...] .

希望这可以帮助。

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

在列表内计数。帮助我理解这段代码 的相关文章

  • Prolog 中的条件编写

    I have Prolog包含飞机时刻表的数据库 它看起来是这样的 fly id from to days 1 0 1 0 1 0 1 正如你所看到的 有 7 个值days谓词 从星期一到星期日 我想做的是每天打印 价值所在1 但将其打印为
  • prolog中输入/输出参数的区别

    Prolog谓词定义中的输入和输出参数有什么区别吗 这与其他语言 例如Scheme 和C 相比如何 我希望我理解你的问题 您应该研究一下 Prolog 中如何实现统一 因为它会让事情变得更清晰 反正 简而言之 没有内置方法可以将 Prolo
  • 如何在SWI-Prolog中启用所有统一中的发生检查?

    根据维基百科 https en wikipedia org wiki Occurs check 为所有统一提供声音统一的实现是 Qu Prolog 和 Strawberry Prolog 以及 可选地 通过运行时标志 XSB SWI Pro
  • 如何提高词法分析效率?

    在解析一个 3 GB 的大文件时DCG https www metalevel at prolog dcg 效率很重要 我的词法分析器的当前版本主要使用 or 谓词 2 http www swi prolog org pldoc doc f
  • 展平列表

    尝试解决练习 07http www ic unicamp br meidanis courses mc336 2009s2 prolog problemas http www ic unicamp br meidanis courses m
  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • 如何使用 Prolog 查找二叉树的深度

    我正在学习 Prolog 并试图找到一个深度二叉树使用 Prolog 我代表一棵树是这样的 nil is a tree tree 1 nil nil this is a leaf tree 1 tree 1 nil nil nil this
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • 在序言中减去或添加列表的列表?

    我对序言相当陌生 正在尝试摆弄列表列表 我很好奇如何添加两个列表列表或减去它们从而得到一个列表列表 如果我有两个列表 可以说 SomeList 1 2 3 4 5 6 7 8 SomeList2 1 2 3 4 5 6 7 8 我该如何添加
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • 求解序言中极其简单的方程:A = B + C?

    我有一个非常简单的方程 我希望能够在序言中求解 A B C 我希望能够编写一个谓词来表达这种关系 它可以处理任何一个未实例化的参数 无需推广到更复杂的关系或方程 myEquation A B C something 我可以使用以下语义进行调
  • 如何在 Prolog 中计算数字序列的和

    任务是计算从0到M的自然数之和 我使用SWI Prolog编写了以下代码 my sum From To From gt To my sum From To S From 0 Next is 1 S is 1 my sum Next To S
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何为有效号码指定 DCG?

    我正在尝试为有效数字指定 DCG 如下所示 value Number gt valid number Number 基本上检查指定的值是否是数字 它也可能是变量 因此有必要检查 我不知道如何构建这个valid number不过 DCG 谓词
  • 如何在 Prolog 中解决这个算术表达式难题?

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

随机推荐

  • 在 RSpec 自动化测试期间使 Sprockets 缓存失效

    在我的 Rails 应用程序中 我有一个 js erb 文件 其中有一个基于某些 Ruby 代码动态设置的变量 var myTimer 该应用程序工作正常 但我在一些自动化测试中遇到问题 该问题发生在使用此 JavaScript 的 RSp
  • xcodebuild 生成空的compile_commands.json

    我正在使用以下命令将 oclint 与 xcode 5 一起使用 步骤1 xcodebuild target OClintDemo configuration Debug scheme OClintDemo sdk iphonesimula
  • 即使定义了函数,我也必须在类中实现函数的错误[重复]

    这个问题在这里已经有答案了 我收到错误 Class QueryParameterComparer must implement Function Compare x As QueryParameter y As QueryParameter
  • CPU什么时候可以忽略LOCK前缀并使用缓存一致性?

    我原本以为MESI等缓存一致性协议可以提供伪原子性but仅跨个人内存加载 存储指示 如果我执行获取 修改 写入指令组合 仅使用 MESI 将无法在第一条指令到最后一条指令之间强制执行原子性 然而 英特尔参考手册第 3a 卷第 8 节说 8
  • java: ClassCastException - [Ljava.lang.Long;无法转换为 java.lang.Long

    我使用 red5 并使用 IConnection 类设置 获取属性 但这确实不相关 L 在java中是长的意思 所以 0L 是 0 类型长整型 而不仅仅是 0 即 0 类型整数 有什么区别 Ljava lang Long and java
  • 使用 Gulp 时如何将 React 设置为生产模式

    我需要在生产模式下运行 React 这可能需要在环境中的某个位置定义以下内容 process env NODE ENV production 问题是我在 Tornado 一个 python Web 服务器 而不是 Node js 后面运行它
  • iOS / iPhone 上的正常运行时间冻结

    有人知道为什么我使用以下方法会遇到奇怪的正常运行时间吗 NSProcessInfo processInfo NSProcessInfo processInfo NSTimeInterval systemUptime processInfo
  • 如何拆分Tailwind生成的CSS代码?

    我正在寻找一种解决方案 将 Tailwind PostCSS 插件 与 purgecss 插件结合 生成的大 CSS 文件拆分为多个 CSS 文件 每个消费者 JS 文件一个 CSS 文件 JS 文件使用的 CSS 规则可以通过查看 JS
  • Android 4G 上如何查找互联网连接是否可用?

    我使用了以下代码来了解互联网连接是否可用 它在 3G 系统上运行良好 但它不适用于 4G 技术 有人知道如何查找 4g 上的互联网连接是否可用吗 如果有人有演示代码 请提供 Code public static boolean checkC
  • 为什么 EMR 5.x 版本中取消了对 Amazon S3 的直接写入?

    读完本页后 http docs aws amazon com emr latest ReleaseGuide emr hive differences html http docs aws amazon com emr latest Rel
  • Galaxy选项卡的布局设计

    我是 Android 新人 我想为 Galaxy 选项卡设计布局以及其他布局 我设计了四种布局 布局 小 大 超大和正常布局 但是当我尝试在 Galaxy 选项卡中检查这一点时 布局被拉伸 那么我如何开发在 Galaxy Tab 中运行的布
  • 具有固定大小 FIFO 队列的生产者/消费者模式

    我需要围绕固定大小的 FIFO 队列实现生产者 消费者模式 我thinkConcurrentQueue 周围的包装类可能适用于此 但我不完全确定 而且我以前从未使用过 ConcurrentQueue 这样做的不同之处在于队列只需要保存固定数
  • (0, someFunction)() 在javascript中的含义是什么[重复]

    这个问题在这里已经有答案了 我在某人的代码中发现了这段代码 听起来像这样 0 function arg this 在我尝试像下面这样玩之后 0 function arg console log arg 2 console log 0 1 2
  • CGContextSetTextMatrix 适用于屏幕外位图吗?

    我正在使用上下文创建屏幕外图像CGBitmapContextCreate 在绘制文本时 我尝试使用 CGContextSetTextMatrix contextRef CGAffineTransformMake 1 0 0 0 0 0 1
  • 如何在 Django 中以编程方式创建用户?

    我在一个项目中有 3 个应用程序 App1 从最终用户使用 基于网络视图的应用程序 App2 从服务提供商使用 网络服务 App3 由系统管理员使用 我想为每个应用程序使用 django 身份验证系统 我可以制作 django 项目来验证
  • LOG4J 同一类中的多个记录器

    我有一个具有 log4j 日志记录的 java 项目 它使用滚动文件附加程序和多个记录器来记录到文件 我想添加一个 DBappender 并有一个单独的记录器 仅写入此附加器 其他记录器都不会向其发送消息 比如说 我需要一个类有两个记录器
  • 如何让生成器调用 Rails 3 中的其他生成器

    我正在尝试宝石开发 现在特别是发电机 到目前为止 我已经成功创建了两个能够完美完成其工作的生成器 这两个生成器位于同一目录中 然而 现在我必须分别给他们每个人打电话 我想做的就是只调用一个生成器 然后让该生成器调用所有其他生成器 只需输入
  • 允许在 django REST 框架中发布请求

    我正在使用 django REST 框架创建一个简单的 REST API 我已通过向 api 发送 GET 请求成功获得响应 但由于我想发送 POST 请求 django Rest 框架默认不允许 POST 请求 As in image b
  • 单击即可打开文本框的传单自定义控件

    我已关注这个传单教程 http www coffeegnome net control button leaflet 关于如何为我的地图创建控制按钮 单击时 我希望它打开一个简单的文本框 其中包含有关地图及其作者的信息 其概念类似于this
  • 在列表内计数。帮助我理解这段代码

    我找到了一个3年前的老问题 帮助我计算列表中变量出现的次数 https stackoverflow com questions 9088062 count the number of occurrences of a number in a