当前位置:首页 > 科技  > 软件

逻辑编程:上古人工智能语言Prolog

来源: 责编: 时间:2024-01-02 09:29:34 137观看
导读今天给大家介绍一种有趣的编程语言。它能够让计算机像侦探一样推理,像哲学家一样思考,这就是逻辑编程。逻辑编程就好比我们给计算机一个逻辑谜题,然后他通过一系列的推理,找到答案。1 逻辑编程是什么?1.1 逻辑编程的定义与

今天给大家介绍一种有趣的编程语言。jPR28资讯网——每日最新资讯28at.com

它能够让计算机像侦探一样推理,像哲学家一样思考,这就是逻辑编程。jPR28资讯网——每日最新资讯28at.com

逻辑编程就好比我们给计算机一个逻辑谜题,然后他通过一系列的推理,找到答案。jPR28资讯网——每日最新资讯28at.com

1 逻辑编程是什么?

1.1 逻辑编程的定义与特点

想象一下,如果我们可以让计算机像人类一样思考和解决问题,那会是怎样的情景?逻辑编程就是这样一种尝试,它利用逻辑学的原理,使计算机能够进行推理和解决问题。jPR28资讯网——每日最新资讯28at.com

我们只需要告诉计算机:“这是规则,这是事实,现在你告诉我答案。” 就像玩一个连环推理的游戏,每个线索都逐渐揭开谜题的一部分,最终揭示出整个故事。jPR28资讯网——每日最新资讯28at.com

逻辑编程的特点是高度抽象,不关注如何操作,而是关注“什么是真的”。jPR28资讯网——每日最新资讯28at.com

1.2 代表语言:Prolog

Prolog,即Programming in Logic,是逻辑编程的一种代表性语言。它的核心是事实和规则。让我们来看一下Prolog的基本语法:jPR28资讯网——每日最新资讯28at.com

  • 事实:在Prolog中,我们可以定义一些基本的事实。例如,philosopher(socrates). 表示“苏格拉底是哲学家”。
  • 规则:规则用于定义事实之间的关系。例如,mortal(X) :- philosopher(X). 表示“如果某人是哲学家,那么他必然是凡人”。X表示参数,大写的是变量,小写的是常量。符号 :- 表示推理关系,如果右边的表达式成立,左边的表达式也成立。
  • 查询:查询是向Prolog程序提出的问题。例如,?- mortal(socrates). 将询问“苏格拉底是凡人吗?”。?-是命令提示符,我们在后边输入要执行的命令,回车后执行并返回结果。

注意所有语句的最后都用一个点(.)表示结束。jPR28资讯网——每日最新资讯28at.com

Prolog的魅力在于它的简洁和强大。我们不需要告诉计算机如何一步步解决问题,只需告诉它规则和事实,它就能自动进行逻辑推理,最终给我们答案。jPR28资讯网——每日最新资讯28at.com

2 逻辑编程的应用领域

2.1 专家系统

专家系统是逻辑编程的一大应用,就像是拥有了一个专家顾问团队。它们可以帮助医生诊断疾病,或者帮助工程师设计复杂的机械结构。以医疗诊断为例,在Prolog中,我们可以定义一系列的症状和疾病之间的关系。例如:jPR28资讯网——每日最新资讯28at.com

disease(flu) :- symptom(fever), symptom(cough).

这条规则告诉计算机:“如果一个人有发烧和咳嗽的症状,那么他可能得了流感。”通过这样的规则,专家系统可以帮助医生诊断疾病。jPR28资讯网——每日最新资讯28at.com

2.2 自然语言理解

自然语言理解让计算机能够理解人类的语言。就像是给计算机装上了一副懂得人类语言的眼镜,它可以读懂你的邮件,理解你的指令。例如,我们可以用Prolog来解析句子的结构:jPR28资讯网——每日最新资讯28at.com

sentence(Subject, Verb, Object) :- noun(Subject), verb(Verb), noun(Object).

这条规则可以帮助计算机理解“主语 + 谓语 + 宾语”的句子结构。通过这种方式,计算机可以更好地理解用户的输入。jPR28资讯网——每日最新资讯28at.com

2.3 智能知识库

智能知识库就像是一个巨大的电子大脑,存储着海量的信息。逻辑编程让这个大脑可以自己思考和推理,帮助我们从中找到需要的知识。例如,一个关于历史人物的知识库可能包含如下规则:jPR28资讯网——每日最新资讯28at.com

born_in(bruce_lee, san_francisco).performed(bruce_lee, the_game_of_death).

通过这样的事实和规则,用户可以查询李小龙的出生地和参演过哪些电影。jPR28资讯网——每日最新资讯28at.com

3 逻辑编程如何解决问题?

3.1 建立模型

解决问题的第一步是建立一个模型。就像是搭建一座桥梁,我们需要定义桥梁的结构和支撑点。在逻辑编程中,我们定义规则或限制条件,比如:“哲学家是凡人。”jPR28资讯网——每日最新资讯28at.com

mortal(X) :- philosopher(X).

3.2 定义规则与事实

接下来,我们在模型上添加规则和事实。如果说模型是桥梁的结构,那么规则和事实就像是桥梁上行驶的车辆。例如,我们声明:“苏格拉底、柏拉图、亚里士多德是哲学家。”jPR28资讯网——每日最新资讯28at.com

philosopher(socrates).philosopher(plato).philosopher(aristotle).

3.3 推导与求解

最后,我们提出问题,比如:“谁是凡人?”逻辑编程像是一个聪明的小侦探,它会自动推导逻辑,找出所有可能的答案,比如输出:“苏格拉底、柏拉图、亚里士多德。”jPR28资讯网——每日最新资讯28at.com

Prolog 有很多实现,本文以目前比较活跃的 SWI-Prolog 为例运行这个程序。jPR28资讯网——每日最新资讯28at.com

需要先把规则和事实保存到一个文件中 mortal.pl,然后使用命令 consult 加载规则,最后执行 mortal(X). 获取结果,有多个答案时,我们输入分号(;),Prolog会继续搜索直到所有可能的答案都被找到。jPR28资讯网——每日最新资讯28at.com

图片图片jPR28资讯网——每日最新资讯28at.com

SWI-Prolog官方网站:https://www.swi-prolog.org/jPR28资讯网——每日最新资讯28at.com

可执行程序:https://www.swi-prolog.org/download/stablejPR28资讯网——每日最新资讯28at.com

Docker镜像:https://hub.docker.com/_/swipl/jPR28资讯网——每日最新资讯28at.com

源码:https://github.com/SWI-Prolog/swipl-develjPR28资讯网——每日最新资讯28at.com

4 逻辑编程的常见问题与解决方法

4.1 地图着色问题

想象一下你有一张地图,你需要用不同的颜色给每个区域上色,但相邻区域不能是同一种颜色。jPR28资讯网——每日最新资讯28at.com

(图片和解题方法来源:https://ruanyifeng.com/blog/2019/01/prolog.html)jPR28资讯网——每日最新资讯28at.com

图片图片jPR28资讯网——每日最新资讯28at.com

规则如下:jPR28资讯网——每日最新资讯28at.com

color(red).color(green).color(blue).color_solution(A,B,C,D,E) :-    color(A), color(B), color(C), color(D), color(E),    /+ A=B, /+ A=C, /+ A=D, /+ A=E,    /+ B=C, /+ C=D, /+ D=E.

如果右边有多个条件,用逗号隔开;如果要用否定表达式,在表达式前加上 /+ 。jPR28资讯网——每日最新资讯28at.com

计算速度还是比较快的,执行效果如下:jPR28资讯网——每日最新资讯28at.com

图片图片jPR28资讯网——每日最新资讯28at.com

4.2 嫌疑人推理问题

当一个侦探在解决一个案件时,他需要考虑所有嫌疑人的动机和证据。逻辑编程可以帮助侦探整理这些信息,推断出真正的罪犯。jPR28资讯网——每日最新资讯28at.com

假设规则如下:jPR28资讯网——每日最新资讯28at.com

% 犯罪嫌疑人suspect(zhangsan).suspect(lisi).suspect(wangwu).% 犯罪发生在夜晚crime_occurred(night).% 无辜的innocent(Person) :- suspect(Person), not_at_scene(Person, Time), crime_occurred(Time).% 假设我们知道Alice和Charlie在犯罪发生时有不在场证明not_at_scene(zhangsan, night).not_at_scene(lisi, night).

我们按照规则和事实就可以求解谁是无辜的,谁不能排除嫌疑,演示效果如下:jPR28资讯网——每日最新资讯28at.com

图片图片jPR28资讯网——每日最新资讯28at.com

4.3 寻找近似最优解

有时候,问题可能没有一个完美的解决方案,求解最优解的成本很高,我们找一个近似解就可以了。这里以背包问题(Knapsack Problem)举个例子,在这个问题中,我们需要在不超过背包重量限制的情况下,尽可能多地装入价值总和最大的物品。jPR28资讯网——每日最新资讯28at.com

假设我们有一系列物品,每个物品有重量和价值,以及一个背包的最大重量限制。这段代码比较复杂,也有更好的解决方案,有兴趣的可以研究下。jPR28资讯网——每日最新资讯28at.com

% 物品列表:item(物品ID, 价值, 重量).item(1, 15, 20).item(2, 20, 30).item(3, 15, 25).item(4, 22, 25).% 背包最大重量限制max_weight(50).% 检查物品组合是否超过最大重量within_weight_limit(Items, MaxWeight) :-    total_weight(Items, TotalWeight), %通过调用total_weight计算物品重量    TotalWeight =< MaxWeight.% 计算物品组合的总重量,这里是一个递归规则。% 它分两种情况:一个是空列表的总重量为0,另一个是包含至少一个物品的列表。% 对于非空列表,它计算列表头部物品的重量,然后递归地计算列表剩余部分的总重量,最后将两者相加。total_weight([], 0).total_weight([Item|Rest], TotalWeight) :-    item(Item, _, ItemWeight),    total_weight(Rest, RestWeight),    TotalWeight is ItemWeight + RestWeight.% 计算物品组合的总价值,这也是一个递归规则total_value([], 0).total_value([Item|Rest], TotalValue) :-    item(Item, ItemValue, _),    total_value(Rest, RestValue),    TotalValue is ItemValue + RestValue.% 暴力搜索所有的组合,可以看作是一种深度优先搜索% max_weight把背包的最大容量取出来% findall是Prolog内置的,把所有物品的Id取出来% subset把所有物品的组合取出来,定义见下方,结果将被绑定到变量Solution% within_weight_limit 判断方案是否在重量限制中% 如果Solution的总重量在限制范围内,这个调用会计算其总价值并将其绑定到变量Value。iterative_deepening_knapsack(Solution, Value) :-    max_weight(MaxWeight),    findall(Item, item(Item, _, _), AllItems),    subset(AllItems, Solution),    within_weight_limit(Solution, MaxWeight),    total_value(Solution, Value).% 用于查找所有可能组合(子集),这也是一个递归定义% 空列表是其自身的子集。% 如果列表的头部是E,并且Tail的一个子集是NTail,那么添加E到NTail的头部形成的列表也是原始列表的一个子集。这条规则包含列表中的第一个元素。% 无论列表的头部是什么(这里用匿名变量_表示),Tail的一个子集NTail也是原始列表的一个子集。这条规则不包含列表中的第一个元素。subset([], []). subset([E|Tail], [E|NTail]):- subset(Tail, NTail).subset([_|Tail], NTail):- subset(Tail, NTail).% 寻找近似最优解% 使用findall运行iterative_deepening_knapsack 来收集所有解决方案的价值% 使用max_list找到最高的价值% 再次运行iterative_deepening_knapsack来找到与最高价值对应的物品组合% 返回最高价值ApproxValue和对应的物品组合ApproxItems作为查询结。approximate_solution(ApproxValue, ApproxItems) :-    findall(Value, iterative_deepening_knapsack(_, Value), Values),    max_list(Values, ApproxValue),    iterative_deepening_knapsack(ApproxItems, ApproxValue).

实际运行效果如下:jPR28资讯网——每日最新资讯28at.com

图片图片jPR28资讯网——每日最新资讯28at.com

结语

逻辑编程语言历史悠久,通常用于教育、研究和某些专业应用领域,如人工智能、知识表示、自然语言处理、专家系统等,但是我们日常用的很少,主要是因为它的性能不太好,而且学习曲线比较陡峭,业界的接受程度不太高。jPR28资讯网——每日最新资讯28at.com

不过在人工智能中,其表示知识和推理方面的能力还是不错的,未来或许可以和命令式、函数式编程范式更多的结合,从而提供更加强大和灵活的编程工具。jPR28资讯网——每日最新资讯28at.com

最后,逻辑编程就像是赋予了计算机一种思考能力,有兴趣的可以一起学习下。jPR28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-55061-0.html逻辑编程:上古人工智能语言Prolog

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 用Go实现自己的网络流量解析和行为检测引擎

下一篇: 一个超强 Pytorch 操作!!

标签:
  • 热门焦点
Top