11 月 19 - 20 日 Apache Pulsar 社区年度盛会来啦,立即报名! 了解详情
写点什么

Prolog 匹配

  • 2019-12-11
  • 本文字数:1128 字

    阅读完需:约 4 分钟

Prolog 匹配

这篇 post 有两个主要的目的:


  1. 讨论 Prolog 中的匹配, 解释匹配(match)与相等的不同.

  2. 使用 Prolog 搜索的机制解决一些问题.


##Matching


Prolog 中有三种不同的 term, 分别的 constants, variablescomplex terms.


接下来我们解释一下两个 terms 是如何匹配的.


当两个 term 含有相等, 或者两个 term 中的变量在被绑定为指定值之后, 两个 term 相等时, 两个 term 匹配.


也就是说, 以下的 term 都会匹配:


  • mia = mia.

  • 42 = 42.

  • mia = X.

  • X = Y.

  • friends(john,X) = friends(Y,tom).


接下来我们对匹配进行更精确的定义:


  1. 如果 term1 和 term2 都是常量, 那么只有当两者是相同的原子或者相同的数字, term1 term2 匹配.

  2. 如果 term1 是变量, term2 是任意类型的 term, 那么 term1 和 term2 匹配, term1 会被绑定为 term2.

  3. 如果 term1 term2 是 complex term, 那么在下面情况下, 它们会匹配

  4. 它们含有相同的名字和参数数量.

  5. 它们对应的参数匹配.

  6. 变量的绑定是兼容的, 同一个变量不会同时绑定为两个值.

  7. 两个 terms 只有在上述 3 个条件之一成立时, 才会匹配.


匹配有什么作用呢? 我们可以使用匹配来为我们提供更强大的抽象能力:


vertical(line(point(X,Y),point(X,Z))).horizontal(line(point(X,Y),point(Z,Y))).
复制代码


这两行 Prolog 代码并不是规则, 而是事实, 我们可以使用匹配的能力, 写出这两个规则, 这样我们就可以轻易地判断一条直线是否是垂直的或是水平的.


?- vertical(line(point(1,1),point(1,3))).true
复制代码


同样我们也可以利用匹配来寻找与某一点构成垂线的点.


?- vertical(line(point(1,1),point(X,4))).X = 1.
复制代码


同样我们也可以利用 Prolog 的匹配解决更加复杂更加困难的问题.


现在我们有 6 个单词, 我们需要将它们填入下面的拼图里:


word(abalone,a,b,a,l,o,n,e). word(abandon,a,b,a,n,d,o,n). word(enhance,e,n,h,a,n,c,e). word(anagram,a,n,a,g,r,a,m). word(connect,c,o,n,n,e,c,t). word(elegant,e,l,e,g,a,n,t).
复制代码



我们可以通过 Prolog 得出答案, 只需要将需要满足的条件写在 predicate 里:


crosswd(V1,V2,V3,H1,H2,H3):-    word(V1,_,A,_,B,_,C,_),    word(V2,_,D,_,E,_,F,_),    word(V3,_,G,_,H,_,I,_),    word(H1,_,A,_,D,_,G,_),    word(H2,_,B,_,E,_,H,_),    word(H3,_,C,_,F,_,I,_),
复制代码


这样我们就可以得到结果:


?- crosswd(H1,H2,H3,V1,V2,V3).H1 = abalone,H2 = anagram,H3 = connect,V1 = abandon,V2 = elegant,V3 = enhance ;H1 = abandon,H2 = elegant,H3 = enhance,V1 = abalone,V2 = anagram,V3 = connect ;false.
复制代码


Prolog 中匹配的能力非常强大, 其实它就是对已经有的条件和数据进行搜索, 尝试所有的答案, 最后给出满足条件的所有结果, 能够极大的降低我们的计算量.


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/prolog-pi-pei-2


2019-12-11 15:24349

评论

发布
暂无评论
发现更多内容

架构师训练营第六周作业

talen

[译] 图说前端-图解 React

梦见君笑

大前端 React 框架

[译] 图解前端-深入理解 Props 和 State

梦见君笑

大前端 React 漫画编程

架构师课程第六周 作业

杉松壁

【计算机网络】如何实现可靠数据传输?

烫烫烫个喵啊

进程、线程基础知识全家桶,30 张图一套带走

小林coding

Linux 操作系统 计算机基础 进程 进程线程区别

[译] 图说前端-组件、Prop 和 State

梦见君笑

大前端 React 漫画编程

架构师训练营第六周作业--doris临时失效时序图

CATTY

时序图

每周学习总结 - 架构师培训 6期

Damon

每周学习总结 - 架构师培训 5 期

Damon

一致性hash算法及标准差验证

Damon

ARTS打卡 - Week 07

teoking

JavaScript 混淆与逆向必读之 AST 节点类型名词基础

穿甲兵

Java

观智能化浪潮如何改变产业链创新

CECBC

ARTS 04 - 使用 Gitlab + Generic Webhook Trigger 触发 Jenkins 自动化构建

jerry.mei

算法 ARTS 打卡计划 CI/CD 函数式编程 Elixir

架构师训练营第六周学习总结

CATTY

java8的parallelStream提升数倍查询效率

网站,小程序,APP开发定制

java8

万字详解加拿大央行CBDC分析报告

CECBC

手把手整合SSM框架

JavaPub

【计算机网络】为什么要三次握手四次挥手?

烫烫烫个喵啊

TCP 计算机网络

昆明市成立两大“高端”中心,区块链赋能生物医药和高原特色农业

CECBC

极客时间 - 架构师培训 - 6 期作业

Damon

ARTS-WEEK6

一周思进

ARTS 打卡计划

[译] 图说前端-图解 React Native

梦见君笑

大前端 漫画编程

技术解读:单集群如何做到2万+规模

数据湖洞见

大数据 FusionInsight 华为云 大集群

海南的七星彩网站系统盘口代码解析

网站,小程序,APP开发定制

代码

vue项目发布时去除console语句

网站,小程序,APP开发定制

使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建

jerry.mei

DevOps 持续集成 jenkins CI/CD 持续交付

编程核心能力之抽象

顿晓

抽象 编程日课

ARTS WEEK5

紫枫

ARTS 打卡计划

ARTS打卡-06

Geek_yansheng25

Prolog 匹配_文化 & 方法_Draveness_InfoQ精选文章