Giới Thiệu Về Prolog và Ứng Dụng Vào Hệ Giải Toán (Part2)
March 9, 2019Chương II: Ứng Dụng Vào Hệ Giải Toán
Các phép toán đơn giản
Bài toán 1: Các phép toán số học cơ bản: + , – , *, /,mod.
Yêu cầu bài toán.
Cho 2 toán hạng a và b. Tính tổng, hiệu, tích, thương và chia lấy dư của 2 toán hàng đó.
- Input: Cho 2 số a và b.
- Output: Tính
- Tổng: a + b = ?
- Hiệu: a – b = ?
- Tích: a * b = ?
- Thương: a / b = ?
- Chia lấy phần dư: a mod b =?.
Ý tưởng giải thuật.
Xây dựng luật tính tổng, hiệu, tích , thương , chia lấy dư dựa trên các phép toán chuẩn số học trong Prolog:
| Ký hiệu | Phép toán |
| + | Cộng ( addition) |
| – | Trừ (subtraction) |
| * | Nhân (multiplication) |
| / | Chia số thực (real division) |
| mod | Chia lấy phần dư (modulus) |
Luật đước viết dưới dạng “ tenluat(E,F,KQ) ”. Trong đó: E, F lần lượt là các số a,b và KQ là kết quả phép toán của luật đó.
Cài đặt Prolog:
Ta có chương trình Prolog định nghĩa các phép tính như sau:
% Phép cộng
cong(F,E,KQ):-
KQ is F + E.
% Phép trừ
tru(F,E,KQ):-
KQ is F - E.
% Phép nhân
nhan(F,E,KQ):-
KQ is F * E.
% Phép chia
chia(F,E,KQ):-
E=\=0,
KQ is F / E.
chia(F,E,KQ):- %Trường hợp số bị chia = 0 nên không chia được
E==0,
write('Cannot divide by zero').
%Phép chia lấy dư
du(F,E,KQ):-
F >0,
KQ is F mod E.
du(F,E,KQ):-
F <0,
M is F mod E,
KQ is -M.
Cấu trúc lệnh hỏi.
Kết quả chạy Prolog như sau:
1 ?- cong(28,9,X). X = 37. 2 ?- tru(625,451,X). X = 174. 3 ?- nhan(-26,5,X). X = -130. 4 ?- chia(45,2,X). X = 22.5 . 5 ?- chia(5,0,X). Cannot divide by zero true. 6 ?- du(35,4,X). X = 3.
Xử lý giao diện.
– Hàm xữ lý phép tính:
private string XuLy(string input)
{
querystring.Load_file("TongHop.pl");
string output = "";
float soA, soB,soC,soD;
string dau;
string[] split = input.Split(' ');
if (split.Length == 3)
{
dau = split[1];
soA = float.Parse(split[0]);
soB = float.Parse(split[2]);
switch (dau)
{
case "+":
output = querystring.Query("cong(" + soA + "," + soB + ",X).");
break;
case "-":
output = querystring.Query("tru(" + soA + "," + soB + ",X).");
break;
case "*":
output = querystring.Query("nhan(" + soA + "," + soB + ",X).");
break;
case ":":
if (soB == 0)
output = "Cannot divide by zero";
else
output = querystring.Query("chia(" + soA + "," + soB + ",X).");
break;
case "mod":
output = querystring.Query("du(" + soA + "," + soB + ",X).");
break;
default:
break;
}
}
return output;
}
– Xuất kết quả:
private void btnEqual_Click(object sender, EventArgs e)
{
tam = "";
chuoi = txtInput.Text.ToString().Trim();
if (mode)
{
equal++;
txtInput.Text += " , ";
if (equal == 4)
{
txtInput.Text = "";
txtOutput.Text = XuLy(chuoi);
}
}
else
{
tam = XuLy(chuoi);
string[] split = tam.Split(';');
if (split.Length == 2)
{
tam = split[0];
txtOutput.Text = split[0];
}
}
}
– Kết quả test:

Hình 1: Kết quả phép tính cộng (28 + 9 =37 )

Hình 2:Kết quả phép tính trừ (625 – 451=174 )

Hình 3:Kết quả phép tính nhân (-26 * 5 = -130 )

Hình 4: Kết quả phép tính chia (45 : 2 = 22.5 )

Hình 5: Kết quả phép tính chia (Số bị chia bằng 0 không chia được )

Hình 6:Kết quả phép tính chia lấy dư (35 mod 4 = 3)

