Prolog奇怪奇妙的思考方式

简介: Prolog奇怪奇妙的思考方式

今天在《七周七语言》中接触到了prolog,发现它的编程模式和思考方式的确比较奇怪,但同时也非常奇妙,值得学习一下。


1. prolog语言介绍


  和SQL一样,Prolog基于数据库,但是其数据由逻辑规则和关系组成;和SQL一样,Prolog包含两个部分:一部分用于描述数据,而另一部分则用于查询数据。在Prolog中,数据以逻辑规则的形式存在,下面是基本构建单元。


 事实:事实是关于真实世界的基本断言。(Babe是一头猪,猪喜欢泥巴。)

  规则:规则是关于真实世界中一些事实的推论。(如果一个动物是猪,那么它喜欢泥巴。)


查询:查询是关于真实世界的一个问题。(Babe喜欢泥巴吗?)

   事实和规则被放入一个知识库(knowledge base)。Prolog编译器将这个知识库编译成一种适于高效查询的形式。


2. 语言编译器gprolog


本文使用的编译器为:gprolog,下载地址 ftp://gprolog.univ-paris1.fr/pub/gprolog/gprolog-1.4.4.tar.gz


    使用开源软件 configure && make && make install即可


3. 谁是谁的爸爸?


样例来源:http://fengdidi.github.io/blog/2011/11/16/di-2zhang-shui-shi-shui-de-ba-ba/


   推荐阅读:http://fengdidi.github.io/blog/archives/


   假设我们有这样一个家谱图:


       


      我们现在的任务是将这个家谱图写成程序代码的形式。请打开你最喜欢的文本编辑器,输入以下代码。


      father.pl:

male(di).
male(jianbo).
female(xin).
female(yuan).
female(yuqing).
father(jianbo,di).
father(di,yuqing).
mother(xin,di).
mother(yuan,yuqing).
grandfather(X,Y):-father(X,Z),father(Z,Y).
grandmother(X,Y):-mother(X,Z),father(Z,Y).
daughter(X,Y):-father(X,Y),female(Y).

     

这段代码里面的每一行都代表一个子句(clause)。


       其中带有“:-”的子句叫做规则(rule),


       不带有”:-“的子句叫做事实(fact)。


        另外,在Prolog里面诸如”di”和”jianbo”这类以小写英文字母开头的名称我们称它们为原子(atom),以大写英文字母为开头的名称我们称它们为变量,例如上面程序里面的”X”和”Y”。顾名思义,原子是常量,即它的值是不可变的,而变量的值可以改变。最后需要讲的是,在Prolog里面”,”代表逻辑关系中的”且”,我们回在后面的章节里面看到,”;”代表逻辑关系里面的”或”。


4. 运行测试


粗体斜体表示输入。


#gprolog  

gprolog GNU Prolog 1.4.4 (64 bits)

Compiled Oct 11 2013, 09:26:50 with gcc By Daniel Diaz Copyright (C) 1999-2013 Daniel Diaz

| ?- ['father.pl'].

compiling father.pl for byte code...

father.pl compiled, 12 lines read - 1941 bytes written, 14 ms

(2 ms) yes

| ?- grandfather(X,yuqing).

X = jianbo ?

(1 ms) yes | ?-


5. 总结


学习prolog需要的是改变思考方式,使用逻辑去思考问题。prolog主要应用场合为专家系统和人工智能方面。

   具体学习可以参考《The Craft of Prolog》,《七周七语言》等。

目录
相关文章
|
资源调度 前端开发 Shell
[docker] DevContainer高效开发(第二篇):前端开发体验
上面的配置只是最基本的配置,大部分情况我们是需要自定义配置,让容器更符合我们的需求。自定义配置就需要用到 Dockerfile,这个文件是 docker 的配置文件,可以在里面安装软件,配置环境等等。Dockerfile 的语法可以参考 官方文档。然后根据自己的需求编写 Dockerfile# 设置变量,由 .devcontainer.json 中的 args 传入# 指定 node 版本# 设置编码# 设置工作目录# 挂载 volume# 设置 bash 为默认 shell。
615 0
vue3配置路由报错Catch all routes (“*“) must now be defined using a param with a custom regexp.
vue3配置路由报错Catch all routes (“*“) must now be defined using a param with a custom regexp.
602 0
企业微信接入系列-上传临时素材
简述在API接口创建企业群发时上传临时素材的操作
企业微信接入系列-上传临时素材
|
网络安全 开发工具 数据安全/隐私保护
|
5月前
|
人工智能 安全 API
AI 智能体的分类及开发
AI智能体是大模型的高阶应用,具备自主思考、规划与执行能力。本文详解其开发(LangGraph/AutoGen)、评估(成功率/幻觉率)、合规(标识与备案)、上线(容器化/可观测性)及验收要点,助力构建安全、高效、可落地的智能体系统。#AI智能体 #AI应用
|
JavaScript 前端开发 API
深入理解Node.js中的事件循环机制
【10月更文挑战第40天】本文将带你走进Node.js的核心特性之一——事件循环,通过生动的比喻和深入浅出的解释,我们不仅能够了解其背后的原理,还将掌握如何高效利用这一机制来提升我们的应用性能。让我们一起探索这个让Node.js如此与众不同的秘密吧!
|
机器学习/深度学习 缓存 人工智能
从ChatGPT聊天服务上深挖Http、WebScoket和SSE推送技术的区别
从ChatGPT聊天服务上深挖Http、WebScoket和SSE推送技术的区别
1231 1
|
机器学习/深度学习 算法 PyTorch
Pytorch的常用模块和用途说明
肆十二在B站分享PyTorch常用模块及其用途,涵盖核心库torch、神经网络库torch.nn、优化库torch.optim、数据加载工具torch.utils.data、计算机视觉库torchvision等,适合深度学习开发者参考学习。链接:[肆十二-哔哩哔哩](https://space.bilibili.com/161240964)
651 0
|
机器学习/深度学习 并行计算 Java
谈谈分布式训练框架DeepSpeed与Megatron
【11月更文挑战第3天】随着深度学习技术的不断发展,大规模模型的训练需求日益增长。为了应对这种需求,分布式训练框架应运而生,其中DeepSpeed和Megatron是两个备受瞩目的框架。本文将深入探讨这两个框架的背景、业务场景、优缺点、主要功能及底层实现逻辑,并提供一个基于Java语言的简单demo例子,帮助读者更好地理解这些技术。
1526 2

热门文章

最新文章