Prolog中具有单面统一的Quine算法

     2023-05-08     260

关键词:

【中文标题】Prolog中具有单面统一的Quine算法【英文标题】:Quine's algorithm with Single Sided Unification in Prolog 【发布时间】:2021-05-16 22:45:03 【问题描述】:

SWI-Prolog 的新版本 8.3.19 引入了单面统一 在新的 Picat 样式规则中。这可能是一个受欢迎的补充 序言系统。我想知道我们是否可以重写Quine算法

Quine算法的Prolog实现https://\***.com/q/63505466/502187

Picat 样式规则以及这是否可行?如果是并且如果 Quine算法的编写变得更简单,那么SWI-Prolog可能 此次添加对社区有很大帮助。

有没有人接受这个挑战? SWI-Prolog 8.3.19 已经可以从开发中获得。

【问题讨论】:

【参考方案1】:

虽然正常的统一又名双边统一与内置 (=)/2 密切相关,但模式匹配又名单边统一和内置 (==)/2 之间存在类似的关系。这些引导将起作用:

=(X,X) :- true.
==(X,X) => true.

如果我们查看 Quine 算法的代码,取自 here,我们会发现很多 (==)/2 用法。模式匹配可以直接做的工作:

simp(A, A) :- var(A), !.
simp(A+B, B) :- A == 0, !.
simp(A+B, A) :- B == 0, !.
Etc..

所以我们尝试了一下,将所有规则都转换为模式匹配。然后不再需要初始的 var/1 保护, (==)/2 也不再需要。但是我们观察到我们需要更多 (=)/2 来返回函数值:

simp(0+B, X) => X = B.
simp(A+0, X) => X = A.
Etc..

我们做了一个小基准测试并验证了来自 Principia 的 193 个命题逻辑测试用例。我们测试了正常的统一和模式匹配。我们还比较了一个尚未编译的模式匹配变体,即使用 subsumes/2 的扩展:

首先通过 subsumes/2 扩展,不编译模式匹配:

/* Jekejeke Prolog 1.5.0 */
/* normal unification */
?- time((between(1,380,_), test, fail; true)).
% Up 996 ms, GC 6 ms, Threads 984 ms (Current 02/14/21 11:30:28)
Yes

/* pattern matching */
?- time((between(1,380,_), test, fail; true)).
% Up 3,525 ms, GC 24 ms, Threads 3,500 ms (Current 02/14/21 11:42:50)
Yes

现在 SWI-Prolog 的新编译模式匹配:

/* SWI-Prolog 8.3.19 */
/* normal unification */
?- time((between(1,380,_), test, fail; true)).
% 4,940,000 inferences, 0.547 CPU in 0.534 seconds (102% CPU, 9033143 Lips)
true.

/* pattern matching */
?- time((between(1,380,_), test, fail; true)).
% 4,940,000 inferences, 0.531 CPU in 0.531 seconds (100% CPU, 9298824 Lips)
true.

我是期待编译的方式显示一个tick比较bang而不是只保存正常统一的表现?不过,这是一个好的开始。

开源:

1847 年的布尔方法,Prolog 风格https://gist.github.com/jburse/713b6ad2b7e28de89fe51b98be3d0943#file-boole-pl

1847 年的布尔方法,皮卡特风格https://gist.github.com/jburse/713b6ad2b7e28de89fe51b98be3d0943#file-boole2-pl

Picat 扩展https://gist.github.com/jburse/713b6ad2b7e28de89fe51b98be3d0943#file-picat-pl

来自 Principia 的 193 个命题逻辑测试用例https://gist.github.com/jburse/713b6ad2b7e28de89fe51b98be3d0943#file-principia-pl

【讨论】:

【参考方案2】:

除了使用基于 subsumes/2 的翻译进行单面统一之外,另一种方法是使用较低级别的单面统一。 SWI-Prolog 8.3.19 已经实现了,但我的系统的另一个答案没有显示。

我们是否找到其他也提供较低级别实现的 Prolog 系统 单面统一?事实证明是的,例如 ECLiPSe Prolog:

4.6 匹配 在 ECLiPSe 中,您可以编写使用匹配(或单向统一)而不是头部统一的子句。此类条款是 用 ?- 函子而不是 :- 编写。匹配有属性 调用者中的任何变量都不会被绑定。

ECLiPSe - 教程介绍 第 47 页(逻辑第 37 页)http://eclipseclp.org/doc/tutorial.pdf

我们也在我们的系统中添加了这样的运算符。规则现在写成如下:

simp(0+B, X) ?- !, X = B.
simp(A+0, X) ?- !, X = A.
Etc..

现在我们又回到了平时的表现:

/* Jekejeke Prolog 1.5.0 */
?- time((between(1,380,_), test, fail; true)).
% Up 1,067 ms, GC 11 ms, Threads 1,032 ms (Current 02/14/21 21:43:56)
Yes

注意!

开源:

1847 年的布尔方法,ECLiPSe 风格https://gist.github.com/jburse/713b6ad2b7e28de89fe51b98be3d0943#file-boole3-pl

【讨论】:

Prolog 匹配 vs miniKanren 统一

】Prolog匹配vsminiKanren统一【英文标题】:PrologmatchingvsminiKanrenunification【发布时间】:2016-02-1811:39:34【问题描述】:在Prolog-人工智能编程中,Bratko在第58页说了以下内容。“Prolog中的匹配对应于所谓的逻辑统一。但是,我们避免... 查看详情

Prolog中术语的统一

】Prolog中术语的统一【英文标题】:UnificationoftermsinProlog【发布时间】:2020-02-2713:04:32【问题描述】:我有以下条款:T1=f(f(3,Z,2),f(I,Z,G),Z)T2=f(F,f(R,f(5,2),D),f(3,2,F))我必须统一这些术语。我的想法是:G=(3,Z,2)I=(5,2)I=(3,2,F)我知道如何... 查看详情

最通用的统一器(Prolog)

】最通用的统一器(Prolog)【英文标题】:MostGeneralUnifier(Prolog)【发布时间】:2021-04-2207:06:45【问题描述】:有一个关于prolog中m.g.u(最通用的统一符)的快速问题。我们被问到m.g.u是什么:f(X,g(Y,h(Z)))=f(Z,g(P,h(a))).有2个可能的答... 查看详情

Prolog - 复杂术语的统一

】Prolog-复杂术语的统一【英文标题】:Prolog-Unificationofcomplexterms【发布时间】:2021-10-3002:52:43【问题描述】:我目前正在准备AI考试,我最后要复习的是Prolog。您可以在下面看到我要解决的问题:如果可能,将uncle(brother(W),Q)与unc... 查看详情

人工智能语言的lisp和prolog

参考技术A函数型语言LISP和逻辑型语言PROLOG都适合作符号处理,都适合于结构化程序设计(LISP提供了函数定义,prolog提供了谓词定义),都具有递归功能(prolog还具有自动回溯功能),都具有人机交互能力(prolog还特别适合于推理),也... 查看详情

Prolog中是不是可以接受具有可变数量的谓词?

】Prolog中是不是可以接受具有可变数量的谓词?【英文标题】:IsapredicatewithvariablearityacceptableinProlog?Prolog中是否可以接受具有可变数量的谓词?【发布时间】:2012-01-0805:20:33【问题描述】:Prolog中是否可以有一个“可变数量谓词... 查看详情

检测和删除最少数量的不一致事实的算法(可能在 PROLOG 中)?

】检测和删除最少数量的不一致事实的算法(可能在PROLOG中)?【英文标题】:Algorithmtodetectandremoveleastnumberofinconsistentfacts(probablyinPROLOG)?【发布时间】:2014-11-0719:53:28【问题描述】:你如何编写以下算法?想象一下这样的“事实... 查看详情

单面统一可以改善错误处理吗?

】单面统一可以改善错误处理吗?【英文标题】:Cansinglesidedunificationimproveerrorhandling?【发布时间】:2021-05-2022:14:49【问题描述】:受question的启发,我正在努力强化错误处理反向/2。所以我尝试了这个实现:reverse(X,Y):-reverse(X,[],Y... 查看详情

像 Prolog 一样统一数据框列以删除重复项

】像Prolog一样统一数据框列以删除重复项【英文标题】:UnifydataframecolumnslikeinPrologtoremoveduplicates【发布时间】:2021-06-2104:22:24【问题描述】:我正在学习numpy和pandas,所以如果我没有使用正确的术语或者我问了一些愚蠢的问题,... 查看详情

更改参数顺序时,Prolog 统一被破坏

】更改参数顺序时,Prolog统一被破坏【英文标题】:Prologunificationbrokenwhenargumentorderischanged【发布时间】:2021-02-1305:47:27【问题描述】:我似乎无法理解这一点。考虑以下虚拟谓词:foo(X,a):-X<10.foo(X,b):-X>20.咨询时:?-foo(1,a).tru... 查看详情

prolog简介

  一般来说,人工智能语言应具备如下特点: 1、具有符号处理能力(即非数值处理能力);2、适合于结构化程序设计,编程容易;3、具有递归功能和回溯功能;4、具有人机交互能力;5、适合于推理;6、既有把过程与说... 查看详情

Prolog:为啥这个谓词找到了答案却忽略了它并继续与[]统一?

】Prolog:为啥这个谓词找到了答案却忽略了它并继续与[]统一?【英文标题】:Prolog:whythispredicatefindstheanswerbutignoresitandgoesontounifywith[]?Prolog:为什么这个谓词找到了答案却忽略了它并继续与[]统一?【发布时间】:2020-01-2905:23:35... 查看详情

根据Prolog中公共子树的数量,树之间的递归相似度

】根据Prolog中公共子树的数量,树之间的递归相似度【英文标题】:RecursivesimilaritybetweentreesaccordingtothenumberofcommonsubtreesinProlog【发布时间】:2013-05-0516:29:35【问题描述】:我正在使用SWIProlog研究Prolog,我发现这个代码sn-p有很多... 查看详情

prolog中的哈希表

】prolog中的哈希表【英文标题】:Hashtablesinprolog【发布时间】:2010-11-2120:38:17【问题描述】:前几天我在prolog中解决了一个难题,并意识到如果我使用另一种编程语言,我会使用哈希表/字典,但据我所知,这在prolog中是不可能... 查看详情

自定义 Prolog 算术函数

】自定义Prolog算术函数【英文标题】:CustomPrologarithmeticfunction【发布时间】:2010-11-1421:49:25【问题描述】:我正在寻找类似内置算术运算符的东西,它在Prolog(特别是在SWI-Prolog)中具有返回值。例如。如果你运行Ais(1+2)+(3+2).,... 查看详情

Prolog 回溯 VS Rete 回溯

】Prolog回溯VSRete回溯【英文标题】:PrologbacktrackingVSRetebacktracking【发布时间】:2018-07-0706:37:46【问题描述】:在我的课堂上,我学习了Prolog回溯算法和Reteforprop算法,但我也被告知Rete可用于进行反向传播。它是如何工作的?它在... 查看详情

与 STO 检测统一

...detection【发布时间】:2015-08-1221:28:19【问题描述】:在ISOProlog中,统一仅针对NSTO(不受发生检查)的情况定义。背后的想法是涵盖那些主要用于程序中并且实际上被所有Prolog系统支持的统一案例。更具体地说,ISO/IEC13211-1:1995内... 查看详情

Prolog 中的返回值

】Prolog中的返回值【英文标题】:ReturnvalueinProlog【发布时间】:2016-07-1416:16:44【问题描述】:我发现Prolog中的一些“函数”会返回一些值,例如min/2和max/2等,尽管绝大多数只返回true或false。这些调用或分组与布尔值不同吗?除... 查看详情