Giới Thiệu Về Prolog và Ứng Dụng Vào Hệ Giải Toán (Part1)
March 8, 2019Chương I: Giới Thiệu Về Prolog
Prolog là ngôn ngữ được sử dụng phổ biến nhất trong dòng các ngôn ngữ lập trình lôgich (Prolog có nghĩa là PROgramming in LOGic). Ngôn ngữ Prolog do giáo sư người Pháp Alain Colmerauer và nhóm nghiên cứu của ông đề xuất lần đầu tiên tại trường Đại học Marseille đầu những năm 1970. Đến năm 1980, Prolog nhanh chóng được áp dụng rộng rãi ở châu Âu, được người Nhật chọn làm ngôn ngữphát triển dòng máy tính thế hệ 5. Prolog đã được cài đặt trên các máy vi tính Apple II, IBM-PC, Macintosh.
Prolog còn được gọi là ngôn ngữ lập trình ký hiệu (symbolic programming) tương tự các ngôn ngữ lập trình hàm (functional programming), hay lập trình phi số (nonnumerical programming). Prolog rất thích hợp đểgiải quyết các bài toán liên quan đến các đối tượng (object) và mối quan hệ (relation) giữa chúng.
Prolog được sử dụng phổ biến trong lĩnh vực trí tuệnhân tạo. Nguyên lý lập trình logic dựa trên các mệnh đề Horn (Horn logic). Một mệnh đề Horn biễu diễn một sự kiện hay một sự việc nào đó là đúng hoặc không đúng, xảy ra hoặc không xảy ra (có hoặc không có, v.v…).
SWI-Prolog thuộc dòng họ Prolog Edinburgh do giáo sư Jan Wielemaker xây dựng vào năm 1983 tại khoa Khoa học Thông tin Xã hội, trường Đại học Amsterdam, Hà Lan. Đây là mã nguồn mở cho các nhà phát triển lập trình logic. SWI-Prolog có một thư viện vị từ, và tài liệu hướng dẫn phong phú. SWI-Prolog hoạt động theo hệ thống đơn thể, có giao diện trao đỏi hai chiều linh hoạt đối với ngôn ngữ C. SWI-Prolog là một ngôn ngũ sư phạm, do vậy bị hạn chế ít nhiều về tốc độ biên dịch chương trình.
SWI-Prolog hoạt động trên môi trường đồ họa XPCE định hướng đối tương (GUI) X-windows. SWI-Prolog tương đối dễ sử dụng nhờ khai thác các đặc trưng tương tác đồ họa. SWI-Prolog cho các phiên bản trên các hệ điều hành khác nhau tương thích với mọi mội trường.
Công cụ SWI-Prolog là công cụ giúp lập trình logic với thư viện vị từ phong phú và là một mã nguồn mở. Để tìm hiểu thêm về công cụ này có thể vào trang chủ của SWI-Prolog tại: http://www.swi-prolog.org/. Sau khi download bạn có thể cài đặt theo các bước sau:
Bước 1: Chạy file SWI-Prolog_xxx.exe sau đó nhấn OK, tiếp đó nhấn I Agree (hình dưới)
Bước 2: Chọn môi trường chạy, cài đặt nhấn next để tiếp tục
Bước 3: Chọn nơi cài đặt và nhấn next để tiếp tục. Lưu ý đánh dấu lại thư mục cài đặt để link tới môi trường làm việc khi kết nối với giao diện C#. Nếu đường dẫn sai sẽ ảnh hưởng tới quá trình chạy trên giao diện C# sau này.
Bước 4: Chọn đuôi mở rộng hoặc là *.pl, hoặc là *.pro, nhấn Install để bắt đầu cài đặt
Bước 5: Sau khi chạy Install quá trình cài đặt sẽ bắt đầu thực this au khi kết thúc nhấn finished
Sau khi cài đặt xong sẽ xuất hiện giao diện SWI-Prolog như sau:
Để lập trình ngôn ngữ logic Prolog ta có thể viết trên bất cứ trình soạn thảo văn bản nào sau đó lưu file dưới dang *.pl hoặc *.pro tùy vào phần mở rộng bạn cài đặt trước đó. Sau khi thực hiện các câu lệnh lập trình xong, banjc ó thể chạy trược tiếp file *.pl, khi đó của sổ SWI-Prolog sẽ hiện ra nhằm giúp bạn thực hiện câu hỏi truy vấn. Để tìm hiểu thêm câu lênh bạn có thể gõ: ?- help. Để hiển thị trợ giúp về các câu lệnh truy vấn trong lập trinh Prolog
Để tạo giao diện cho ngôn ngữ logic Prolog ta có thể kết nối chúng với các ngôn ngữ trực quan hơn như C/C++, C#, Java,… Dưới đây chỉ là hướng dẫn kết nối giữa Prolog với giao diện C#.
Trước hết ta cần tìm hiểu môi trường chạy lúc trước khi cài đặt, môi trường SWI_HOME_DIR giúp cho SWI_Prolog có thể hoạt động trên môi trường giao diện GUI. Để kết nối được giao diện ta cần thư viện kết nối với nền tảng .NET framework là Swi-cs-pl.
Lưu ý: phiên bản Prolog rất quan trọng trong việc sử dụng các thư viện kết nối (Các thư viện và phiên bản cài có thể tìm trên trang chủ của SWI-Prolog hoặc file đính kèm bài báo cáo này):
-
Nếu sử dụng windows 7/8 32bit thì dùng Prolog 32bit, nếu sử dụng windows7/8 thì sử dụng phiên bản Prolog 64bit.
-
Nếu sử dụng Prolog 32bit thì thư viện phải là SwiPlCs.dll và nunit.framework.dll, nếu sử dụng Prolog 64bit thì thư viện sử dụng phải là SwiPlCs64.dll và nunit.framework.dll.
-
Sử dụng phiên bản SWI-Prolog 6.3.3 cho bộ thư viện SwiPlCs.dll và nunit.framework.dll, sử dụng phiên bản SWI-Prolog 6.6.5 cho bộ thu viện SwiPlCs64.dll và nunit.framework.dll.
Cách kết nối C# với Prolog:
Bước 1: Copy 2 thư viện tương ứng vào thư mục Debug của Project tương ứng với bản cài đặt cũng như môi trường chạy, sau đó thêm 2 thư viện này vào References của Project
Bước 2: Thực hiện kết nối với môi trường tại file Program.cs
using SbsSW.SwiPlCs; namespace Prolog_Math { static class Program { [STAThread] static void Main() { Environment.SetEnvironmentVariable("SWI_HOME_DIR", @"C:\Program Files (x86)\swipl"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (!PlEngine.IsInitialized) { String[] empty_param = {""}; PlEngine.Initialize(empty_param); Application.Run(new Prolog()); PlEngine.PlCleanup(); } } } }
Lưu ý: Môi trường của SWI-Prolog phụ thuộc vào link đường dẫn lúc cài đặt đã được ghi chú phía trên. Nếu sai đường dẫn này coi như môi trường Prolog không hoạt động. Ở đây mặc định cho hệ điều hành 32bit là “C:\Program Files (x86)\swipl”, và hệ điều hành 64 bit là “C:\Program Files\swipl”
Sau khi liên kết môi trường ta có thể tạo lớp đối tượng kết nối sau (Thực thi dưới dang class.cs):
using SbsSW.SwiPlCs; using NUnit.Framework; using System.Text.RegularExpressions; namespace Prolog_Math { class QueryString { public void Load_file(string s) { s = s.Replace("\\", "//"); s = String.Format("consult('{0}')", s); string query = s.Replace("\\", "//"); try { PlQuery q = new PlQuery(query); Assert.IsTrue(q.NextSolution()); } catch (SbsSW.SwiPlCs.Exceptions.PlException e) { System.Windows.Forms.MessageBox.Show(e.ToString(), "Error"); } } public string Query(string s) { s.Trim(); Regex r = new Regex(@"[A-Z_][a-zA-Z_]*"); MatchCollection matches = r.Matches(s); string result = ""; try { PlQuery q = new PlQuery(s); bool HasSolution = false; foreach (PlQueryVariables v in q.SolutionVariables) { HasSolution = true; foreach (Match match in matches) { result += v[match.ToString()].ToString() + " ; "; } } if (matches.Count == 0) return HasSolution ? "true" : "false"; return result; } catch (SbsSW.SwiPlCs.Exceptions.PlException ex) { return "Error query: " + ex.Message; } } } }
Sau cùng bạn có thể kết nối và file *pl của Prolog với giao diện C# tùy thuộc vào yêu cầu bài toán. Để cho đường dẫn mặc định gọi tới file *.pl ta nên đưa file này vào thư mục Debug của Project để tránh việc load đường dẫn tĩnh không mong muốn.