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
| ?-