首页 > 其他分享 >旅行的逻辑

旅行的逻辑

时间:2024-11-08 18:46:29浏览次数:3  
标签:旅行 逻辑 byCar paris travel byPlane Journey 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,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))
)
)

有两种方案。

观止

在这里插入图片描述

标签:旅行,逻辑,byCar,paris,travel,byPlane,Journey,gobyPlane
From: https://blog.csdn.net/denghai_csdn/article/details/143601498

相关文章

  • linux新增物理卷,扩容逻辑分区,出现WARNING: xfs signature detected on /dev/vdb at of
    linux新增物理卷出现WARNING:xfssignaturedetectedon/dev/vdbatoffset0.Wipeit?[y/n]:标识这个/dev/vdb磁盘已经从0位置被标记为xfs类型的文件系统报错解释:这条信息表示在设备/dev/vdb上检测到了XFS文件系统的签名。通常情况下,这可能意味着分区/dev/vdb已被......
  • C语言逻辑操作符
    C语言逻辑操作符在C语言中,逻辑操作符用于执行逻辑运算,它们通常用于控制流语句中,如if和while循环,以根据给定的条件逻辑来决定程序的执行路径。C语言提供了三种逻辑操作符: 1.逻辑与(&&):当两个操作数都为真(非零)时,结果为真;否则结果为假。 2.逻辑或(||):当两个操作数中......
  • JOISC 2022 飞机旅行
    一个基础做法Alice给点标号,Bob可以传一个\(2^{20}\)的信息给Alice,意味着Alice只能知道点的部分信息,然后根据部分信息得把剩余需要的信息传给Bob。考虑树分块,子树大小\(\ge7\)的时候就划为一块,由于是二叉树(一开始以某个\(\le2\)度点为根),那每个子树的大小在\([7,13......
  • 生产环境中添加多项式特征实现:将逻辑回归应用于非线性关系
            要将逻辑回归应用于非线性关系,并实现到生产环境中,我们可以通过以下步骤来完成。这里主要使用Python和Scikit-Learn库,因为它们为机器学习任务提供了强大的工具和易于使用的接口。我们将通过添加多项式特征来扩展逻辑回归模型,使其能够处理非线性关系。步骤......
  • 逻辑回归处理非线性关系与支持向量机的性能对比
            逻辑回归是一种常用的线性分类方法,通常用于处理线性关系的二分类任务。但是,对于非线性问题,传统的逻辑回归模型可能表现不佳,因为它假设数据可以被一个线性决策边界分割开来。为了使逻辑回归能够处理非线性关系,我们可以采取一些方法,比如特征变换和多项式扩展,从而......
  • Jest进阶知识:深入测试 React Hooks-确保自定义逻辑的可靠性
    测试ReactHooks在React开发中,Hooks是一个非常重要的功能模块,允许开发者在函数组件中使用状态和其他React特性。自定义Hooks作为一种公共逻辑的抽离,经常被多个组件复用,因此对其测试是非常必要的。然而,由于Hooks必须在组件内部使用,直接测试它们并不像普通函数那......
  • 249 旅行商
    /*http://oj.daimayuan.top/course/5/problem/249蜗蜗的世界里有n个城市,城市两两之间通过高速公路连接,从第i个城市走到第j个城市需要花费ai,j的时间。现在蜗蜗想从1号城市出发旅游,他想把每个城市都玩个遍,但又不想在一个城市玩两遍,玩完以后蜗蜗需要回到1......
  • 【JAVA】Java基础—基础语法:运算符(算数、关系、逻辑运算符)
    在Java编程中,运算符是进行各种操作的基本工具。运算符允许我们对数据进行计算、比较、逻辑运算等操作,是实现程序逻辑的关键部分。理解运算符的使用和功能对于编写高效且可读的代码至关重要。Java中的运算符主要分为以下几类:算术运算符:用于进行数学计算。关系运算符:用于比......
  • 二元分类算法:逻辑回归实现与应用
     在机器学习领域,二元分类(BinaryClassification)是一种常见的任务,其目的是将输入数据分为两个类别。例如,垃圾邮件分类、疾病预测等都是典型的二元分类问题。常见的二元分类算法有逻辑回归(LogisticRegression)、支持向量机(SVM)、决策树(DecisionTrees)和随机森林(RandomForest)......
  • Vuex进行两个页面逻辑交互
    问题当一个页面由两个Vue文件构成的时候,如果在一个vue文件的时候进行了操作,那么需要将操作得到的数据传递给另外一个文件,那么另外页面就需要能够监听到前面这个页面的数据变化解决方案其实解决的方案就是通过vuex来进行实现,步骤如下:页面1当点击提交按钮的时候,调用vuex的......