旅行的逻辑

旅行方式问题的程序求解历程

经过中间站的旅行方式

答案

travel(X, Y,gobyCar(X,Y)) :- byCar(X, Y).
travel(X, Y,gobyTrain(X,Y)) :- byTrain(X, Y).
travel(X, Y,gobyPlane(X,Y)) :- byPlane(X, Y).
travel(X, Y,gobyCar(X,Z,Journey)) :-
    byCar(X, Z),
    travel(Z, Y,Journey).
travel(X, Y,gobyTrain(X,Z,Journey)) :-
     byTrain(X, Z),
    travel(Z, Y,Journey).
travel(X, Y,gobyPlane(X,Z,Journey)) :-
    byPlane(X, Z),
    travel(Z, Y,Journey).

验证

?- travel(valmont,losAngeles,X).
X = 
gobyCar(
valmont,
saarbruecken,
gobyTrain(saarbruecken,paris,gobyPlane(paris,losAngeles))
)

历程

两地间是否能到达

这是第二题。

byCar(auckland,hamilton).
byCar(hamilton,raglan).
byCar(valmont,saarbruecken).
byCar(valmont,metz).

byTrain(metz,frankfurt).
byTrain(saarbruecken,frankfurt).
byTrain(metz,paris).
byTrain(saarbruecken,paris).

byPlane(frankfurt,bangkok).
byPlane(frankfurt,singapore).
byPlane(paris,losAngeles).
byPlane(bangkok,auckland).
byPlane(singapore,auckland).
byPlane(losAngeles,auckland).

travel(X,Y):-
    byCar(X,_),byCar(_,Y),
	%write(X),write("byCar"),write(_),	write(_),write("byCar"),write(Y).		
travel(X,Y):-
    byCar(X,_),byTrain(_,Y).
travel(X,Y):-
    byCar(X,_),byPlane(_,Y).
travel(X,Y):-
    byTrain(X,_),byCar(_,Y).
travel(X,Y):-
    byTrain(X,_),byTrain(_,Y).
travel(X,Y):-
    byTrain(X,_),byPlane(_,Y).
travel(X,Y):-
    byPlane(X,_),byCar(_,Y).
travel(X,Y):-
    byPlane(X,_),byTrain(_,Y).
travel(X,Y):-
    byPlane(X,_),byPlane(_,Y).

"_"跟python一样表示忽略的意思,在前面文章里也用到了。命题写得有点多,效果还是达到了。这第三章是讲递归。有三种交通方式,一个中间站就是3x3=9种方式。

怎么到达

第三题。%write(X),write(“byCar”),write(), write(),write(“byCar”),write(Y). 可以看到上面代码里有这行注释。我尝试一般程序开发的打印了。失败是惨重的。

网上找到了答案

travel(X, Y,go(X,Y)) :- byCar(X, Y).
travel(X, Y,go(X,Y)) :- byTrain(X, Y).
travel(X, Y,go(X,Y)) :- byPlane(X, Y).
travel(X, Y,go(X,Z,Journey)) :-
    (byCar(X, Z) ; byTrain(X, Z) ; byPlane(X, Z)),
    travel(Z, Y,Journey).

如此简洁。原来分号“;”是表示析取的意思。我默默地把自己前面的题也改了。
输出的结果是:

X = 
go(
valmont,
saarbruecken,
go(saarbruecken,paris,go(paris,losAngeles))
)

网上没有答案

第四题要求回答旅行方式。只有自己来了。是不是把go的命题改成gobyCar、gobyTrain、gobyPlane三个命题。

travel(X, Y,gobyCar(X,Y)) :- byCar(X, Y).
travel(X, Y,gobyTrain(X,Y)) :- byTrain(X, Y).
travel(X, Y,gobyPlane(X,Y)) :- byPlane(X, Y).
travel(X, Y,go(X,Z,Journey)) :-
    (byCar(X, Z) ; byTrain(X, Z) ; byPlane(X, Z)),
    travel(Z, Y,Journey).

回答里只有最后一步是飞机方式。

X = 
go(
valmont,
saarbruecken,
go(saarbruecken,paris,gobyPlane(paris,losAngeles))
)

递归

复杂命题先递归调用,到最后有直接答案了才走前面三个命题。可以把前面学到的析取加到递归调用travel(X, Y,go(X,Z,Journey)) 里面调用自己的那一步 travel(Z, Y,Journey)吗?改成 (gobyCar(X,Z,Journey),gobyTrain(X,Z,Journey),gobyPlane(X,Z,Journey)))

travel(X, Y,gobyCar(X,Y)) :- byCar(X, Y).
travel(X, Y,gobyTrain(X,Y)) :- byTrain(X, Y).
travel(X, Y,gobyPlane(X,Y)) :- byPlane(X, Y).
travel(X, Y,go(X,Z,Journey)) :-
    (byCar(X, Z) ; byTrain(X, Z) ; byPlane(X, Z)),
    (gobyCar(X,Z,Journey),gobyTrain(X,Z,Journey),gobyPlane(X,Z,Journey))).

直接返回false.

?- travel(valmont,losAngeles,X).
false

命题参数

把析取加到命题的参数里呢?

travel(X, Y,gobyCar(X,Y)) :- byCar(X, Y).
travel(X, Y,gobyTrain(X,Y)) :- byTrain(X, Y).
travel(X, Y,gobyPlane(X,Y)) :- byPlane(X, Y).
travel(X, Y,(gobyCar(X,Z,Journey),gobyTrain(X,Z,Journey),gobyPlane(X,Z,Journey))) :-
    (byCar(X, Z) ; byTrain(X, Z) ; byPlane(X, Z)),
    travel(Z, Y,Journey).

回答很奇怪,最后面一步都是重复的。

X = 
gobyCar(
valmont,
saarbruecken,
gobyCar(saarbruecken,paris,gobyPlane(paris,losAngeles));
gobyTrain(saarbruecken,paris,gobyPlane(paris,losAngeles));
gobyPlane(saarbruecken,paris,gobyPlane(paris,losAngeles))
)
;
gobyTrain(
valmont,
saarbruecken,
gobyCar(saarbruecken,paris,gobyPlane(paris,losAngeles));
gobyTrain(saarbruecken,paris,gobyPlane(paris,losAngeles));
gobyPlane(saarbruecken,paris,gobyPlane(paris,losAngeles))
)
;
gobyPlane(
valmont,
saarbruecken,
gobyCar(saarbruecken,paris,gobyPlane(paris,losAngeles));
gobyTrain(saarbruecken,paris,gobyPlane(paris,losAngeles));
gobyPlane(saarbruecken,paris,gobyPlane(paris,losAngeles))
)

找回自信

命题参数和递归调用地方两种修改方式都不行。是不是析取有问题?多写几行呢,反正是复制粘贴。定义了三个travel(X, Y,gobyCar(X,Z,Journey)) ,travel(X, Y,gobyTrain(X,Z,Journey)) ,travel(X, Y,gobyPlane(X,Z,Journey))复杂命题。析取改成一步一步走也可以的。

travel(X, Y,gobyCar(X,Z,Journey)) :-
     (byCar(X, Z) ; byTrain(X, Z) ; byPlane(X, Z)),
    travel(Z, Y,Journey).
travel(X, Y,gobyTrain(X,Z,Journey)) :-
     (byCar(X, Z) ; byTrain(X, Z) ; byPlane(X, Z)),
    travel(Z, Y,Journey).
travel(X, Y,gobyPlane(X,Z,Journey)) :-
    (byCar(X, Z) ; byTrain(X, Z) ; byPlane(X, Z)),
    travel(Z, Y,Journey).

差点成功

X = 
gobyCar(
valmont,
saarbruecken,
gobyCar(saarbruecken,paris,gobyPlane(paris,losAngeles))
)

前面的go也变了。就在准备发布文章的一刻,多看了一眼。前面两个地点之间都是开汽车吗?不是,这些英文字母真让人眼花缭乱。

调试

感觉成功就差着窗户纸了。是代码还不够简洁吗?又是一顿折腾改成了开头的代码。

扩展

CMG“中国红”走遍世界,从巴黎载誉而归。东风可以到华盛顿。
添加四个命题:

travel(paris, china,gobyCMG(paris,china)).
travel(china, washington,gobyDongfeng(china,washington)).
travel(X, Y,gobyCMG(X,Z,Journey)) :-
    byCMG(X, Z),
    travel(Z, Y,Journey).
travel(X, Y,gobyDongfeng(X,Z,Journey)) :-
    byDongfeng(X, Z),
    travel(Z, Y,Journey).

查询valmont到华盛顿的方案:

?- travel(valmont,washington,X).
X = 
gobyCar(
valmont,
saarbruecken,
gobyTrain(
saarbruecken,
paris,
gobyCMG(paris,china,gobyDongfeng(china,washington))
)
)
X = 
gobyCar(
valmont,
metz,
gobyTrain(
metz,
paris,
gobyCMG(paris,china,gobyDongfeng(china,washington))
)
)

有两种方案。

观止

在这里插入图片描述

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器的建模与仿真展开,重点介绍了基于Matlab的飞行器动力学模型构建与控制系统设计方法。通过对四轴飞行器非线性运动方程的推导,建立其在三维空间中的姿态与位置动态模型,并采用数值仿真手段实现飞行器在复杂环境下的行为模拟。文中详细阐述了系统状态方程的构建、控制输入设计以及仿真参数设置,并结合具体代码实现展示了如何对飞行器进行稳定控制与轨迹跟踪。此外,文章还提到了多种优化与控制策略的应用背景,如模型预测控制、PID控制等,突出了Matlab工具在无人机系统仿真中的强大功能。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及从事无人机系统开发的工程师;尤其适合从事飞行器建模、控制算法研究及相关领域研究的专业人士。; 使用场景及目标:①用于四轴飞行器非线性动力学建模的教学与科研实践;②为无人机控制系统设计(如姿态控制、轨迹跟踪)提供仿真验证平台;③支持高级控制算法(如MPC、LQR、PID)的研究与对比分析; 阅读建议:建议读者结合文中提到的Matlab代码与仿真模型,动手实践飞行器建模与控制流程,重点关注动力学方程的实现与控制器参数调优,同时可拓展至多自由度或复杂环境下的飞行仿真研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值