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)