在Prolog中,可以按随机顺序选择解决方案吗?

2024-03-10

如果我有以下情况:

a(X) :- X = 1; X = 2; X = 3; X = 4.

我可以按确定性顺序生成解决方案:

?- a(X).
X = 1 ;
X = 2 ;
X = 3 ;
X = 4.

是否有任何方法可以要求系统以非确定性、随机顺序产生解决方案?例如:

?- a(X).
X = 4 ;
X = 1 ;
X = 3 ;
X = 2.

我知道我可以找到所有解决方案,然后随机选择一个(findall(X, a(X), Y), random_member(Z, Y).)但这对我来说太贵了。


可能更清楚的例子:

p(X,Y,Z) :-
  (X = a; X = b; X = c; X = d),   % (D1)
  (Y = a; Y = b; Y = c),          % (D2)
  (Z = a; Z = b; Z = c; Z = d).   % (D3)

当确定时,生成解决方案X = d, Y = c, Z = d using ?- p(X,Y,Z).总是会遍历之前的 47 个解决方案(4 * 3 * 4 = 48)。但是,如果以非确定性顺序选择析取,系统可能会选择X = d at D1, Y = c at D2, Z = d在 D3,将其生成为第一个解决方案。

这用于受限的人工智能生成的内容,因此现实世界的用例中有更多的变量。


从您在评论中所说的内容来看,我的印象是,对于您的用例来说,一个更重要的问题是:

解决方案可以是created以随机顺序?

(这是因为你说你不能把它们全部创造出来,然后choose随机的。)

To create鲍里斯暗示了一个好方法:简单地重新排序析取!

例如,在您显示的情况下:



p(X, Y, Z) :-
  (X = a; X = b; X = c; X = d),   % (D1)
  (Y = a; Y = b; Y = c),          % (D2)
  (Z = a; Z = b; Z = c; Z = d).   % (D3)
  

您可以通过交换析取的顺序(自动)创建此代码片段的声明式等效版本,例如:(X = c ; X = b ; etc.),并且每个片段都可能以不同的顺序产生解决方案。

然而,首先将其重写为可能更容易相等的版本:



p(X, Y, Z) :-
    member(X, [a,b,c,d]),
    member(Y, [a,b,c]),
    member(Z, [a,b,c,d]).
  

这样,就更容易shuffle列表并使用随机列表生成解决方案。

例如,您可以将其更改为:



p(X, Y, Z) :-
    random_member(X, [a,b,c,d]),
    random_member(Y, [a,b,c]),
    random_member(Z, [a,b,c,d]).

random_member(X, Ls0) :-
    random_permutation(Ls0, Ls),
    member(X, Ls).
  

现在,您将得到如下答案:



?- p(X, Y, Z).
X = d,
Y = Z, Z = b ;
X = Z, Z = d,
Y = b ;
X = d,
Y = b,
Z = c ;
etc.
  

请注意,这种将随机性融入代码的方法是impure:现在您的程序中存在隐式全局状态,并且您无法再轻松地重现在描述此类程序的测试用例等时所需的结果。保存溶液逻辑纯粹性 /questions/tagged/logical-purity必须进入这种状态explicit,例如通过携带随机seed作为参数之一,以便每次运行都是完全可重现的。

请注意,像这样的连词和/或目标的重新排序仅适用于pure and 单调的Prolog 的子集,因此请确保使用声明性功能,例如限制条件安全地交换目标,并增加代码的通用性!

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

在Prolog中,可以按随机顺序选择解决方案吗? 的相关文章

  • 如何在 Prolog 中修复这个循环谓词?

    为什么这不能在 Prolog 中定义 已婚 married X Y married Y X 这些类型的循环谓词不允许吗 我该如何解决它 Thanks 如果我的语法错误请原谅我 我已经有一段时间没有使用 Prolog 了 典型的解决方案是在子
  • Prolog 中的掩码

    我最近一直在尝试理解 Prolog 并且一直在搞乱 Prolog 中的列表列表 我正在尝试创建一种我想在 p 中的面具 序言 我有一个谓词 它确定 Prolog 中两个列表列表 比如说 L1 和 L2 之间的差异 并将它们保存为列表列表 比
  • Prolog 程序从列表中删除每个第 n 个元素

    您能帮我解决以下问题吗 编写三元谓词delete nth从列表中删除每个第 n 个元素 样本运行 delete nth a b c d e f 2 L L a c e false delete nth a b c d e f 1 L L 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 中的聊天机器人

    我一直在尝试在序言中创建一个聊天机器人 作为作业 到目前为止 我已经在 pl 文件中创建了一个数据库 并且列出了很多可能的对话 我知道序言是这样工作的 例如如果我们有 Chatbot good 然后我们输入 Chatbot good 它会回
  • 在 Prolog 中表达“交换性”的替代方案?

    作为一个Prolog的初学者 我发现Prolog中的交换表达式非常不直观 例如 如果我想表达 X 和 Y 属于一个家庭 例如 family X Y married X Y relative X Y father son X Y 我还应该在定
  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 在序言中减去或添加列表的列表?

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

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • Prolog 中的迷你数独求解器中途停止

    我正在学习 七周七种语言 我只是想从书中找到一个例子 它解决迷你数独网格 4x4 作者使用的是 gprolog 但我使用的是 swi prolog 无论出于何种原因 我都无法让 gprolog 在我的虚拟机上工作 但 swi prolog
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • 以系统的方式报告 Prolog 中查询失败的“原因”

    我正在 Prolog 中寻找一种方法 模式或内置功能 我可以用它来返回why一组谓词失败 至少就数据库中的谓词而言 当用户在系统中提出查询时 我试图能够说的不仅仅是 那是错误的 例如 假设我有两个谓词 blue 1如果某物是蓝色的 则为真
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • Prolog内存问题

    我想找到一种方法来分析我在序言中编写的谓词 一个巨大的谓词 的内存使用情况 我目前正在运行它swi http www swi prolog org and yap http www dcc fc up pt vsc Yap document
  • Prolog:子句在源文件中不在一起

    我有这段代码 Family tree female pen male tom male bob female liz female pat female ann male jim parent pam bob parent tom bob
  • 谓词对于列表中的所有元素都必须为 true

    我有一组事实 likes john mary likes mary robert likes robert kate likes alan george likes alan mary likes george mary likes har
  • 从终端查询不会打印任何内容

    当在命令行中运行时 这 swipl g write 42 t halt 打印 42 到STDOUT正如预期的那样 然而 这 swipl g X 42 t halt 不打印任何内容 它只是返回 我如何让它打印在 REPL 中打印的内容 即X
  • SWI-Prolog 中的跨模块“接口”调用

    这可能是 SWI Prolog 模块系统特有的 假设我们有三个 Prolog 模块 在 SWI Prolog 模块系统中 robin 在文件中robin pl arthur 在文件中arthur pl helper 在文件中helper p
  • Prolog - 如何从输入文件的给定列表中创建变量列表?

    我有一个输入谓词将文件作为列表读取 输入 文件名 列表 该列表的格式将是 9 字面意思就是下划线字符 在这里 不是一个通配符 问题是我如何编写谓词 pred List List2 然后转换所有 进入变量但保留9还在同一个位置吗 所以如果我输

随机推荐

  • 通用应用程序缺少 WriteableBitmap SaveJpeg

    我正在开发一个通用应用程序 在我的共享代码中 我尝试从网络下载图像并将图像保存到 LocalFolder 我正在使用 HttpClient 从用户给定的 url 下载图像并读取客户端响应以保存图像 我正在使用下面的代码进行保存 但无法找到
  • 带有可选逗号和点的有效数字的正则表达式

    我试图只允许使用数字和特殊字符 例如 和 允许出现在我的文本字符串中 为此我尝试了以下代码 var pattern A Za z g var nospecial lt gt g if ev ctrlKey charCode 9 charCo
  • 在 Node.js 中创建 TCP 服务器和 HTTP 服务器之间的 WebSocket

    我创建了一个TCP服务器 using Node js它监听客户端连接 我需要传输数据TCP服务器 to HTTP服务器再次在 Node js 中可能通过网络套接字 套接字 io 但是 我不知道如何创建这样的连接 以便 TCP 服务器能够通过
  • 在 D3.js (V4) 中创建分类折线图

    I m 相对地D3 js 新手 我正在可视化我的 PassengersIn 和 PassengersOut 值总线数据简单 json文件 作为参考 其中一个 JSON 对象如下所示 BusNo 1 Date 21 November 2016
  • 动态添加 Y 轴

    是否可以向 Highstock 图表添加新的 y 轴 我尝试过在选项中添加一个并重新绘制 但这似乎不起作用 HighCharts 的文档包含图表对象的 addAxis 函数 但在 HighStock 中该函数不存在 还有其他选择吗 请看一下
  • TrustZone 监控模式和 IFAR、IFSR、DFAR、DFSR

    The ARM TrustZone 监控模式 http infocenter arm com help index jsp topic com arm doc prd29 genc 009492c CACJBHJA html可以在监视模式下
  • 当前视图控制器不适用于 ios 9

    目前的视图控制器不适用于 ios 9 当我按下按钮时 它没有重定向到当前视图控制器 为什么会出现这种情况 我试过下面的代码 RegistrationViewController viewController UIStoryboard sto
  • 需要将不确定数量的整数从 stdin 读取到数组中

    所以我正在编写一个练习程序 它将整数作为标准输入的输入 将它们加载到数组中 对数组进行排序 然后输出结果 我一直在努力弄清楚 C 中的 IO 是如何工作的 这是我到目前为止所掌握的内容 如果您发现任何问题 有任何建议 请告诉我 理想情况下
  • 使用 TouchHelperCallback 部分和完全滑动 Recyclerview

    我正在尝试使用 api TouchHelperCallback 实现 Recyclerview 的部分和完全滑动 遇到了几个库 例如https github com daimajia AndroidSwipeLayout https git
  • C# 如何用直引号替换微软的智能引号?

    我下面的帖子询问了大引号是什么以及为什么我的应用程序无法使用它们 我现在的问题是当我的程序遇到它们时如何替换它们 我如何在 C 中执行此操作 他们是特殊人物吗 弯引号与方引号的区别 https stackoverflow com quest
  • 在 Angular 中组合路由和查询参数

    在 Angular 中 我必须处理以下格式的路线 sections id filter filter 即我有一个路线参数 id 和查询参数 filter 两个参数都是可选的 因此所有这些路由都是有效的并且正在被监听 sections id
  • 从 unity 运行 python 脚本,以便稍后在我的游戏中使用其输出(文本文件)

    我试图从 unity C 脚本 运行一个 python 脚本 以便稍后在我的游戏中使用它的输出 这是一个文本文件 问题是 当我在 unity 中运行 C 脚本时 没有任何反应 Python 脚本在其上运行良好 自己的 谁能告诉我我错过了什么
  • Material-UI 刷新后崩溃

    我将 Material UI 与 Next js 一起使用 我正在运行npm run dev 我的问题是 每当我按下浏览器上的重新加载按钮时 网站上的样式就会完全破坏 这是正常行为吗 似乎 Material UI 停止工作了 这是我的代码
  • ml-gradle 是否提供任何功能来根据可用区域部署林拓扑?

    ml gradle 是否提供了任何功能 让我可以在考虑可用区的情况下部署副本林拓扑 或者 MarkLogic 提供的任何 API 来了解哪个节点位于哪个可用区 以便我可以为林副本部署定义自己的逻辑 None
  • “Un-Angularize”JS 对象的快速方法

    当使用双向绑定时 Angular 会向我的深层对象结构添加扩展属性 哈希 等 很好 但我有兴趣检索对象树的 JSON 快照 其中仅包含最初属于该对象树的内容 Angular 是否提供了一种获取绑定对象的 普通 版本的方法 我不想在绑定启动之
  • 改造 2 - POST 请求变成了 GET?

    My POST请求继续发送为GET并被 API 端点拒绝 我的服务类 FormUrlEncoded POST api users Call
  • 除非定义 aws-s3 gem? @@{:instance_writer=>true}

    我正在尝试整合aws s3 https github com marcel aws s3gem 使用最新版本的 Rails 4 1 0 启动服务器时我收到此错误 aws s3 0 6 3 lib aws s3 extensions rb 2
  • 获得苹果批准后我们可以拒绝应用程序吗?

    我已经上传了新的二进制文件作为我的应用程序的新版本 在上传二进制文件时 我选择 我将发布此版本 选项 意味着我只是将其放入 保留以供开发人员发布 假设我的应用程序获得了 Apple 的批准 并且我不想发布该版本 那么我必须做什么 是否可以拒
  • Yii:将 JavaScript 添加到标头

    I need
  • 在Prolog中,可以按随机顺序选择解决方案吗?

    如果我有以下情况 a X X 1 X 2 X 3 X 4 我可以按确定性顺序生成解决方案 a X X 1 X 2 X 3 X 4 是否有任何方法可以要求系统以非确定性 随机顺序产生解决方案 例如 a X X 4 X 1 X 3 X 2 我知