人工智能实验二——prolog语言求解渡河问题(传教士和野人渡河,农夫渡河问题)实现详解
农夫渡河问题求解
这两个问题都是渡河问题,思路和方式是一样的:给出求解Prolog代码:
问题描述
一个农夫带着一匹狼、一只羊、一颗白菜要过河,
只有一条船而且
农夫每次最多只能带一个动物或物品过河,
并且当农夫不在的时候狼会吃羊,羊会吃白菜,
列出所有安全将所有动物和物品带过河的方案。
move(1,0,0,0).% 元组保存渡河方式
move(1,1,0,0).% 分别表示农夫 狼 羊 白菜
move(1,0,1,0).% 只有农夫会开船 故每种方式农夫都要渡河
move(1,0,0,1).% 农夫渡河可以啥也不带 也可以只带一个物品safe((F,W,S,C)):- %某个岸边安全的状态 (F=:=1); % 农夫只要在 总是安全的(F=:=0,W=:=1,S=:=0); %农夫不在 狼在 则羊不能在 白菜可在可不在(F=:=0,W=:=0,S=:=1,C=:=0); %农夫不在 狼不在 羊在 白菜不能在(F=:=0,W=:=0,S=:=0).%均不在 或只有白菜在allSafe((L,R,_)):- % 河岸两边都要安全 _表示不关心的状态 即船的状态不关心safe(L),safe(R).
aftermove((L,R,Ship),Move,Statu):- %移动之后 两个河岸状态发生改变(Fal,Wol,Shl,Cal)=L, %先将移动前的状态赋值给变量(Far,Wor,Shr,Car)=R,(A,B,C,D)=Move,if_then_else((Ship=:=0), %根据船的位置 判断 河岸两边的改变情况( Tl1 is Fal-A, Tl2 is Wol-B, Tl3 is Shl-C, Tl4 is Cal-D,Tr1 is Far+A, Tr2 is Wor+B, Tr3 is Shr+C, Tr4 is Car+D,Statu = ((Tl1,Tl2,Tl3,Tl4),(Tr1,Tr2,Tr3,Tr4),1)),( Tl1 is Fal+A, Tl2 is Wol+B, Tl3 is Shl+C, Tl4 is Cal+D,Tr1 is Far-A, Tr2 is Wor-B, Tr3 is Shr-C, Tr4 is Car-D,Statu = ((Tl1,Tl2,Tl3,Tl4),(Tr1,Tr2,Tr3,Tr4),0))).
valid(Statu,Statu1):-move(F,W,S,C), %某种渡河方式aftermove(Statu,(F,W,S,C),Statu1), %移动之后状态改变allSafe(Statu1). %检测移动后是一个安全的状态
% 下同 野人和传教士 自己去理解下吧
first_one(A,X):-append([A],_,X).
if_then_else(Condition,Then,Else) :- %定义if_then_else的执行逻辑 在下面使用call(Condition) -> call(Then) ; call(Else).last_part(A,X):-first_one(B,X),append([B],A,X).
show(L):-if_then_else((length(L,X),X>0),(first_one(A,L) , last_part(B,L) ,write('['),write(A),write(']'),nl,show(B)),fail).
nfgh(X,Y,L):- % Lif_then_else(X=Y,(write('***********************'),nl,show(L),nl),(valid(X,Z), not(member(Z,L)),nfgh(Z,Y,[Z|L]))).
查询命令为:
nfgh(((1,1,1,1),(0,0,0,0),0),((0,0,0,0),(1,1,1,1),1),[((1,1,1,1),(0,0,0,0),0)]).
运行结果如下:
表明有两种合法的渡河方式。
传教士和野人渡河问题
问题描述
在河的左岸有N个传教士、N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制:
(1)修道士和野人都会划船,但船每次最多只能运K个人;
(2)在任何岸边野人数目都不能超过修道士,否则修道士会被野人吃掉。
假定野人会服从任何一种过河安排,请规划出一个确保修道士安全过河的计划。
move(1,0).%元组列出渡河方式 1个传教士 0个野人
move(0,1).%元组列出渡河方式 0个传教士 1个野人
move(0,2).%元组列出渡河方式 0个传教士 2个野人
move(2,0).% 2个传教士 0个野人
move(1,1).% 1个传教士 1个野人safe((X,Y)):- %某岸安全的条件(X=:=0,Y>=0,!); %条件1 传教士人数为0 野人数不论(X>=Y,X>=0,Y>=0). %条件2 传教士人数大于野人人数,且均大于0allsafe((X,Y,_)):- % 左右岸都要安全 下划线表示船的状态不心关safe(X),safe(Y).if_then_else(Condition,Then,Else) :- %定义if_then_else的执行逻辑 在下面使用call(Condition) -> call(Then) ; call(Else).aftermove((X,Y,Q),Move,Statu):-(A,B)=X,(C,D)=Y,(E,F)=Move,if_then_else(Q=:=0, % if 注意船的位置要变(C1 is C+E, D1 is D+F, A1 is A-E, B1 is B-F, Statu=((A1,B1),(C1,D1),1)), % then 对应左岸和右岸人数的改变 注意船的位置要变(C1 is C-E, D1 is D-F, A1 is A+E, B1 is B+F, Statu=((A1,B1),(C1,D1),0)) % else).
valid(Statu,Statu1):- %有效转移move(X,Y),aftermove(Statu,(X,Y),Statu1),allsafe(Statu1).% 移动之后要求都是合法的first_one(A,X):- append([A],_,X). %记录转移的状态开始 A等于表X的第一个元素
last_part(A,X):- first_one(B,X),append([B],A,X). %AX A等于表X的除第一个元素的后部分表
show(L):- %输出过程if_then_else((length(L,X),X>0),(first_one(A,L),last_part(B,L),write('['),write(A),write(']'),nl,show(B)),fail).
cjsyyr(X,Y,L):- % Lif_then_else(X=Y, % 开始状态 到达目标状态 就输出 否则就递归(write('================'),nl,show(L),nl),(valid(X,Z), not(member(Z,L)),cjsyyr(Z,Y,[Z|L]))).
运行结果:
在prolog框中输入:
cjsyyr(((0,0),(3,3),1),((3,3),(0,0),0),[((0,0),(3,3),1)]).
解释一下这个查询语句:
初始状态是 (0,0),(3,3),1):表示
左岸 0个传教士,0个野人
右岸3个传教士,3个野人
船在右岸
目标状态是((3,3),(0,0),0):表示
右岸 0个传教士,0个野人
左岸3个传教士,3个野人
船在左岸
[((0,0),(3,3),1)]表示输出的一个最终状态
回车后查询,运行结果如下:
?- cjsyyr(((0,0),(3,3),1),((3,3),(0,0),0),[((0,0),(3,3),1)]).
================
[(3,3),(0,0),0]
[(2,2),(1,1),1]
[(3,2),(0,1),0]
[(3,0),(0,3),1]
[(3,1),(0,2),0]
[(1,1),(2,2),1]
[(2,2),(1,1),0]
[(0,2),(3,1),1]
[(0,3),(3,0),0]
[(0,1),(3,2),1]
[(0,2),(3,1),0]
[(0,0),(3,3),1]
================
[(3,3),(0,0),0]
[(3,1),(0,2),1]
[(3,2),(0,1),0]
[(3,0),(0,3),1]
[(3,1),(0,2),0]
[(1,1),(2,2),1]
[(2,2),(1,1),0]
[(0,2),(3,1),1]
[(0,3),(3,0),0]
[(0,1),(3,2),1]
[(0,2),(3,1),0]
[(0,0),(3,3),1]
================
[(3,3),(0,0),0]
[(2,2),(1,1),1]
[(3,2),(0,1),0]
[(3,0),(0,3),1]
[(3,1),(0,2),0]
[(1,1),(2,2),1]
[(2,2),(1,1),0]
[(0,2),(3,1),1]
[(0,3),(3,0),0]
[(0,1),(3,2),1]
[(1,1),(2,2),0]
[(0,0),(3,3),1]
================
[(3,3),(0,0),0]
[(3,1),(0,2),1]
[(3,2),(0,1),0]
[(3,0),(0,3),1]
[(3,1),(0,2),0]
[(1,1),(2,2),1]
[(2,2),(1,1),0]
[(0,2),(3,1),1]
[(0,3),(3,0),0]
[(0,1),(3,2),1]
[(1,1),(2,2),0]
[(0,0),(3,3),1]
也就是说当 有3个野人 3个传教士时 会有4种渡河方式。
若只有两个野人两个传教士则运行结果如下如:
至此,这两个渡河问题已经成功解决。
人工智能实验二——prolog语言求解渡河问题(传教士和野人渡河,农夫渡河问题)实现详解相关推荐
- 爱因斯坦的超级问题(人工智能实验二报告)
文章目录 实验题目 实验目的 实验平台 实验内容 实验步骤 具体设计 1. 题目详情 2. 题目分析 3. Prolog代码 4. 运行结果 Prolog表相关知识 Prolog安装及使用 讨论与结论 ...
- matlab语言实验二,实验二 MATLAB语言基础
实验二 MATLAB 语言基础 一.实验目的 基本掌握 MATLAB 向量.矩阵.数组的生成及其基本运算(区分数组运算和矩阵运算).常用的数学函数.了解字符串的操作. 二.实验内容 (1) 向量的生成 ...
- 数据库实验二 SQL语言
实验二 SQL语言 实验目的 熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录. 创建索引,删除索引. 创建视图,使用视图,删除视图. 实验内容 现有一个单位内部的小型图书借阅系统,假设每本图 ...
- python语言基础实验_实验二Python语言基础函数包练习.doc
实验二Python语言基础函数包练习 实验 Python语言基础函数包练习:1208 学号: 实验目的 1.Python语言包,如math.NumPySciPy和Matplotlib等函数包的使用实验 ...
- R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比
R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...
- 考研数学一数学二数学三真题1987年-2021年所有历年真题及详解
考研数学一网盘链接:https://pan.baidu.com/s/1cMDYFlHI6YZ83KfbDDyExA 提取码:6666 考研数学二真题1987年-2021年所有真题及详解链接:http ...
- 【人工智能实验】A*算法求解8数码问题
目录 实验一 A*算法求解8数码问题 一.实验目的 二.实验原理 三.实验结果 四.实验总结 附录代码 推荐文章 实验一 A*算法求解8数码问题 一.实验目的 熟悉和掌握启发式搜索的定义.估价函数和算 ...
- 实验二 SQL 语言——SELECT 查询操作(第一部分)
SQL 语言--SELECT 查询操作 实验目的: -了解查询的概念和方法:-掌握 SQL Server 集成管理器查询子窗口中执行 SELECT 操作的方法:-掌握 SELECT 语句在单表查询中的 ...
- 【C语言】大厂指针笔试题(1码+1图)详解——程序结果判断题
C指针相关系列 1.一篇就够了(建议收藏)--超详解sizeof与strlen的用法 2.C语言之深入指针进阶(建议收藏以备不时之需) 3.回炉重造的C之指针+结构体 [C语言]大厂指针笔试题详解(1 ...
最新文章
- 大型网站架构演变和知识体系
- python数据库应用开发实例_纯Python开发的nosql数据库CodernityDB介绍和使用实例
- LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法
- 论坛报名 | 从捉迷藏、星际争霸到新一代人工智能:多智能体深度强化学习的理论与实践...
- 第七届蓝桥杯大赛个人赛省赛(软件类)B组真题
- python【数据结构与算法】搜索初探
- POJ 1836 Alignment
- Android 开发 存储目录的详解
- 前端开发知识点解答-问题-面试问题
- 有关Ajax实现的两种方法
- Oxygen XML Editor(XML编辑器)v21.0专业破解版
- uc7.5java下载,ucweb手机浏览器7.5 java版 UC浏览器Java
- 计算机网络安全学校,网络空间安全学院
- aws打开慢_亚马逊AWS服务器访问较慢,如何快速访问AWS服务器呢?
- PSINS不可交换(圆锥/划桨)误差补偿
- 1周岁的宝宝营养食谱(3)
- Git用户手册--GitHub
- linux_添加一个普通用户
- Unable to start activity com.unionpay.uppay.PayActivity
- 回顾第7周多行星星图
热门文章
- 外媒介绍全新表情密码 用emoji解锁安全吗?
- 遇见未来 | 对话朱贤文: PostgreSQL是一匹即将发力的黑马
- Nginx正则表达式与location匹配简介
- jxl创建excel加水印
- java.lang.IllegalStateException: Migration didn‘t properly handle
- 26个思维转换,实现跨越式成长
- calamari项目结构解析
- 加密和杂凑(Hashing)有什么不一样?
- 小红书种草模式有哪些?如何保证种草效果
- 解析几何:第五章 二次曲线(1)圆 椭圆 双曲线