- 序言教程
- 序言 - 主页
- Prolog - 简介
- Prolog - 环境设置
- Prolog - 你好世界
- Prolog - 基础知识
- Prolog - 关系
- Prolog - 数据对象
- Prolog - 运算符
- 循环与决策
- 连接词和析取词
- Prolog - 列表
- 递归和结构
- Prolog - 回溯
- Prolog - 不同与不同
- Prolog - 输入和输出
- Prolog - 内置谓词
- 树数据结构(案例研究)
- Prolog - 示例
- Prolog - 基本程序
- Prolog - 剪切示例
- 河内塔问题
- Prolog - 链接列表
- 猴子和香蕉问题
- Prolog 有用资源
- Prolog - 快速指南
- Prolog - 有用的资源
- Prolog - 讨论
Prolog - 基本程序
在下一章中,我们将讨论基本的序言示例 -
求两个数的最小最大值
求电阻电路的等效电阻
验证线段是水平、垂直还是倾斜
两个数的最大值和最小值
这里我们将看到一个 Prolog 程序,它可以找到两个数字的最小值和两个数字的最大值。首先,我们将创建两个谓词find_max(X,Y,Max)。这需要 X 和 Y 值,并将最大值存储到 Max 中。类似地,find_min(X,Y,Min)获取 X 和 Y 值,并将最小值存储到 Min 变量中。
程序
find_max(X, Y, X) :- X >= Y, !. find_max(X, Y, Y) :- X < Y. find_min(X, Y, X) :- X =< Y, !. find_min(X, Y, Y) :- X > Y.
输出
| ?- find_max(100,200,Max). Max = 200 yes | ?- find_max(40,10,Max). Max = 40 yes | ?- find_min(40,10,Min). Min = 10 yes | ?- find_min(100,200,Min). Min = 100 yes | ?-
电阻和电阻电路
在本节中,我们将了解如何编写一个 prolog 程序来帮助我们找到电阻电路的等效电阻。
让我们考虑以下电路来理解这个概念 -
我们必须找到该网络的等效电阻。首先,我们将尝试手动获取结果,然后尝试查看结果是否与 prolog 输出匹配。
我们知道有两条规则 -
如果R1和R2串联,则等效电阻Re=R1+R2。
如果R1和R2并联,则等效电阻Re = (R1 * R2)/(R1 + R2)。
这里10欧姆和40欧姆电阻并联,然后与12欧姆电阻串联,下半部分的等效电阻与30欧姆并联。那么让我们尝试计算一下等效电阻。
R3 = (10 * 40)/(10 + 40) = 400/50 = 8 欧姆
R4 = R3 + 12 = 8 + 12 = 20 欧姆
R5 = (20 * 30)/(20 + 30) = 12 欧姆
程序
series(R1,R2,Re) :- Re is R1 + R2. parallel(R1,R2,Re) :- Re is ((R1 * R2) / (R1 + R2)).
输出
| ?- [resistance]. compiling D:/TP Prolog/Sample_Codes/resistance.pl for byte code... D:/TP Prolog/Sample_Codes/resistance.pl compiled, 1 lines read - 804 bytes written, 14 ms yes | ?- parallel(10,40,R3). R3 = 8.0 yes | ?- series(8,12,R4). R4 = 20 yes | ?- parallel(20,30,R5). R5 = 12.0 yes | ?- parallel(10,40,R3),series(R3,12,R4),parallel(R4,30,R5). R3 = 8.0 R4 = 20.0 R5 = 12.0 yes | ?-
水平和垂直线段
线段有水平线段、垂直线段和倾斜线段三种类型。此示例验证线段是水平、垂直还是倾斜。
从这张图中我们可以了解到 -
对于水平线,两个端点的 y 坐标值相同。
对于垂直线,两个端点的 x 坐标值相同。
对于斜线,两个端点的 (x,y) 坐标不同。
现在让我们看看如何编写一个程序来检查这一点。
程序
vertical(seg(point(X,_),point(X,_))). horizontal(seg(point(_,Y),point(_,Y))). oblique(seg(point(X1,Y1),point(X2,Y2))) :-X1 \== X2, Y1 \== Y2.
输出
| ?- [line_seg]. compiling D:/TP Prolog/Sample_Codes/line_seg.pl for byte code... D:/TP Prolog/Sample_Codes/line_seg.pl compiled, 6 lines read - 1276 bytes written, 26 ms yes | ?- vertical(seg(point(10,20), point(10,30))). yes | ?- vertical(seg(point(10,20), point(15,30))). no | ?- oblique(seg(point(10,20), point(15,30))). yes | ?- oblique(seg(point(10,20), point(15,20))). no | ?- horizontal(seg(point(10,20), point(15,20))). yes | ?-