农夫渡河问题求解

这两个问题都是渡河问题,思路和方式是一样的:给出求解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. 爱因斯坦的超级问题(人工智能实验二报告)

    文章目录 实验题目 实验目的 实验平台 实验内容 实验步骤 具体设计 1. 题目详情 2. 题目分析 3. Prolog代码 4. 运行结果 Prolog表相关知识 Prolog安装及使用 讨论与结论 ...

  2. matlab语言实验二,实验二 MATLAB语言基础

    实验二 MATLAB 语言基础 一.实验目的 基本掌握 MATLAB 向量.矩阵.数组的生成及其基本运算(区分数组运算和矩阵运算).常用的数学函数.了解字符串的操作. 二.实验内容 (1) 向量的生成 ...

  3. 数据库实验二 SQL语言

    实验二 SQL语言 实验目的 熟悉并掌握创建表,插入记录,查询记录,删除记录,修改记录. 创建索引,删除索引. 创建视图,使用视图,删除视图. 实验内容 现有一个单位内部的小型图书借阅系统,假设每本图 ...

  4. python语言基础实验_实验二Python语言基础函数包练习.doc

    实验二Python语言基础函数包练习 实验 Python语言基础函数包练习:1208 学号: 实验目的 1.Python语言包,如math.NumPySciPy和Matplotlib等函数包的使用实验 ...

  5. R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入、生存对象生成、ggsurvplot可视化参数配置、设置、可视化对比

    R语言使用survminer包生存分析及可视化(ggsurvplot)实战详解:从数据集导入.生存对象生成.ggsurvplot可视化参数配置.设置.可视化对比 目录 R语言使用survminer包生 ...

  6. 考研数学一数学二数学三真题1987年-2021年所有历年真题及详解

    考研数学一网盘链接:https://pan.baidu.com/s/1cMDYFlHI6YZ83KfbDDyExA  提取码:6666 考研数学二真题1987年-2021年所有真题及详解链接:http ...

  7. 【人工智能实验】A*算法求解8数码问题

    目录 实验一 A*算法求解8数码问题 一.实验目的 二.实验原理 三.实验结果 四.实验总结 附录代码 推荐文章 实验一 A*算法求解8数码问题 一.实验目的 熟悉和掌握启发式搜索的定义.估价函数和算 ...

  8. 实验二 SQL 语言——SELECT 查询操作(第一部分)

    SQL 语言--SELECT 查询操作 实验目的: -了解查询的概念和方法:-掌握 SQL Server 集成管理器查询子窗口中执行 SELECT 操作的方法:-掌握 SELECT 语句在单表查询中的 ...

  9. 【C语言】大厂指针笔试题(1码+1图)详解——程序结果判断题

    C指针相关系列 1.一篇就够了(建议收藏)--超详解sizeof与strlen的用法 2.C语言之深入指针进阶(建议收藏以备不时之需) 3.回炉重造的C之指针+结构体 [C语言]大厂指针笔试题详解(1 ...

最新文章

  1. 大型网站架构演变和知识体系
  2. python数据库应用开发实例_纯Python开发的nosql数据库CodernityDB介绍和使用实例
  3. LeetCode 145. Binary Tree Postorder Traversal--后序遍历--先序遍历反向输出--递归,迭代--C++,Python解法
  4. 论坛报名 | 从捉迷藏、星际争霸到新一代人工智能:多智能体深度强化学习的理论与实践...
  5. 第七届蓝桥杯大赛个人赛省赛(软件类)B组真题
  6. python【数据结构与算法】搜索初探
  7. POJ 1836 Alignment
  8. Android 开发 存储目录的详解
  9. 前端开发知识点解答-问题-面试问题
  10. 有关Ajax实现的两种方法
  11. Oxygen XML Editor(XML编辑器)v21.0专业破解版
  12. uc7.5java下载,ucweb手机浏览器7.5 java版 UC浏览器Java
  13. 计算机网络安全学校,网络空间安全学院
  14. aws打开慢_亚马逊AWS服务器访问较慢,如何快速访问AWS服务器呢?
  15. PSINS不可交换(圆锥/划桨)误差补偿
  16. 1周岁的宝宝营养食谱(3)
  17. Git用户手册--GitHub
  18. linux_添加一个普通用户
  19. Unable to start activity com.unionpay.uppay.PayActivity
  20. 回顾第7周多行星星图

热门文章

  1. 外媒介绍全新表情密码 用emoji解锁安全吗?
  2. 遇见未来 | 对话朱贤文: PostgreSQL是一匹即将发力的黑马
  3. Nginx正则表达式与location匹配简介
  4. jxl创建excel加水印
  5. java.lang.IllegalStateException: Migration didn‘t properly handle
  6. 26个思维转换,实现跨越式成长
  7. calamari项目结构解析
  8. 加密和杂凑(Hashing)有什么不一样?
  9. 小红书种草模式有哪些?如何保证种草效果
  10. 解析几何:第五章 二次曲线(1)圆 椭圆 双曲线