Prolog:如何编写(和使用)一个列出所有列表排列的函数?

2023-11-27

我发现了这样一个用序言编写的朴素排序的例子,我试图理解它:

naive_sort(List,Sorted):-perm(List,Sorted),is_sorted(Sorted).

is_sorted([]).
is_sorted([_]).
is_sorted([X,Y|T]):-X=<Y,is_sorted([Y|T]).


perm(List,[H|Perm]):-delete(H,List,Rest),perm(Rest,Perm).
perm([],[]).

delete(X,[X|T],T).
delete(X,[H|T],[H|NT]):-delete(X,T,NT).

Naive_sort 调用工作正常,但我就是不明白为什么。主要问题是排列。当它被隐式调用时,它总是只返回一个值。那么在 naive_sort 函数调用中如何可能检查所有排列呢?另外,我如何修改 perm 函数来写入所有排列?


主要问题是置换函数。当它被隐式调用时,它总是只返回一个值。

Prolog 是一种总是尝试通过使用给定的公理(事实或规则)推导语句来证明语句的真实性的语言。

perm不是过程编程意义上的函数。perm是一个谓词,关于它我们告诉 prolog 两件事:

  1. 空列表是其自身的排列。
  2. List是一个排列[H|Perm]如果有一个列表Rest这样Rest删除得到H from List, and Rest是一个排列Perm.

当被问及某个列表是否是另一个列表的排列时,prolog 将尝试(递归地)应用这些推导步骤来证明这一点。如果此递归到达死胡同,即由于无法对它应用任何规则而无法证明的语句,则它会回溯。

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

Prolog:如何编写(和使用)一个列出所有列表排列的函数? 的相关文章

  • 依赖规则顺序

    为了计算两个相同长度列表之间的汉明距离 我使用foldl hamm A B 0 R 有了这个定义hamm 4 hamm A A V V hamm A B V0 V1 A B V1 is V0 1 第一条规则的删减可以防止不必要的回溯 然而
  • 如何在 GNU Prolog 中使用“long int”?

    所以基本上看来 GNU Prolog 在我的 32 位 x86 Linux 上使用 28 位整数 下面的代码无法编译 foo A A0 is 0xdeadbeef A1 is A0 gt gt 8 A2 is A0 gt gt 16 A3
  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • 为什么在具体化中将 clpfd 变量分配给实际值?

    我正在开发一个 SWI Prolog 程序 该程序使用 CLP FD 约束来找到特定问题的解决方案 为此 我碰巧需要两个列表的 未定位 重叠 那是 List La长度为A List Lb长度为 B A gt B 未定位的重叠列表是La Lb
  • Prolog 匹配 vs miniKanren 统一

    在 Prolog 人工智能编程中 Bratko 在第 58 页说了以下内容 Prolog 中的匹配对应于逻辑中所谓的统一 但是 我们避免使用 统一 这个词 因为出于效率原因 在大多数 Prolog 系统中 匹配的实现方式并不完全对应于统一
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • Prolog 罗马数字(属性语法)

    我正在做一项作业prolog questions tagged prolog扫描数字列表并应返回该列表是否是有效的罗马数字以及数字的十进制值 前任 1 roman N I N 1 true 2 当我运行我认为应该工作的程序时 十进制值总是正
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • 斜线(/)在序言中做什么?

    我有这个代码 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
  • 我应该在 Prolog 和一般情况下避免尾递归吗?

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

    当在命令行中运行时 这 swipl g write 42 t halt 打印 42 到STDOUT正如预期的那样 然而 这 swipl g X 42 t halt 不打印任何内容 它只是返回 我如何让它打印在 REPL 中打印的内容 即X
  • 将 SWI Prolog 代码编译为 Windows 可执行文件 - 解析器 Grails3 项目

    我正在尝试构建解析器 Grails3 项目https github com RichardMoot Grail https github com RichardMoot Grail谁的教程是http www labri fr perso m
  • Prolog DCG:找到最后一个元素

    我正在尝试更好地理解 DCG 的用途 为了做到这一点 我尝试将 LearnPrologNow 书中的一些练习转换为 DCG 表示法 然而 我却失败得很惨 我试图编写一个程序 仅命名列表中的最后一个元素 就这样 我只是想不出正确的 DCG 语
  • 如何验证涉及 diff/2 约束的交换性?

    围绕 diff 2 约束有很多炒作 特别是作为对 2 和 2 的某些非声明性的救援 这种非声明性通常被描述为非单调性 并给出了非交换性的例子 但是测试涉及 diff 2 的测试用例是否可交换的方法是什么 这是我想要做的元解释 我做了交换性测
  • 如何为这个“移动块”Prolog 练习实现求解谓词?

    我正在使用 Ivan Bratko 的书 人工智能编程 学习 Prolog 我发现实施拟议练习的最后部分有些困难 该练习是一个使用图形来决定如何移动块并按顺序排列它们的程序 这是与程序必须执行的操作相关的图像 正如您在上图中看到的 可以使用
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 列表中小于给定数字的数字

    xMenores xMenores X H T R Z xMenores X T Z X gt H R is H xMenores采用三个参数 第一个是数字 第二个是数字列表 第三个是一个列表 是将包含结果的变量 规则的目标xMenores
  • 序言中的“如果”?

    有没有办法在序言中执行 if 操作 例如如果变量为 0 则执行一些操作 将文本写入终端 甚至不需要 else 但我找不到 if 的任何文档 是的 ISO Prolog 中有这样一个控制结构 称为 gt 你像这样使用它 condition g
  • WAM 中的扁平化形式

    WAM 教程重构指出查询 p Z h Z W f W 需要使用以下原则进行扁平化 话虽这么说 查询扁平化形式是 X3 h X2 X5 X4 f X5 X1 p X2 X3 X4 我对外部变量的定义感到困惑 请考虑以下内容 p Z h Y a
  • json 获取 prolog 谓词

    我试图在序言中创建这个谓词 谓词json get 3可以定义为 json get JSON obj Fields Result 这是正确的 当Result可以通过以下方式恢复 中的字段链Fields 列表 从JSON obj 一个字段 代表

随机推荐