在 F# 中模拟 Prolog 回溯

2023-12-26

我目前正在参与一个项目,开发一个应用程序,该应用程序能够考虑一组节点和连接,并找到两个节点(在允许的连接上)之间的最短路径(一个常见且众所周知的问题)。好吧,我实际上不必从零开始构建应用程序,而只需要“转换”f# 中的 Prolog 预先存在的应用程序。 我想我对此有所了解,最后问自己一个问题:“我可以创建一个能够接受 Prolog 等事实并使用它们进行查询或其他操作的程序,而不是开发一种特殊用途的解决方案并实现专门与该问题相关的新算法相似的?”。

通过这样做,我将创建一组事实(就像在 Prolog 中一样),然后使用它们进行查询。 因此,现在考虑这个新问题(在 F# 中转换 Prolog),我需要找到一种方法来创建如下事实:

myfact1(el1, el2,..., eln).
myfact2(el1, el2,..., elm).
...
myfactk(el1, el2,..., elp).

类似语法的内容,例如:

fact factname1: el1 el2 ... eln;
fact factname2: el1 el2 ... elm;
...
fact factnamek: el1 el2 ... elp;

我知道 F# 非常适合解析,所以我认为解析它可能不会有问题。

好的!现在它已经被解析了,我应该定义一个算法,在解析代码时,将所有事实存储在某种知识中(只不过是一个表)。为了建立所有需要的关联。

例如,解决方案可能是考虑所有关联的哈希表

factname1 -> el1
factname1 -> el2
...
factname1 -> eln
factname2 -> el1
factnale2 -> el2
...
factname2 -> elm
factname3 -> el1
...
...
factnamek -> el1
factnamek -> el2
...
factnamek -> elp

通过这样做,我将始终能够解决疑问。 例如,考虑以下 Prolog 事实

mother(A, B) % This means that A is mother of B
mother(C, D)

在 F# 中我创建

事实母亲:A B; 事实母亲:C D;

我的哈希表是:

妈妈 -> A |乙 妈妈 -> C | D

第一个列是事实名称,第二个列是值(这里是一个元组)。

如果我想搜索:“谁是 B 的母亲” --> 我搜索母亲,并寻找值,我找到 B,我在元组中查找并发现 A!

嗯,看起来很有效。 但事实很容易实现。规则呢? 例如规则父母:

parents(A, B, C) :- mother(A, C), father (B, C)

在 F# 中使用我的语法?好吧,我想出了这个主意:

rule parents: A, B, C => mother A C and father B C

当我的解析器遇到规则时,它应该做什么?我想像我一样在表中创建某种记录,并且稍后能够进行查询以指定主题并获取其父母或指定父亲并获取所有儿子等等...... 你会怎么办?


There 是一个类似的问题 https://stackoverflow.com/questions/4299948/f-and-fuzzy-logic/4300010#4300010最近关于将类似 Prolog 的程序集成到 F# 中。

F# 没有任何内置支持执行基于回溯的搜索(如 Prolog)。您基本上有两个选择:

  • 自己使用递归和编码回溯在 F# 中重新实现该算法。
  • 实现 Prolog 解释器并使用一些可区分的联合来表示事实。

为了实现最短路径搜索,我可能会直接在 F# 中实现算法(使用函数式编程会非常方便,并且没有特别的理由使用 Prolog)。

如果你想实现一个解释器,你可能会使用一个可区分的联合,它允许你与父母一起重写你的示例,如下所示:

type Var = Var of string
type Expression = 
  | Binary of string * Expression * Expression
  | Fact of string * Expression list
  | Ref of Var
type Rule =
  | Rule of string * Var list * Expression

/// Simplified syntax for writing And
let And(a, b) = Binary("and", a, b)

let a, b, c = Var("A"), Var("B"), Var("C")
Rule("parents", [a; b; c], 
  And(Fact("mother", [Ref a; Ref c]), Fact("father", [Ref b; Ref c])))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 F# 中模拟 Prolog 回溯 的相关文章

  • HTML 和 BeautifulSoup:当结构事先不知道时如何迭代解析?

    我从一个简单的 HTML 结构开始 如下所示 感谢 alecxe 的帮助 我能够创建这个 JSON 字典 u Outer List u Inner List u info 1 u info 2 u info 3 使用他的代码 from bs
  • ANTLR4 在导入时找不到语法

    我正在尝试将 ANTLR4 语法拆分为多个文件 以便我可以更轻松地测试它们 我在 java 项目中使用 gradle 作为构建工具 两种语法都单独正确编译 但是当我将导入添加到我的主语法中时 我收到下一个编译错误 错误 110 kaneko
  • 是否可以在 F# 类型提供程序中使用 System.Type 作为静态参数?

    我想知道是否可以使用 System Type 作为 F 类型提供程序中的静态参数 以便我可以编写如下内容 type HelperType HelperProvider
  • .Net 中可用的并行技术

    我是 Net 平台的新手 我查了一下 发现 Net中有几种做并行计算的方法 任务并行库中的并行任务 即 Net 3 5 PLINQ Net 4 0 异步编程 Net 2 0 异步主要用于执行 I O 繁重的任务 F 有简洁的语法支持这一点
  • XAML解析异常

    我有一个简单的 XAML 页面 当它作为 Visual Studio 中任何应用程序的一部分加载时 加载效果良好 但是 当我使用 ClickOnce 部署此应用程序时 出现以下异常 Type System Windows Markup Xa
  • int -> int list 与类型 int -> IEnumerable<'a> 不兼容

    Given open System Linq 这是一个可以接受的表达方式 2 3 4 SelectMany fun n gt 1 n 但这不是 2 3 4 SelectMany fun n gt 1 n 错误消息显示 int gt int
  • 在压缩存档内的文本文件上运行“head”,而不解压存档

    问候 我接手了之前的团队并编写了处理 csv 文件的 ETL 作业 我在 ubuntu 上结合使用 shell 脚本和 perl csv 文件很大 它们以压缩档案形式到达 解压后 很多都超过 30Gb 是的 那是 G 旧进程是在 cron
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng
  • AWK:递归下降 CSV 解析器

    响应一个BASH 中的递归下降 CSV 解析器 https codereview stackexchange com questions 11727 need some advice or help with translation and
  • 如何在 F# 中实现返回 void 的接口成员

    想象一下 C 中的以下接口 interface IFoo void Bar 我如何在 F 中实现这一点 我在 30 分钟的在线搜索中找到的所有示例都仅显示具有返回类型的示例 我认为这在函数式风格中更常见 但在这种情况下我无法避免 这是我到目
  • 使用 Perl 获取 值

    因此 我有一个报告工具 可以在 HTML 文件中输出作业调度统计信息 并且我希望使用 Perl 来使用这些数据 但我不知道如何单步浏览 HTML 表 我知道如何使用 jQuery 来做到这一点 find tr each function v
  • Prolog DCG set_prolog_flag double_quotes 源代码指令位置很重要;文档?

    我通过 SWI Prolog 惨痛地了解到 Prolog 指令的位置set prolog flag重要的是源代码文件 我发现的关于使用指令加载源代码文件的唯一有价值的文档位于加载Prolog源文件 http www swi prolog o
  • F# 之于 IronPython/IronRuby 就像 C# 之于 VB.NET 一样?

    我刚刚听了Chris Smith 谈论 F 的播客 http www code magazine com codecast index aspx messageid 7feb501f 25c8 432a 9624 97082f1e75e8他
  • 将数组的每个元素解析为整数

    我有一个字符串 需要将其拆分为一个数组 然后对数组的每个元素执行数学函数 目前我正在做这样的事情 实际上 我什么也没做 但这是一个非常简单的例子来解释我的问题 var stringBits theString split var resul
  • 冒号 (:) 在 Swi-Prolog 中到底代表什么?

    我无法明确找到 代表什么prolog http www swi prolog org pldoc doc for object op 3 在交互模式下您可以看到以下证据 display a b a b true display a b c
  • 搜索引擎如何找到相关内容? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Google 在解析网络时如何找到相关内容 例如 Google 使用 PHP 原生 DOM 库来解析内
  • 伊德里斯统一意外失败

    我正在尝试在 Idris 中创建一个所谓的可判定解析器 起初我只是想解析自然数 但遇到了一个意想不到的问题 生成它的代码的最小示例如下 data Digit Char gt Type where Zero Digit 0 One Digit
  • 替换 prolog 中的部分表达式

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

    我想用 ANTLR4 解析 PostScript 代码 我完成了语法 但是一种特定的语言扩展 由其他人引入 很难被识别 一个简短的例子 1 This is a line comment 2 The next line just pushes

随机推荐

  • CActiveForm 和 ajaxSubmitButton 不起作用

    这是我的代码
  • 无法定义元组的类型:目标需要 2 个元素,但源可能更少

    我正在尝试填充一个由元组组成的数组 const countries sg my th const platforms ios android const combinationsToQuery platforms flatMap platf
  • wxWidgets运行时错误(版本不匹配)

    我在启动程序时遇到问题 致命错误 检测到程序和库构建版本之间不匹配 该库使用3 0 wchar t C ABI 1010编译器 wx容器 兼容2 8 并且您的程序使用3 0 wchar t 使用C ABI 1009的编译器 wx容器 与2
  • BackgroundWorker 从外部类报告进度?

    我有一个工作解决方案 可以将进度和文本报告给进度条以及应用程序主窗体上的标签 我现在已将我的工作方法移至一个类 以便可以跨多种形式访问它们等 在工作方法中是BW ReportProgress 将进度和文本推回到主窗体中的Background
  • Android:将图像上传到PHP服务器

    我编写了一个脚本来将从相机拍摄的图像上传到我的服务器 我明白了200OK响应 但我在服务器的 uploads 文件夹中看不到我的图像 也许我的脚本包含错误 请问你能帮帮我吗 我的例子是以下链接 这是完整的 Android 类 import
  • 编写带有 NOT EXISTS 子句的查询,但不使用 NOT EXISTS 的子查询

    我有兴趣为需要使用的应用程序编写查询NOT EXISTS子句检查行是否存在 我正在使用 Sybase 但我想知道 SQL 中是否有一个示例 您可以在其中编写一个具有NOT EXISTS没有嵌套子查询的子句NOT EXISTS 所以而不是 S
  • 如何在 Ada 中从其他字符串构建字符串?

    我想在日志文件中输出标题行 然后在数据之前输出一行 为此 我创建了一个标题字符串 然后输出相同数量的 但下面的代码总是失败并出现 CONSTRAINT ERROR 因为生成的字符串不是 1024 个字符 在 Ada 中 字符串赋值需要完全相
  • 如何从函数返回 char 数组?

    我尝试过以下方法 char 10 testfunc char 10 str return str 最好作为输出参数 void testfunc char outStr char str 10 for int i 0 i lt 10 i ou
  • 从 Maven 中排除 TestNG 组

    我有一些缓慢的测试 这些测试依赖于我不想在每次使用 Maven 构建项目时运行的数据库 我已将 exceptGroups 元素添加到我的 pom 文件中 如下所述http maven apache org plugins maven sur
  • 黑莓上的应用程序详细信息

    我想开发一个应用程序来获取黑莓上其他已安装应用程序的详细信息 有没有可能 是的 您可以使用CodeModuleGroupManager loadAll http www blackberry com developers docs 6 0
  • 如何降级Webpack版本?

    我已经通过 NPM 在我的 ASP NET core Web 项目中安装了 Webpack 现在 webpack 的版本是 2 4 1 但是 我需要安装以下版本的 webpack 2 1 0 beta 25 我尝试使用以下命令 npm in
  • 如何在android中缓存listview数据?

    我有一个包含 100 行的列表视图 这是我第一次从 Web 服务加载所有数据 我想缓存该数据 这样如果我打开该页面 我应该从缓存而不是从 Web 服务获取它 我怎样才能做到这一点 如果您的数据足够简单 只需将它们存储在数组中并使用类似的东西
  • java JGraphx 保存为图像

    有谁知道如何将 JGraphx 导出为任何格式的图像 如果没有 那么有人知道任何其他java库可以让我创建简单的图表然后将其保存为图像吗 对于 PNG 格式应该这样做 BufferedImage image mxCellRenderer c
  • Vapor Xcode 项目中两个几乎相同的目标

    我想配置 Package swift 以便一个目标成为另一个目标的扩展 它们都应该共享一个文件夹中的相同代码 但对于 扩展 版本 还有一个额外的子文件夹 但我尝试使用的配置path因 重叠源 错误而失败 那么 如何使两个目标具有相同的源文件
  • 更改行 extjs4 的背景颜色

    我有一个名为 grid 的网格 并且加载时有行被插入到网格中 有些行将显示为绿色 则表示已成功输入行 而背景颜色为红色的行将出现错误 我让它在某个时候工作 但错误行将被添加到网格中 其背景色为红色 然后 当我尝试添加新行以输入新数据时 所有
  • 如何使 AuthorizeEndpointPath 在 ASP.NET Oauth 2.0 框架中工作

    我目前有一个网站 我正在尝试实现 OAuth 服务器框架 该网站目前是 Web Forms 不是 MVC 和 Web API 2 的组合 出于我想要做的目的 我们无法更改系统的整体架构 到目前为止 我通过 Web API 使用 OAuth
  • RXJava 如何尝试在 x 时间后获取下一个

    我想每 x 秒使用改造调用一次 Web 服务 直到引发 y 条件 我想跑OrderApi getx 秒后直到响应为空 public class OrderApi public static Observable
  • Notepad++搜索和替换:删除每行“/”后面的所有内容

    我有一个纯文本文件 内容如下 pre ra RN pre rie Z pre r c zZ pre u c 问 如何删除之后的所有字符串 Notepad 中每一行的符号 期望的输出 pre ra pre rie pre r c pre u
  • Kubernetes PetSet DNS 不工作

    我有一个 Kubernetes PetSet 名称为 elasticsearch和服务名称 es 它确实创建了 pod 并且正如预期的那样 它们的名称如下elasticsearch 0 and elasticsearch 1 但是 DNS
  • 在 F# 中模拟 Prolog 回溯

    我目前正在参与一个项目 开发一个应用程序 该应用程序能够考虑一组节点和连接 并找到两个节点 在允许的连接上 之间的最短路径 一个常见且众所周知的问题 好吧 我实际上不必从零开始构建应用程序 而只需要 转换 f 中的 Prolog 预先存在的