Prolog:为什么我的谓词返回 false?

2023-12-08

所以我写了一个谓词来计算一个元素在列表列表中出现的次数。

count([], _, 0).                                  #base case

count([[Elem|Rest]|OtherLists], Elem, Count) :-   #Elem is the head of sublist
    !,
    count([Rest|OtherLists], Elem, NewCount),
    succ(NewCount, Count).

count([[_|Rest]|OtherLists], Elem, Count) :-      #Elem is not the head of sublist
    count([Rest|OtherLists], Elem, Count).

count([[]|OtherLists], Elem, Count) :-            #Head sublist is an empty list
    count(OtherLists, Elem, Count).

现在,如果我使用以下命令查询谓词:

计数([[1,2,3],[4,1,5],[4,6,1]],1,X)。

它返回 X = 3,这是正确的,但如果我继续查询,它也会显示“false”。

所以它正确地计算元素,但我不能在其他谓词中使用这个谓词,因为它最终返回 FALSE。

我究竟做错了什么?


当Prolog在寻找解决方案的过程中遇到“选择点”(代码中它可以回来寻求更多可能解决方案的地方)时,它会显示该解决方案并提示您提供更多可能的解决方案。如果找不到更多内容,则显示“false”。这不是你的逻辑错误。这就是 Prolog 的工作方式。

删除选择点并不总是可取的。这取决于您的谓词目标是什么。使用剪切删除选择点的危险在于,选择点可能是通向有效替代解决方案的路径,而剪切会阻止您的程序找到这些解决方案。

让我们尝试使用答案中新建议的削减来更新程序:

| ?- count([[1,2,3],[4,1,5],[4,6,1]], 1, X).

X = 3

yes
| ?- count([[1,2,1,3],[4,1,5],[4,6,1]], 1, X).

X = 4

yes
| ?- count([[1,2,1,3],[4,1,5],[4,6,1],[1]], 1, X).

X = 5

到目前为止,一切都很好。这些看起来像是完整且正确的答案。我相信只要第一个参数完全绑定且没有变量,您的附加剪切(包括原始剪切)就会产生正确的答案。让我们尝试一个更有趣的查询:

2 ?- count([[A,2,B],[C,1,D]], 1, X).
A = B, B = C, C = D, D = 1,
X = 5.

3 ?-

谓词找到了一种解决方案。然而,不是还有更多吗?这个如何?

A = _ % something other than 1
B = C, C = D, D = 1,
X = 4.

这也是一个正确的解决方案,但谓词无法找到它。

另外,这个查询怎么样?

2 ?- count([[1,2,1,3],[4,1,5],[4,6,1],[1]], E, X).
E = 1,
X = 5.

3 ?-

同样,只找到一种解决方案。但不是还有更多吗?关于什么E = 4 and X = 2?

如果我们从原始谓词中删除所有削减以尝试获得所有正确的解决方案,那么我们也会得到错误的解决方案:

2 ?- count([[1,2],[3,1,4],[1]], 1,X).
X = 3 ;
X = 2 ;
X = 2 ;
X = 1 ;
X = 2 ;
X = 1 ;
X = 1 ;
X = 0 ;
false.
2 ?- count([[1,2,1,3],[4,1,5],[4,6,1],[1]], E, X).
E = 1,
X = 5 ;
E = 1,
X = 4 ;
E = 1,
X = 3 ;
...

因此,如果需要更多的通用性,就需要构建更有效的解决方案。

count_occurrences_lol([], _, 0).
count_occurrences_lol([List|Lists], X, Count) :-
    count_occurrences(List, X, C1),        % Count occurrences in this list
    count_occurrences_lol(Lists, X, C2),   % Count occurrences in remaining sublists
    Count is C1 + C2.                       % Total the counts

count_occurrences([], _, 0).
count_occurrences([X|Xs], X, Count) :-
    count_occurrences(Xs, X, C1),
    Count is C1 + 1.
count_occurrences([X1|Xs], X, Count) :-
    dif(X1, X),
    count_occurrences(Xs, X, Count).

现在我们得到以下信息:

3 ?- count_occurrences_lol([[1,2],[3,1,4],[1]], 1,X).
X = 3 ;
false.

正如预期的那样,只有一种解决方案。以及以下内容:

5 ?- count_occurrences_lol([[A,2,B],[C,1,3]], 1, X).
A = B, B = C, C = 1,
X = 4 ;
A = B, B = 1,
X = 3,
dif(C, 1) ;
A = C, C = 1,
X = 3,
dif(B, 1) ;
A = 1,
X = 2,
dif(B, 1),
dif(C, 1) ;
B = C, C = 1,
X = 3,
dif(A, 1) ;
B = 1,
X = 2,
dif(A, 1),
dif(C, 1) ;
C = 1,
X = 2,
dif(A, 1),
dif(B, 1) ;
X = 1,
dif(A, 1),
dif(B, 1),
dif(C, 1) ;
false.

3 ?- count_occurrences_lol([[1,2,1,3],[4,1,5],[4,6,1],[1]], E, X).
E = 1,
X = 5 ;
E = 2,
X = 1 ;
E = 3,
X = 1 ;
E = 4,
X = 2 ;
E = 5,
X = 1 ;
E = 6,
X = 1 ;
X = 0,
dif(E, 1),
dif(E, 1),
dif(E, 6),
dif(E, 4),
dif(E, 5),
dif(E, 1),
dif(E, 4),
dif(E, 3),
dif(E, 1),
dif(E, 2),
dif(E, 1).

4 ?-

正如预期的几种可能的解决方案。

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

Prolog:为什么我的谓词返回 false? 的相关文章

  • 如何在 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
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 我应该在 Prolog 和一般情况下避免尾递归吗?

    我正在阅读 立即学习 Prolog 在线书籍 以获取乐趣 我正在尝试编写一个谓词 该谓词遍历列表的每个成员并向其添加一个 使用累加器 我已经在没有尾递归的情况下轻松完成了 addone addone X Xs Y Ys Y is X 1 a
  • Prolog家谱

    我做到了 但没有显示答案 当我询问兄弟姐妹 叔叔 阿姨时 这是我写的 有什么问题吗 uncle X Y male X sibling X Z parent Z Y uncle X Y male X spouse X W sibling W
  • 通过递归扩展 Prolog 目标?

    我 最终 实现了一些目标 这些目标将根据开始由 开始之后 and duration 然而 计划目标仅接受规定数量的任务 我想扩展计划目标的功能以接受单个列表并在计划时迭代该列表 不幸的是 我认为这将需要与can run and 冲突目标如下
  • Prolog中如何选择bagof、setof和findall

    如何在 bagof setof 和 findall 之间做出选择 有什么重要的区别吗 哪个最常用 哪个最安全 感谢您的评论 回答 我检查了SWI Prolog 手册页findall 3 http www swi prolog org pld
  • Prolog - 如何从输入文件的给定列表中创建变量列表?

    我有一个输入谓词将文件作为列表读取 输入 文件名 列表 该列表的格式将是 9 字面意思就是下划线字符 在这里 不是一个通配符 问题是我如何编写谓词 pred List List2 然后转换所有 进入变量但保留9还在同一个位置吗 所以如果我输
  • 将 SWI Prolog 代码编译为 Windows 可执行文件 - 解析器 Grails3 项目

    我正在尝试构建解析器 Grails3 项目https github com RichardMoot Grail https github com RichardMoot Grail谁的教程是http www labri fr perso m
  • 如何验证涉及 diff/2 约束的交换性?

    围绕 diff 2 约束有很多炒作 特别是作为对 2 和 2 的某些非声明性的救援 这种非声明性通常被描述为非单调性 并给出了非交换性的例子 但是测试涉及 diff 2 的测试用例是否可交换的方法是什么 这是我想要做的元解释 我做了交换性测
  • SWI Prolog 转义引号

    我需要在序言中将 放在字符串周围 我从另一个程序获取输入 看起来我无法转义该程序中的 因此我必须在序言中添加 否则序言语句将不起作用 感谢您的帮助 为了讨论strings https stackoverflow com a 39922411
  • 将行读取到序言中的原子列表

    我需要将任何行 来自 user input 读入原子列表 例如 Example line which contains any ASCII chars into Example line which contains any ASCII c
  • Prolog 列表列表获取所有元素

    我有一个列表列表 decide 1 2 3 2 3 6 4 K 我想按 返回所有可能的解决方案 规则是首先返回其列表大小为 1 的值 然后我想返回其大小大于1的值 size 0 size Xs L size Xs N L is N 1 he
  • 查找列表中的最大值 - Prolog

    我刚刚接触 Prolog 并尝试编写一个谓词来查找整数列表的最大值 我需要写一个从头开始比较的内容 另一个从最后开始比较的内容 到目前为止 我有 max2 R max2 X Xs R X gt R max2 Xs X max2 X Xs R
  • Prolog 在技术上是如何工作的?引擎盖下是什么?

    我想更多地了解 Prolog 的内部结构并了解它是如何工作的 我知道如何使用它 但不是它内部如何运作 Prolog 中使用的算法和概念的名称是什么 它可能会构建某种树结构或有向对象图 然后在查询时使用复杂的算法遍历该图 也许是深度优先搜索
  • Prolog 谓词参数中实例化模式指示符的含义

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

    我需要简化序言中的身份 例如x 0 x x x 0 ETC 为此 我需要替换表达式的部分内容 比如x 0 by x 您能帮我更换吗 Prolog 的一个巧妙之处在于您可以非常轻松地解构算术表达式 您的基本模板将如下所示 simplify X
  • Prolog — 对称谓词

    我必须在序言中模拟家谱 我有对称谓词的问题 Facts parent x y male x female y age x number Rules blood relation让我头疼 这就是我所做的 blood relation X Y
  • 尝试在 Prolog 中实现交换律

    我正在尝试创建一个知识库 我的问题有terminal 1 and connected 2我定义了以下规则 connected X Y connected Y X 由于我现在明白的原因 我认为 这进入了无限递归 然后 我尝试搜索SO并发现了这

随机推荐

  • 延迟断点:类何时加载

    我正在尝试使用以下命令调试 Maven jdb attach 8000 使用后mvnDebug 我尝试设置断点 但得到 main 1 stop in DeployMojo DeployMojo Deferring breakpoint De
  • 使用 JavaScript 进行图像缩放?

    有没有人有一些好的代码来使用 javascript 放大图像 我知道我可以调整它的大小等 但我很懒 正在寻找一些聪明的东西来缩放到不同的级别 缩放时四处移动等 检查一下 jQZoom Zoomimage jQuery 插件 jQuery I
  • Eclipse 如何将 .java 文件作为小程序运行?

    我一直在尝试运行一个从命令行创建的简单小程序 我尝试这样做 C java Applet 显然这不起作用 但是 我注意到 如果我选择该类并选择作为 java applet 运行 则 Eclipse 允许我运行该 applet Eclipse
  • 如何将文档内容动态加载到iframe中?

    我想做这样的东西 A B B页面在A页面里面 我想把所有的js css都插入到A页面中 我想把B页面分开 我设计它使用一个iFrame 动态获
  • 检查单词是否存在两次? (正则表达式)[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我对正则表达式很糟糕 我想要的是检查一个字符串是否有两次 http 一词 例如 http
  • modelica:计算随时间变化的连续变量的最小值/最大值

    如上所述 我希望计算连续变量随时间变化的最小值 和 或最大值 这是一个演示的最小示例 model MinMaxTest Real u Real u min start 10 Real u max start 10 equation u si
  • 用JS发送文件到PHP服务器

    我可以使用拖放将文件从浏览器发送到服务器 并且此代码工作正常 var temp new FormData temp append file content e originalEvent dataTransfer files 0 Ajax
  • Kotlin 术语“可变”是错误的吗?

    我的理解是 变量 一词指的是重新分配引用的能力 常量 意味着不能重新分配引用 Java中final和not的本质区别 var something new obj gt reference can be re assigned val som
  • 从嵌套 json 文件中删除 python dict 项

    我有一个 JSON 文件 当我尝试删除 python 字典中的项目时 我从返回 KeyError 0 的 API 中获取该文件 我认为这是我缺乏技能和 json 格式的结合 我的目标是删除所有实例192 168 1 1 from ip ad
  • Hbase 错误“错误:KeeperErrorCode = NoNode for /hbase/master”

    在 hbase shell 中执行任何命令时 我在 hbase shell 中收到以下错误 ERROR KeeperErrorCode NoNode for hbase master 启动HBASE HOSTCHND hbase 2 0 0
  • 实现可以将提示视为实际语句吗?

    在C中 register存储限定符是hint对于实现来说 应该尽可能快地访问此类标识符 例如 存储在 CPU 寄存器中 6 7 1具有存储类说明符寄存器的对象的标识符声明表明对该对象的访问应尽可能快 这些建议的有效程度取决于实施情况 and
  • FTP从服务器直接下载文件到客户端

    我尝试将文件从 FTP 服务器下载到客户端 如果我使用ftp get 文件被下载到PHP服务器 PHP服务器可以将输出写入浏览器 所以下载过程是 FTP server gt PHP server gt client 这会使流量加倍 这对于下
  • 如何在服务方法中完全运行后台进程?

    您好 任何人都可以告诉我如何在没有活动的情况下在服务中运行此代码 我已经在活动中完成了此代码 但我不希望它成为一个应用程序 我需要它在服务中只是为了在服务上显示它 谢谢我已尝试过 但我的活动每 30 分钟显示一次 这是我的代码 public
  • SwiftUI:使用切换删除单元格时索引超出范围

    我在删除包含切换的单元格时遇到问题 我的模型看起来像这样 class Model ObservableObject Published var items Item init items Item self items items stru
  • relativelayout正在全屏显示wrap_content

    Why does FOOBARZ get layed out all the way at the bottom when no elements are layout height fill parent in other words a
  • javascript 代码在 JSF xhtml 页面中不起作用

    这是运行代码fiddle您将看到它在这里工作得很好 但是当我在 xhtml 页面中使用 glassfish server 3 2 1 在 eclipse 中运行此代码时 它会给出此错误 javax servlet ServletExcept
  • 在 Web 视图中重复使用 MSAL 的访问令牌

    在我的 iOS 应用程序中 我目前正在通过MSAL iOS SDK并且运行良好 在应用程序的某个位置 我还需要显示一个网站 通过 UIWebView 打开 该网站也需要相同的 Azure AD 身份验证 由于我已经通过 SDK 进行了身份验
  • 将 OpenMP 与 Windows SDK 结合使用

    我知道 VC2010 Express Edition 不包含 OpenMP 支持 因此会报告 omp h 文件丢失 因此 我在Windows中安装了Windows SDK v7 1 64位版本 然而 即使我跑了 set DISTUTIL U
  • 检查字符串中的特殊字符(/*-+_@&$#%)?

    如何检查字符串以确保它仅包含数字 字母或空格 在 C 中这很简单 private bool HasSpecialChars string yourString return yourString Any ch gt char IsLette
  • Prolog:为什么我的谓词返回 false?

    所以我写了一个谓词来计算一个元素在列表列表中出现的次数 count 0 base case count Elem Rest OtherLists Elem Count Elem is the head of sublist count Re