Giới Thiệu Về Prolog và Ứng Dụng Vào Hệ Giải Toán (Part2)

Giới Thiệu Về Prolog và Ứng Dụng Vào Hệ Giải Toán (Part2)

March 9, 2019 0 By Nam Vu

Chươ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)