MỤC LỤC Trang CHƯƠNG I GIỚI THIỆU VẤN ĐỀ NGHIÊN CỨU CỦA LUẬN VĂN 1 I.2.2.Cải tiến của Visual Prolog và lý do siêu lập trình không được định nghĩa sẵn trong Visual Prolog 3 CHƯƠNG II S
Trang 1ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
VÕ DUY TRÍ
MỞ RỘNG PHƯƠNG TIỆN SIÊU LẬP TRÌNH
CHO NGÔN NGỮ VISUAL PROLOG
CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN
MÃ SỐ NGÀNH: 01_02_10
LUẬN VĂN THẠC SĨ
TP.HCM – 04/2003
Trang 2Người hướng dẫn khoa học:
TS DƯƠNG TUẤN ANH
Người chấm nhận xét 1:
PGS.TS PHAN THỊ TƯƠI
Người chấm nhận xét 2:
TS NGUYỄN XUÂN DŨNG
Trang 3ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH Độc Lập – Tự Do – Hạnh Phúc
TRƯỜNG ĐẠI HỌC QUỐC GIA WX
-
NHIỆM VỤ LUẬN VĂN THẠC SĨ
Họ và tên: Võ Duy Trí Giới tính: Nam
Ngày sinh: 19/10/1970
Chuyên ngành: Công Nghệ Thông Tin
Khoá (năm trúng tuyển): 1999
I TÊN ĐỀ TÀI:
MỞ RỘNG PHƯƠNG TIỆN SIÊU LẬP TRÌNH
CHO NGÔN NGỮ VISUAL PROLOG
II NHIỆM VỤ VÀ NỘI DUNG:
• Nghiên cứu và hiện thực mở rộng phương tiện siêu lập trình cho ngôn ngữ Visual Prolog
• Hiện thực hóa lập trình hướng đối tượng, dò bước chương trình và hệ chuyên gia bằng phương tiện siêu lập trình trên nền ngôn ngữ Visual Prolog
• Tạo các công cụ nhập chương trình nguồn và xuất kết quả trung gian
III NGÀY GIAO NHIỆM VỤ:
IV NGÀY HOÀN THÀNH NHIỆM VỤ: 22/04/2003
V HỌ VÀ TÊN CÁN BỘ HƯỚNG DẪN: TS DƯƠNG TUẤN ANH
VI HỌ VÀ TÊN CÁN BỘ NHẬN XÉT 1: PGS.TS PHAN THỊ TƯƠI
VII HỌ VÀ TÊN CÁN BỘ NHẬN XÉT 2: TS NGUYỄN XUÂN DŨNG
CÁN BỘ HƯỚNG DẪN CÁN BỘ PHẢN BIỆN 1 CÁN BỘ PHẢN BIỆN 2
TS Dương Tuấn Anh PGS.TS Phan Thị Tươi TS Nguyễn Xuân Dũng
Nội dung và đề cương Luận văn thạc sĩ đã được thông qua Hội Đồng Chuyên Ngành
PHÒNG ĐÀO TẠO Ngày tháng năm 2003
TS Dương Tuấn Anh
Trang 4LỜI CẢM ƠN
Em xin chân thành cám ơn thầy Dương Tuấn Anh đã tận tình hướng dẫn, định hướng phát triển cho luận văn Cảm ơn thầy đã giành nhiều thời gian và công sức để góp ý, chỉnh sửa báo cáo luận văn
Xin cảm ơn tất cả các thầy cô đã giảng dạy, truyền thụ kiến thức quý báu cho em trong suốt quá trình học cao học
Xin cảm ơn thầy, cô phản biện và các thầy trong hội đồng chấm luận văn đã giành thời gian quý báu để đọc và chân thành góp ý cho luận văn này
Xin cảm ơn bạn bè cùng lớp đã động viên và hỗ trợ trong quá trình học và thực hiện luận văn này
Trang 5TÓM TẮT
Luận văn nghiên cứu mở rộng phương tiện siêu lập trình (meta programming) cho ngôn ngữ Visual Prolog Phương tiện này là những vị từ siêu logic mà ngôn ngữ
Visual Prolog chưa được trang bị sẵn Ứng dụng phương tiện siêu lập trình, luận văn
trình bày ba ứng dụng minh họa lập trình hướng đối tượng, dò bước chương trình và hệ chuyên gia
Siêu lập trình là một kỹ thuật lập trình tạo khả năng thao tác trên cấu trúc chương trình Siêu lập trình cung cấp phương tiện thay đổi điều khiển chương trình
Phương tiện siêu lập trình được ứng dụng để: tách chương trình ứng dụng Prolog ra khỏi dữ liệu, chuyển dạng chương trình nguồn, điều khiển hoạt động chương trình,
…vv trong các lĩnh vực như: máy học, hệ chuyên gia, lập trình được hướng dẫn bởi
mẫu, lập trình logic có ràng buộc,… Ngoài ra phương tiện này còn giúp thử nhanh
các ý tưởng mới nhằm mục đích tiết kiệm thời gian và chi phí
Ngôn ngữ Prolog sử dụng cấu trúc dữ liệu điều khiển chương trình giống như
là dữ liệu, nên Prolog thích hợp để viết các siêu chương trình Gần đây ngôn ngữ Visual Prolog đã có nhiều cải tiến về tốc độ thực thi và tiết kiệm bộ nhớ nhằm tăng tính hữu hiệu của chương trình và đưa vào các phương tiện thuận lợi tạo giao diện trực quan Siêu lập trình cần thiết trong nhiều lĩnh vực lập trình khác nhau, nhưng
vì lý do ưu tiên cho tính hữu hiệu của ngôn ngữ mà nhà sản xuất Visual Prolog đã
không đưa vào ngôn ngữ các vị từ thư viện hỗ trợ siêu lập trình
Luận văn nghiên cứu cấu trúc ngữ pháp, cơ chế suy diễn, đối sánh, hồi qui, hợp nhất, cấu trúc cơ sở dữ liệu đệ qui, biến môi trường của Visual Prolog để xây dựng các vị từ thư viện tạo phương tiện siêu lập trình cho ngôn ngữ này Thư viện vị từ này giúp cho người lập trình ngôn ngữ Prolog rút ngắn rất nhiều thời gian và công sức khi tạo ra các siêu chương trình Các chức năng của thư viện này là: nhận chương trình nguồn, kiễm tra cú pháp, lưu trữ vị từ thành dạng toán hạng và thực thi mục tiêu
Trang 6Meta-programming is a programming technique that can operate on program structures, and provide a means to change the program control This capability is applicable in separating Prolog application programs from their data, in changing the forms of source programs, in controlling the program execution, etc Meta-programming is very useful in many areas such as, machine learning, expert system, pattern-directed programming, constraint logic programming, and so on Besides, it also helps to test quickly new ideas through prototyping to save time and cost
Since Prolog utilizes the data structures to process source program as data, Prolog suits to write meta-programs Recently, there have been several advances in Visual Prolog system in term of improving time and space efficiency as well as providing a Windows programming environment Although meta-programming facilities were already available in many Prolog versions,Visual Prolog did not include any built-in meta-logical predicates to support meta-programming due to the priority it put on the efficiency of the compiler
This thesis investigates the syntactic structure, matching mechanism, backtracking, recursive database structure, usage of environment variables in Visual Prolog in order to define the popular built-in metalogical predicates to support meta-programming in this logic programming language
Trang 7MỤC LỤC Trang
CHƯƠNG I
GIỚI THIỆU VẤN ĐỀ NGHIÊN CỨU CỦA LUẬN VĂN 1
I.2.2.Cải tiến của Visual Prolog và lý do siêu lập trình không
được định nghĩa sẵn trong Visual Prolog 3
CHƯƠNG II SIÊU THÔNG DỊCH VÀ CÁC ỨNG DỤNG KỸ THUẬT SIÊU LẬP TRÌNH 8
I.1.2.Nhóm so sánh các toán hạng 10II.2.2.Nhóm kiểm tra các toán hạng 11II.2.3.Nhóm tích hợp và phân rã toán hạng 12
II.3.2.Một chương trình siêu lập trình đơn giản 17II.4 CÁC ỨNG DỤNG CỦA KỸ THUẬT SIÊU LẬP TRÌNH 20 II.4.1.Dò bước chương trình bằng siêu lập trình 20
II.4.3.Ứng dụng siêu lập trình vào lập trình hướng đối tượng trên
II.4.4.Lập trình logic có ràng buộc 30
CHƯƠNG III HIỆN THỰC MỞ RỘNG PHƯƠNG TIỆN SIÊU LẬP TRÌNH
III.2.1 Hợp nhất toán hạng tĩnh và toán hạng động 45III.2.2 Hợp nhất phần thân mệnh đề 50III.2.3 Thực thi toán hạng và vị từ call 53
Trang 8III.2.4 Mở rộng các phương tiện siêu lập trình: = , functor, arg,
III.2.5 Quá trình thực thi mục tiêu 59
CHƯƠNG IV CÁC ỨNG DỤNG MINH HỌA CỦA SIÊU LẬP TRÌNH 61
IV.1.1 Ứng dụng siêu lập trình vào lập trình hướng đối tượng
IV.1.2 Chương trình dò bước (trace) 65
IV.1.3 Hệ chuyên gia tư vấn việc chọn trường đại học 69
IV.2.4 Minh họa hệ chuyên gia 81
CHƯƠNG V
PHỤ LỤC A
PHÂN TÍCH TỪ VỰNG VÀ PHÂN TÍCH CÚ PHÁP
3 Nhận, kiểm tra và gọi thực thi mục tiêu 9
PHỤ LỤC B
PHỤ LỤC C
CÁCH SỬ DỤNG CÁC VỊ TỪ
BẢNG THUẬT NGỮ VIỆT – ANH
Trang 9DANH MỤC CÁC HÌNH VẼ Trang
[1] Hình 2.1: Siêu thông dịch với dữ liệu được tách riêng khỏi chương
[2] Hình 2.2: Sơ đồ siêu thông dịch 16
[3] Hình 2.3: Sơ đồ chuỗi các luật trả lời cho câu hỏi “tại sao” 24
[4] Hình 3.1: Hệ phân cấp vị từ unify_term 47 [5] Hình 3.2: Hệ phân cấp vị từ unify_body 53
[6] Hình 4.1: Tổ chức giao diện 69
[7] Hình 4.2: Chương trình thực thi tìm kiếm mục tiêu 75
[8] Hình 4.3: Chương trình thực thi tìm kiếm mục tiêu có dò bước 76
[9] Hình 4.4: Tắt/ mở dò bước chương trình 77
[10] Hình 4.5: Chương trình có thể nhận mệnh đề khi đang thực thi 78
[11] Hình 4.6: Chương trình nhập chương trình nguồn và báo lỗi 79
[12] Hình 4.7: Chương trình nhập thông tin bổ sung từ người sử dụng 81
[13] Hình 4.8: Chương trình xuất ra cây chứng minh 82
Trang 10DANH MỤC CÁC BẢNG Trang
[1] Bảng 2.1: Kết quả vị từ so sánh toán hạng == 9 [2] Bảng 2.2: Kết quả kiểm tra toán hạng của vị từ var(Term) 11 [3] Bảng 3.1: Các dạng lưu trữ toán hạng tĩnh 37 [4] Bảng 3.2: tương ứng giữa toán hạng tĩnh và toán hạng động 40 [5] Bảng 4.1:Nội dung các phân đoạn chương trình 83
Trang 11CHƯƠNG I GIỚI THIỆU VẤN ĐỀ NGHIÊN CỨU CỦA LUẬN VĂN
Ngôn ngữ Visual Prolog là ngôn ngữ rất phù hợp khi lập trình các ứng dụng có liên quan đến trí tuệ nhân tạo Khi tạo các ứng dụng lớn cần có phương tiện để tách riêng chương trình ra khỏi dữ liệu và thao tác trên cấu trúc điều khiển của chương trình Phương tiện đó chính là phương tiện siêu lập trình Nhưng vì lý do tính hữu hiệu của ngôn ngữ mà nhà sản xuất ngôn ngữ Visual Prolog đã không trang
bị sẳn phương tiện này trong ngôn ngữ Người lập trình hoàn toàn có thể tạo
phương tiện này thông qua các vị từ thư viện Để tiếc kiệm thời gian và công sức cho người lập trình, luận văn đã xây dựng một thư viện hoàn chỉnh các vị từ thư viện hỗ trợ siêu lập trình cho ngôn ngữ Visual Prolog Thư viện này có thể liên kết
với các ứng dụng một cách dễ dàng
I.1 GIỚI THIỆU NGÔN NGỮ PROLOG
Ngôn ngữ lập trình Prolog là ngôn ngữ lập trình theo kiểu khai báo Ngôn ngữ này tập trung vào ba kỹ thuật cơ bản là đối sánh, cấu trúc dữ liệu dạng cây và
cơ chế dò tìm hồi qui tự động Các kỹ thuật này hợp thành tạo cho ngôn ngữ Prolog
có một cơ cấu lập trình rất mềm dẻo và mạnh mẽ Cùng với ngôn ngữ lập trình Lisp, Prolog được xem là một trong hai ngôn ngữ chính để lập trình các ứng dụng trí
tuệ nhân tạo
Prolog là ngôn ngữ lập trình tiêu biểu cho lập trình logic Những người đầu tiên xây dựng ý tưởng này là Robert Kowalski tại Edinburgh Lúc đầu các ý tưởng chỉ có tính lý thuyết Sau đó lý thuyết này được Maarten van Enden thử nghiệm và
được Alain Colmerauer hoàn thiện tại Marseilles Prolog được David Warren phổ biến rộng rãi vào giữa những năm 1970 ([1])
Prolog được phổ biến rộng rãi tại châu Âu như là một công cụ lập trình thực hành Tại Nhật, Prolog là ngôn ngữ trung tâm của sự phát triển máy tính thế hệ thứ
năm Những năm gần đây ngôn ngữ Prolog phát triển mạnh với phiên bản mới Visual Prolog 5.2 Nhờ vào sự phát triển vượt bậc của công nghệ chế tạo máy tính nhất là lĩnh vực bộ nhớ và vi xử lý, phiên bản Prolog này đã khắc phục được yêu cầu về tốc độ cao và bộ nhớ lớn trong quá trình suy diễn
Đối với các ứng dụng lập trình trí tuệ nhân tạo, ngôn ngữ Visual Prolog mạnh
và hữu hiệu hơn nhiều ngôn ngữ cao cấp khác Một số chương trình viết bằng ngôn
Trang 12ngữ Visual Prolog ngắn hơn gấp 10 lần so với chương trình tương ứng viết bằng các ngôn ngữ khác ([27])
Ngôn ngữ Prolog thực thi mục tiêu thông qua suy diễn trong không gian quan hệ đã được định nghĩa và rút ra kết quả theo các quy luật đã được định nghĩa trong không gian quan hệ đó Đặc điểm này đã tạo ngôn ngữ Prolog thành một ngôn ngữ mạnh trong lĩnh vực trí tuệ nhân tạo
Với khả năng thao tác các ký tự một cách hữu hiệu của mình, ngôn ngữ Prolog thích hợp cho công việc như:
• Cung cấp công cụ và các mô hình lập trình cho các ngôn ngữ khác
• Xây dựng các cơ sở dữ liệu quan hệ động
• Chuyển dịch ngôn ngữ ([10]), dịch từ ngôn ngữ lập trình này sang ngôn ngữ lập trình khác, ngay cả với ngôn ngữ tự nhiên
• Xây dựng các hệ chuyên gia
• Lĩnh vực trí tuệ nhân tạo
Hơn hẳn các phiên bản trước, Visual Prolog cung cấp nhiều công cụ trực quan để xây dựng chương trình trên nền window sử dụng bộ nhớ lớn Lợi thế này
tạo điều kiện cho Visual Prolog khắc phục được nhược điểm thực thi chương trình chậm hơn các ngôn ngữ khác và có thể phát triển các chương trình với cơ sở dữ liệu động và phức tạp
I.2 SIÊU LẬP TRÌNH VÀ NHU CẦU THỰC TẾ
I.2.1 Siêu lập trình
Các yêu cầu ứng dụng ngày càng trở nên phức tạp cùng với cơ sở dữ liệu lớn và luôn thay đổi Vì thế chương trình ngày càng lớn với dữ liệu phức tạp, nhu cầu đặt ra là làm thế nào để tạo ứng dụng có chương trình và dữ liệu tách biệt nhau Điều đáng quan tâm là, dữ liệu của ứng dụng Prolog khác với dữ liệu các chương trình viết bằng ngôn ngữ khác là dữ liệu này là các vị từ, luật suy diễn, sự kiện và
các đối tượng, … Dữ liệu này là một chương trình Prolog tham gia trực tiếp vào việc
điều khiển sự thực thi của chương trình Lập trình theo hướng tách biệt giữa dữ liệu điều khiển và chương trình được gọi là siêu lập trình ([2])
Siêu lập trình là một kỹ thuật lập trình nhằm tạo khả năng thao tác trên cấu trúc chương trình Các công cụ siêu lập trình cho phép chương trình điều khiển quá trình thực thi, thay đổi giải thuật, thay đổi quá trình hợp nhất và đối sánh của ngôn
Trang 13ngữ Visual Prolog theo yêu cầu của người lập trình và dữ liệu nhập Bởi vì ngôn ngữ Prolog sử dụng cấu trúc dữ liệu điều khiển chương trình giống như là dữ liệu, nên ngôn ngữ Prolog thích hợp để viết các chương trình siêu lập trình ([20])
Siêu lập trình nhận chương trình khác như là dữ liệu Siêu lập trình Prolog
được viết bằng chính ngôn ngữ Prolog
Siêu lập trình còn có nhiều ứng dụng như: chuyển dạng chương trình, tạo cây chứng minh, lập trình logic có ràng buộc, lập trình được điều khiển bởi mẫu, lập trình hướng đối tượng, …
Ngôn ngữ Prolog đi với siêu lập trình là công cụ rất hiệu quả để phát triển nhanh các ý tưởng mới nếu xem nhẹ tính hữu hiệu của việc cải tiến mà coi trọng tính xây dựng nhanh và thử nghiệm Khi ý tưởng được phát triển và xây dựng thành các mẫu thử, các mẫu thử này có thể được cải thiện bằng cách khác hữu hiệu hơn bởi ngôn ngữ khác Khi cần thiết, các mẫu thử cũng hữu dụng trong việc tăng tốc giai đoạn phát triển và sáng tạo ý tưởng
Trong các phiên bản đầu tiên của ngôn ngữ Prolog, phương tiện siêu lập trình được nhà sản xuất trang bị sẵn bên trong ngôn ngữ Phương tiện siêu lập trình trong Prolog chuẩn gồm các vị từ siêu logic (meta-logical predicates) như: call(),clause(),= ,name(),functor(),agr(). Các vị từ này tạo phương tiện thao tác trên cấu trúc điều khiển chương trình của ngôn ngữ
Các vị từ này cung cấp công cụ tổng hợp, phân rã, tìm kiếm và gọi thực thi các toán hạng chương trình tạo khả năng thêm, bớt các vị từ điều khiển vào chương trình trong quá trình thực thi Thí dụ để xây dựng một mệnh đề multiply(A,B)
chứa vào biến F ta dùng vị từ siêu logic = như sau: F = [multiply,a,b]
Trong các phiên bản Turbo Prolog và Visual Prolog, nhà sản xuất không đưa phương tiện siêu lập trình vào ngôn ngữ Prolog Công dụng của từng vị từ siêu logic này và lý do Visual Prolog không hỗ trợ siêu lập trình sẽ được trình bày rõ trong phần sau
I.2.2 Cải tiến của Visual Prolog và lý do siêu lập trình không được định nghĩa sẵn trong Visual Prolog
Phiên bản Visual Prolog 5.2 có sự cải tiến nhảy vọt so với các phiên bản trước và so với Turbo Prolog Phiên bản này được trang bị nhiều công cụ lập trình tạo giao diện trên nền windows Visual Prolog 5.2 được cải tiến nhằm hỗ trợ nhiều lĩnh vực lập trình và nhiều đối tượng lập trình khác nhau
Trang 14Ngôn ngữ Visual Prolog sử dụng hai khái niệm project và global domain để quản lý lập trình theo module Các khái niệm này cung cấp cho người lập trình công cụ chia nhỏ chương trình thành nhiều module và miền toàn cục
(global domain) là công cụ kết nối các module Đây là cải tiến rất cần thiết cho lập trình các ứng dụng lớn ([8])
Sự cải tiến quan trọng của ngôn ngữ Visual Prolog so với các phiên bản Prolog trước đây là:
• Trình biên dịch có kiểu
• Các module thư viện có tính mở Tùy theo yêu cầu của ứng dụng, các module này có thể được thêm vào và sửa đổi
• Cơ chế hồi qui và truyền dữ liệu trên bộ nhớ, thao tác các biến cố thông qua thư viện động
• Có thể tạo các ứng dụng: mô hình client_server, internet (HTTP và FTP), kết nối với cơ sở dữ liệu thông qua ODBC, socket, hỗ trợ multi-thread, Unicode, …vv ([18])
• Quản lý tốt cơ sở tri thức lớn, phức tạp
• Tạo công cụ dò lỗi (debuger) tốt, thuận tiện cho tìm lỗi chương trình
• Phân biệt giữa biến tham chiếu và biến tham trị làm tăng hiệu quả chương trình ([2])
• Phân biệt giữa vị từ tất định và vị từ không tất định làm tăng hiệu quả hồi qui, tiết kiệm thời gian và bộ nhớ
• Phân biệt chiều xuất/nhập của các thông số khi dịch các vị từ
• Dịch toàn bộ chương trình nguồn thành ngôn ngữ máy mà không thông dịch chương trình lúc thực thi để tiết kiệm thời gian thực thi và bộ nhớ
Các cải tiến trên đã tạo cho Visual Prolog có các ưu điểm sau:
• Tốc độ thực thi chương trình tăng lên vượt bậc
• Thời gian phát triển ứng dụng giảm
• Thêm vào khả năng đọc mã chương trình nguồn và xử lý ký tự trong chương trình
• Khả năng phát hiện lỗi lớn hơn
• Dễ bảo trì chương trình
• Đáp ứng các ứng dụng thời gian thực tốt ([2])
• Tạo các ứng dụng lớn có dữ liệu phức tạp
Ngôn ngữ Visual Prolog là ngôn ngữ lập trình mạnh và dễ sử dụng nhưng vì lý do ưu tiên cho tính hữu hiệu của chương trình và để đáp ứng tốt các tính năng của ngôn ngữ mà ngôn ngữ Visual Prolog đã không hỗ trợ khả năng thêm, bớt các luật dẫn vào chương trình, sửa đổi cú pháp chương trình khi chương trình đang
Trang 15thực thi hay không hỗ trợ siêu lập trình Khi bỏ đi tính năng hỗ trợ siêu lập trình sẽ không mất đi sức mạnh của ngôn ngữ Visual Prolog mà người lập trình hoàn toàn có thể bổ sung phương tiện này bằng các vị từ thư viện và đây cũng là lý do để thực hiện luận văn này
Khi bỏ đi khả năng siêu lập trình trong ngôn ngữ Visual Prolog, chương trình
ứng dụng tạo bởi ngôn ngữ Visual Prolog sẽ sáng sủa hơn, hiệu quả hơn và ít
bị hạn chế hơn:
• Sáng sủa hơn vì chương trình có sự phân biệt giữa cơ sở tri thức và chương
trình nguồn Lúc này chương trình nguồn trở nên nhỏ gọn hơn do chỉ có phần lõi chương trình mà không chứa phần dữ liệu ([2])
• Hiệu quả hơn vì toàn bộ chương trình nguồn được dịch sang mã máy Nếu
thêm cơ sở tri thức vào chương trình nguồn làm cho toàn bộ chương trình khi thực thi phải trải qua bước thông dịch lại Trong khi đó khi thực thi phần chương trình nguồn không cần thông dịch lại mà chỉ có cơ sở tri thức cần phải thông dịch lại
• Ít bị hạn chế hơn vì chương trình có khả năng thay đổi điều khiển, thay đổi
chiến thuật tìm kiếm mục tiêu tùy theo dữ liệu khi chương trình đang thực thi
Mặc dù trong ngôn ngữ Visual Prolog không định nghĩa sẵn các vị từ hỗ trợ siêu lập trình nhưng ta hoàn toàn có thể bổ sung khả năng siêu lập trình của ngôn ngữ này bằng cách tạo ra các vị từ thư viện thêm vào các ứng dụng siêu lập trình
I.1.1 Nhu cầu thực tế
Khi xây dựng một chương trình Prolog, nhất là chương trình có sử dụng cơ sở dữ liệu lớn như: hệ chuyên gia, lĩnh vực máy học, dịch thuật ngôn ngữ tự nhiên, các chương trình có cơ sở dữ liệu là đối tượng, , rất cần có một phương tiện hữu hiệu để nhập dữ liệu vào và biến đổi dữ liệu thành các toán hạng có cấu trúc đệ qui thuận tiện cho quá trình suy diễn Phương tiện này chính là phương tiện siêu lập trình
Vì vậy nhu cầu đặt ra là phải tạo ra các vị từ thư viện hỗ trợ siêu lập trình cung cấp cho nhiều chương trình ứng dụng khác nhau Các vị từ này sẽ được liên kết vào chương trình một cách dễ dàng tạo điều kiện thuận lợi về thời gian và công sức cho người lập trình
Trang 16Để tách dữ liệu ra khỏi chương trình ta có thể dùng siêu lập trình tạo ra các
chương trình siêu thông dịch (meta-interpreter) Siêu thông dịch là một dạng cụ thể của siêu chương trình (meta-program)
Ngôn ngữ Prolog thông qua siêu thông dịch có khả năng nhận thêm, xoá, sửa các mệnh đề, luật dẫn khi chương trình đang thực thi Khả năng này đã giúp
giải quyết yêu cầu tách riêng chương trình ra khỏi dữ liệu một cách hữu hiệu
Siêu thông dịch nhận các chương trình nguồn, kiểm tra cú pháp và chuyển dạng chương trình này thành các toán hạng có cấu trúc đệ qui theo yêu cầu suy diễn Khi chuyển dạng siêu thông dịch còn có chức năng thêm vào chương trình các
vị từ điều khiển và xuất ra kết quả trung gian
Siêu lập trình rất cần thiết trong nhiều lĩnh vực khác nhau nhưng vì lý do đặt
ưu tiên cho tính hữu hiệu của ngôn ngữ lập trình mà trong ngôn ngữ Turbo Prolog và Visual Prolog nhà sản xuất đã không đưa vào các vị từ hỗ trợ cho siêu lập trình
Nhiệm vụ chính của luận văn là: "Mở rộng phương tiện siêu lập trình cho
ngôn ngữ Visual Prolog" Qua các phương tiện siêu lập trình đã được mở rộng, luận
văn cũng xây dựng một số minh họa trên môi trường Visual Prolog nhằm làm rõ vấn đề
I.3 MỤC ĐÍCH NGHIÊN CỨU CỦA LUẬN VĂN
Mục tiêu của luận văn là mở rộng các phương tiện siêu lập trình của ngôn ngữ Visual Prolog
Với mục tiêu này, luận văn đã nghiên cứu các vấn đề sau:
• Ứng dụng khả năng xử lý ký tự tốt của ngôn ngữ Visual Prolog tạo các vị từ kiểm tra cú pháp của ngôn ngữ
• Nghiên cứu cách lưu trữ toán hạng theo cấu trúc đệ qui của ngôn ngữ Prolog
• Cơ chế đối sánh và suy diễn của ngôn ngữ Prolog để tạo bộ xử lý vị từ
• Sử dụng biến môi trường trong quá trình truyền biến và đối sánh thông qua bộ xử lý vị từ
Trang 17 Qua quá trình thực hiện, luận văn đề xuất một số vị từ thư viện tạo phương tiện
siêu lập trình sau:
• Các vị từ thư viện có liên quan làm phương tiện siêu lập trình như:
này tạo công cụ thao tác trên cấu trúc điều khiển chương trình
• Các vị từ nhận dữ liệu là chương trình bằng ngôn ngữ Prolog như:
scan(),skipspaces(), isspace(), maketoken(), scan_str(),
ok_follow_uscore(), is_symbchar(), scan_atom(), white_follow(). Các vị từ này nhận chương trình nguồn, kiểm tra lỗi
chính tả và chuyển chương trình nguồn thành các token
• Các vị từ kiểm tra cú pháp ngôn ngữ Prolog, chuyển chương trình nguồn
thành các toán hạng và thêm vào cơ sở dữ liệu như: cons_parse(),
cons_clause(), s_lowerterm(), s_priorterm(), s_basisterm(), s_par(), s_list_in(), s_higherterm(), s_higher_something(), s_list(), treat_sufinfix(), treat_prefix(), s_par_in(), s_par_in1(), s_fun(), ok_rightop(), is_op(), is_prefix(), prefix_op(), assertObject()
• Các vị từ thực thi mục tiêu có xuất ra giá trị trung gian như: run(),
usergoal(), unify_term(), unify_body(), trace_call(),
createVar(), assertclause(), eval(), showtrace(), lookup_termid(). Các vị từ này tạo thành một bộ xử lý vị từ có nhiệm
vụ thực thi mục tiêu nhận được thông qua cơ sở dữ liệu dưới dạng các toán
hạng
• Các vị từ hiển thị giá trị trung gian và kết quả như: wterm(), wcmp(),
mệnh đề ra theo dạng quen thuộc dể theo dõi
• Mở rộng các công cụ thực thi lập trình hướng đối tượng qua vị từ: định
nghĩa object, thừa kế và truyền thông điệp như: send(),process(),
get_methods(),isa(). Các vị từ này cho phép ngôn ngữ Prolog và siêu
lập trình có thể định nghĩa và thực thi các khái niệm có liên quan đến đối
tượng
Trang 18CHƯƠNG II SIÊU THÔNG DỊCH VÀ CÁC ỨNG DỤNG KỸ THUẬT SIÊU LẬP TRÌNH
Chương này trình bày đôi dòng về lịch sử của siêu lập trình, giới thiệu các vị
từ siêu logic cần thiết cho siêu lập trình và một chương trình siêu lập trình đơn giản
Giới thiệu một trình siêu lập trình đơn giản, người viết trình bày cấu trúc và nguyên
lý hoạt động của một siêu lập trình
Nguyên lý hoạt động của một trình siêu lập trình gần giống như một trình biên dịch gồm có các bước: nhận chương trình nguồn, kiểm tra cú pháp, thực thi Nhưng với trình siêu lập trình không trực tiếp thực thi chương trình mà chuyển chương trình cho ngôn ngữ Prolog thực thi Qua nguyên lý hoạt động này, người viết
trình bày một số ứng dụng của kỹ thuật siêu lập trình Siêu lập trình có nhiều ứng dụng trong nhiều lĩnh vực khác nhau Các ứng dụng này thể hiện hai khả năng quan
trọng của siêu lập trình là tác động điều khiển ngôn ngữ và mở rộng ngôn ngữ
II.1 LỊCH SỬ PHÁT TRIỂN CỦA SIÊU LẬP TRÌNH
Khái niệm siêu thông dịch đầu tiên là của Sussman và Steele năm 1978 Hai
ông là những người đầu tiên sử dụng khả năng của ngôn ngữ để phân giải chính ngôn ngữ đó
Prolog là ngôn ngữ rất tiện lợi để xây dựng hệ chuyên gia Năm 1982, lần đầu tiên hai ông Clark và McCalee đã luận bàn về việc sử dụng Prolog để xây dựng hệ chuyên gia ([3]) Lợi thế khi sử dụng siêu thông dịch trong xây dựng hệ chuyên gia đã được Sterling nêu ra năm 1984 Xây dựng một bộ máy giải thích sử dụng siêu thông dịch được Sterling và Lalee mô tả năm 1985
Năm 1983, Shapiro đã sử dụng những ưu điểm của siêu thông dịch để xác định trạng thái không xác định trong chương trình và ông cũng đề nghị sử dụng lợi thế của siêu thông dịch làm nền tảng cho môi trường lập trình Siêu thông dịch cũng
góp phần quan trọng trong việc xây dựng lưu đồ điều khiển chương trình Prolog
Xét một ví dụ cụ thể là xây dựng một chương trình dịch ngôn ngữ tự nhiên Yêu cầu đặt ra là làm thế nào để xây dựng một chương trình dịch chung cho các ngôn ngữ khác nhau và một bộ luật riêng cho từng ngôn ngữ Khi muốn thay đổi ngôn ngữ cần dịch chỉ thay đổi bộ luật mà không cần thay đổi chương trình dịch
Trang 19Tương tự trong lĩnh vực hệ chuyên gia, yêu cầu là xây dựng một bộ máy suy diễn dùng chung cho mọi chuyên ngành Đối với mỗi chuyên ngành sẽ xây dựng riêng cho mình một cơ sở tri thức thích hợp và dùng chung một bộ máy suy diễn
Trong các trường hợp trên, siêu thông dịch là phương tiện tốt giúp cho chương trình có thể nhập dữ liệu điều khiển sự thực thi của chương trình từ bên ngoài và tạo thành các luật suy diễn lưu trữ bên trong cơ sở dữ liệu cho quá trình suy diễn
Khi tạo một ứng dụng viết bằng ngôn ngữ Prolog, người lập trình khó có thể làm một lúc hai việc làø xây dựng chương trình suy diễn đồng thờiø thu thập được tất cả các vị từ và luật dẫn bổ sung vào chương trình ứng dụng Các vị từ và luật sẽ được bổ sung, sửa đổi trong quá trình hoàn thiện chương trình và lúc chương trình thực thi
Các luật này không những được bổ sung bởi người lập trình mà còn phải có sự trợ giúp rất nhiều của các chuyên gia ở các lĩnh vực chuyên ngành Vì thế yêu cầu đặt ra là làm thế nào để tách biệt chương trình suy diễn ra khỏi các vị từ và luật dẫn hơn là thêm vào như một phần của chương trình
Người lập trình Visual Prolog phải giải quyết vấn đề là làm thế nào để xây dựng một chương trình với phần lõi chương trình tách riêng khỏi phần các sự kiện và luật dẫn của chương trình để dễ dàng trong việc chỉnh sửa từng phần riêng biệt Chương trình sẽ nhận các luật dẫn, các vị từ mô tả từ bên ngoài và mục tiêu làm dữ liệu Dựa trên dữ liệu này quá trình suy diễn sẽ đưa ra kết quả tương ứng Khi tách chương trình ra khỏi dữ liệu, chương trình được dịch sang mã máy để tăng tốc độ thực thi và tiết kiệm bộ nhớ
Hình 2.1: Siêu thông dịch với dữ liệu được tách riêng khỏi chương trình
Siêu thông dịch
Yêu
cầu
Dữ kiện và luật dẫn
Kết quả
Trang 20Một siêu thông dịch là một chương trình nhận dữ liệu là các chương trình khác Các trình biên dịch và trình thông dịch cũng là một thí dụ của siêu thông dịch Một siêu thông dịch ngôn ngữ Prolog là trình thông dịch cho Prolog được viết bằng ngôn ngữ Prolog Dựa vào khả năng xử lý các ký hiệu tốt của mình, ngôn ngữ Prolog là một ngôn ngữ hữu dụng cho siêu lập trình Vì thế, ngôn ngữ này thường được sử dụng như là ngôn ngữ cải tiến cho các ngôn ngữ khác ([1])
II.2 CÁC VỊ TỪ SIÊU LOGIC
Phương tiện siêu lập trình được thực hiện thông qua các vị từ siêu logic Các
vị từ logic có thể được chia làm ba nhóm: so sánh, kiểm tra và tích hợp/phân rã các toán hạng
I.1.2 Nhóm so sánh các toán hạng
Nhóm so sánh các toán hạng gồm có hai vị từ == và \== Các vị từ này được sử dụng để so sánh các toán hạng với nhau Các biến chưa khởi tạo cũng được xem như trường hợp tồn tại đặc biệt và cũng có thể được so sánh Các vị từ này không khởi tạo biến tự do Hai vị từ này ngoài chức năng so sánh toán hạng còn xét đến tính đồng nhất được của hai toán hạng
• Vị từ so sánh Term1 == Term2 trả về kết quả đúng nếu hai toán hạng
Term1, Term2 đã được khởi tạo và hai toán hạng này đồng nhất nhau Trong trường hợp hai toán hạng là biến đơn hoặc nguyên tử vị từ này mang tính so sánh Trong trường hợp là một toán hạng có cấu trúc, hai toán hạng này phải đồng nhất cả hàm tử và các thông số theo đúng thứ tự của các thông số Một số thí dụ về vị từ so sánh toán hạng == cho trong bảng 2.1
Bảng 2.1: Kết quả vị từ so sánh toán hạng ==
Mục tiêu Kết quả Giải thích
thể hợp nhất biến X chưa được gán trị với một số
Trang 21và Y Sau khi hợp nhất hai biến này được xem như đồng nhất với nhau Nếu một biến được nhận một giá trị thì biến kia cũng mang cùng giá trị đó
• Ngược lại vị từ == là vị từ \== Vị từ này cho kết quả đúng nếu hai toán hạng không đồng nhất với nhau
Hai vị từ này có chức năng kiểm tra sự so sánh và đồng nhất được của hai toán hạng không những là biến đơn mà cả biến có cấu trúc
II.2.2 Nhóm kiểm tra các toán hạng
Nhóm vị từ này có chức năng xác định các điều kiện trên từng toán hạng riêng lẻ hoặc các giá trị
• var(Term) vị từ này kiểm tra xem Term có phải là biến tự do không Giá trị trả về là đúng nếu Term là biến tự do Một số thí dụ về vị từ kiểm tra toán hạng var(Term) cho trong bảng 2.2
Bảng 2.2: Kết quả kiểm tra toán hạng của vị từ var(Term)
Mục tiêu Kết quả Giải thích
được đồng nhất với X
• nonvar(Term) kiểm tra ngược lại với var(). Kiểm tra Term có phải đã được gán trị không
• atom(Term) trả về giá trị đúng nếu Term là một nguyên tử.
• atomic(Term) trả về giá trị đúng nếu Term là một nguyên tử hoặc một số
• integer(Term) trả về giá trị đúng nếu Term là một số nguyên
• float(Term) trả về giá trị đúng nếu Term là một số thực
• number(Term) trả về giá trị đúng nếu Term là một số
Trang 22II.2.3 Nhóm tích hợp và phân rã toán hạng
Nhóm này gồm những thủ tục, vị từ hỗ trợ cho việc phân rã và tích hợp toán hạng như :
• Vị từ = còn gọi là “uni”: vị từ này tạo toán hạng khi biết tên vị từ và các đối
số Vị từ dùng để gọi vị từ được xác định khi thực thi chương trình Vị từ này cho phép chương trình có thể tích hợp vị từ bất kỳ theo yêu cầu thực thi mà hàm số và các thông số được cung cấp riêng lẻ và chưa xác định trước đó
Vị từ này có tác dụng hai chiều là nếu có danh sách tên và thông số vị từ sẽ tạo ra một vị từ mới, ngược lại nếu có vị từ thì uni sẽ phân tích vị từ này thành danh sách tên và các thông số Chiều ngược lại có tác dụng khi lưu trữ vị từ Phát biểu T = L : tạo toán hạng T qua danh sách L là danh sách gồm hàm tử và các đối số
Một thí dụ về tác dụng tích hợp vị từ của vị từ uni như sau: quan hệ Q của hai phần tử có thể được tích hợp ngay khi thực thi
Thí dụ 2.1: Tác dụng tích hợp vị từ của vị từ uni
%Danh sách các vị từ cần thực thi
relation(R, X, Y):- %vị từ tìm quan hệ R của X và Y
relations(Rs), %vị từ tìm tất cả quan hệ
member(R,Rs), %lấy quan hệ R trong tập các quan hệ Rs
Q = [R,X,Y],!, %tạo mệnh đề Q của quan hệ R vừa tìm với 2
%đối số X, Y
%Q = mother(X, Y)
call(Q) %thực thi mệnh đề Q
Gọi truy vấn mục tiêu:
?-relation(mother,X,Y)% vị từ quan hệ R=mother()được xác định khi % thực thi chương trình
?-relation(R, a, b) % tìm quan hệ bất kỳ của 2 phần tử a và b
Trang 23Giải thích: Trong thí dụ 2.1 vị từ mother() và hai thông số X,Y được cung cấp và tạo thành vị từ mother(X,Y) ngay khi thực thi chương trình
Vị từ relation(R, X, Y)là vị từ hai chiều với ba thông số Nếu vị từ nhận hai phần tử a và b, vị từ tìm quan hệ R giữa hai phần tử Nếu vị từ nhận quan hệ r, vị từ tìm tất cả các phần tử X và Y có quan hệ này Nếu vị từ nhận quan hệ r và hai phần tử a,b thì vị từ này sẽ kiểm tra hai phần tử a,b này có quan hệ r với nhau không
Thí dụ để thấy rõ công dụng của vị từ = , ta định nghĩa vị từ call() gọi
thực thi vị từ F và các thông số như sau:
member(a,[a,b,c]) được gọi thực thi
• Vị từ funtor(Term,F,N) : trả về giá trị đúng nếu F là hàm tử chính của toán hạng Term và N là đối số của toán hạng Term
Thí dụ 2.3 : tìm vị từ và số đối số bằng functor().
Truy vấn ?-functor(t(f(X),X,t),Fun,Arity)
X = _,Fun = t,Arity = 3 % vị từ tên là t, vị từ này có 3
Một điều thú vị là functor() là một vị từ làm việc hai chiều Nghĩa là khi thông số vị từ là biến thì vị từ này trả về một vị từ mới Đây cũng là một cách để xây dựng vị từ
Thí dụ 2.4: tạo một vị từ mới bằng functor().
Truy vấn ?-functor(T,member,2).%tạo vị từ mới có hai thông số tự do
T = member(_1,_2)
Trang 24• Vị từ arg(N,Term,A) : trả về đối số thứ N của toán hạng Term
Thí dụ 2.5: Truy vấn ?-arg(2,f(X,t(a),t(b)),Y)
• Vị từ name(T,L): phân tích hàm tử thành các ký tự và ngược lại có thể xây dựng tên vị từ từ danh sách ký tự Có thể áp dụng để xây dựng hàm tử khi biết danh sách ký tự tên vị từ
Thí dụ 2.6: name(member,L) trả về L = [‘m’,’e’,’m’,’b’,’e’,’r’] Truy vấn: ?-name(member,L)
• Vị từ clause(Head,Body): tìm và trả về tất cả các mệnh đề, thủ tục, vị từ trong cơ sở dữ liệu có phần đầu là Head Sử dụng vị từ này ta có thể lấy ra toàn bộ hoặc từ phần của một vị từ đang lưu trữ trong cơ sở dữ liệu
Thí dụ 2.7: khi khai báo vị từ member()như sau và lưu trữ trong cơ sở dữ liệu:
Truy vấn:?-clause(member(X,Y),Z)
%Z là phần thân, X và Y nhận các thông số của vị từ
Kết quả: X=_,Y=[_|_],Z=! (1’)
2 Solutions
Trong thí dụ này, khi truy vấn clause(member(X,Y),Z) trả về hai kết quả:
(1’): là thể hiện của (1) khi lưu trữ vào cơ sở dữ liệu X là một biến tự
do, Y là một danh sách và Z=! là phần thân của member()
(2’): là thể hiện của (2) khi lưu trữ vào cơ sở dữ liệu X là một biến tự
do, Y là một danh sách và Z=!,member(_,_) là phần thân của
Trang 25được định nghĩa trong cơ sở dữ liệu Các vị từ còn lại hỗ trợ cho siêu lập trình trong lúc thực thi để tạo, nhận dạng và phân tích các vị từ
II.3 CẤU TRÚC CỦA TRÌNH SIÊU THÔNG DỊCH
II.3.1 Cấu trúc
Chức năng một siêu thông dịch của ngôn ngữ Prolog là nhận một chương trình nguồn viết bằng ngôn ngữ Prolog và mục tiêu làm dữ liệu, sau đó thực thi mục tiêu cùng với chương trình đã nhận Nghĩa là siêu thông dịch ngôn ngữ Prolog cố gắng chứng minh mục tiêu đạt được là kết quả suy luận logic từ chương trình nguồn
Tuy nhiên, có một đặc điểm đáng quan tâm là một siêu thông dịch thực thi chương trình không hoàn toàn giống như trình thông dịch ngôn ngữ Prolog nguyên thuỷ mà thông qua quá trình thực thi siêu lập trình thêm một số động tác điều khiển để theo dõi sự thực thi của chương trình và tạo cây chứng minh
Đây cũng là một đặc điểm quan trọng của siêu thông dịch Nghĩa là, trong quá trình tiền thông dịch của siêu thông dịch, người lập trình có thể thêm vào chương trình các vị từ điều khiển và các thủ tục cộng thêm để theo dõi sự thực thi của chương trình và xuất ra các kết quả trung gian
Có thể xem siêu thông dịch như lớp vỏ bên ngoài của ngôn ngữ Prolog Các bước của siêu thông dịch Prolog là:
• Tiếp nhận chương trình nguồn
• Kiểm tra cú pháp
• Biến đổi chương trình nguồn thành các toán hạng lưu trữ bên trong phù hợp với quá trình suy diễn của ngôn ngữ Prolog
• Thêm các vị từ điều khiển sự thực thi cần thiết vào chương trình
• Truyền các yêu cầu đến Prolog thực thi
• Nhận và xuất ra bên ngoài kết quả từ Prolog theo định dạng yêu cầu
Một siêu thông dịch có các nhiệm vụ gần giống như một chương trình dịch khác là:
• Nhận chương trình nguồn và mục tiêu cần thực thi từ bên ngoài, sau đó kiểm tra từ vựng (scan)
• Kiểm tra cú pháp của chương trình (parse)
• Dịch chương trình (compile)
Trang 26Nhưng có sự khác biệt là khi dịch chương trình siêu thông dịch chỉ làm nhiệm vụ chuyển đổi chương trình Nghĩa là siêu thông dịch chỉ chuyển chương trình thành các toán hạng thuận tiện cho quá trình suy diễn hoặc chuyển chương trình từ dạng này sang dạng khác mà không dịch chương trình thành dạng mã máy như đa số các chương trình dịch khác Việc thực thi chương trình hầu hết là nhờ vào ngôn ngữ Prolog
Chương sau sẽ trình bày hai nội dung chính là cách lưu trữ toán hạng bên trong trình biên dịch ngôn ngữ Prolog và cách hợp nhất mệnh đề, đối sánh, gọi thực thi mục tiêu Nếu người đọc cần tham khảo các bước đầu của quá trình siêu thông dịch như: nhận chương trình nguồn, kiểm tra từ vựng, kiểm tra cú pháp, xây dựng các toán hạng thì có thể xem qua phần phụ lục A
Phụ lục A trình bày tóm tắt các bước đầu của chương trình siêu thông dịch và phụ lục B trình bày tóm tắt cách sử dụng ngôn ngữ Prolog trong việc tạo các ứng dụng có giao diện dễ sử dụng trong môi trường windows
Prolog
Phân tích từ vựng
Phân tíchcú pháp
Xuất ra
Toán hạng
Trang 27II.3.2 Một chương trình siêu lập trình đơn giản
Giả sử xét một chương trình siêu lập trình đơn giản là chứng minh một mục tiêu cho trước, chương trình có thể bắt đầu với thủ tục prove(Goal) với một thông số là mục tiêu cần đạt Chương trình siêu thông dịch có thể được viết:
Chương trình 2.1: Chương trình siêu lập trình đơn giản.
prove(Goal):- Call(Goal) %call() là vị từ siêu logic.
Trong vị từ này, tất cả công việc tìm mục tiêu Goal được giao trực tiếp cho quá trình thực thi tìm mục tiêu của ngôn ngữ Prolog thông qua thủ tục call(Goal), lúc này siêu thông dịch thực thi chương trình giống như quá trình thực thi của ngôn ngữ Prolog mà không thêm vào các yêu cầu điều khiển chương trình khác Nếu thực thi như vậy chương trình sẽ không có gì mới vì chương trình cung cấp các tính năng giống như một chương trình Prolog thông thường, đồng thời không thấy được tác dụng của siêu lập trình
Để thêm các tính năng mới vào chương trình Prolog, ta cần phải hiểu sâu về trình biên dịch Prolog: các phần tử, nguyên lý hoạt động của trình biên dịch này Các tính mới được thêm vào bằng cách giảm nhỏ kích thước của trình biên dịch Sự giảm nhỏ này có thể được thực hiện bằng các vị từ siêu logic như: clause(),
Quan trọng nhất trong công cụ siêu lập trình là vị từ clause(Head,Body)
Vị từ này có chức năng tìm kiếm tất cả các mệnh đề từ chương trình nguồn nhập vào được chứa trong cơ sở dữ liệu Trong đó, Head là phần đầu và Body là phần thân của mệnh đề
Với các mệnh đề đơn giản thì phần thân Body = true Trong các mệnh đề thông thường hay các luật dẫn thì phần thân có thể chứa một hoặc vài mục tiêu Nếu phần thân chứa một mục tiêu thì phần thân cũng chính là mục tiêu này Nếu phần thân chứa một số mục tiêu thì phần thân có thể được tích hợp như là một cặp mục tiêu có dạng sau:
Body = (FirstGoal,OtherGoal)
Trong đó, OtherGoal có thể là một cặp mục tiêu khác và cứ thế tiếp tục
Với sự trợ giúp của vị từ clause(), chương trình siêu lập trình đơn giản trong chương trình 2.1 có thể được cải tiến thêm bằng cách chia nhỏ vị từ
prove(Goal) thành ba mệnh đề có dạng sau:
Chương trình 2.2: Vị từ prove(Goal) được mở rộng thêm chức năng dò bước
Trang 28clauses
prove((Goal1,Goal2)):-!, %mục tiêu gồm nhiều mục tiêu con
prove(Goal1),prove(Goal2).%gọi thực thi từng mục tiêu con
prove(Goal):- %thực thi mục tiêu hiện tại
write(‘call:‘), %vị từ xuất mục tiêu hiện tại
write(Goal),nl, %tìm tất cả các mệnh đề trong cơ sở dữ clause(Goal,Body), %liệu có phần đầu trùng với mục tiêu prove(Body), %gọi đệ qui thực thi mục tiêu là phần write(‘Exit:‘), %thân vừa tìm và xuất kết quả
write(Goal),nl.
Giải thích:
Vị từ mới đã được mở rộng có thêm tính năng mới là dò bước chương trình Trong vị tư này mục tiêu goal ban đầu được phân tích thành ba trường hợp để thực thi:
• Mệnh đề đầu tiên thực thi trường hợp mục tiêu luôn đúng
• Mệnh đề thứ hai thực thi khi mục tiêu gồm nhiều mục tiêu con Mệnh đề này gọi thực thi từng mục tiêu con
• Mệnh đề cuối cùng thực thi một mục tiêu Trong quá trình thực thi có thêm vào các vị từ theo dõi mục tiêu đang thực thi write(), tìm các mệnh đề trong cơ sở dữ liệu clause(), thực thi mệnh đề
prove(Body) và xuất kết quả
Trong mục tiêu goal ban đầu cần thực thi có thể có một hoặc nhiều mục
tiêu con cần chứng minh, vị từõ chia nhỏ mục tiêu ban đầu thành các mục tiêu nhỏ hơn Ứng với mỗi lần thực thi một mục tiêu con, vị từ chèn vào các vị từ điều khiển chương trình Ở đây các vị từ điều khiển chỉ đơn giản là các vị từ xuất ra mục tiêu bắt đầu được thực thi write(“Call”), write(goal), kết thúc thực thi write(“Exit”), write(goal) Qua mở rộng này chương trình khi thực thi mục tiêu sẽ xuất ra tuần tự bắt đầu thực thi và kết thúc thực thi các mục tiêu
Ý tưởng tạo một thông dịch Prolog bên trong chương trình Prolog có vẻ như vô dụng vì một chương trình tự thông dịch sẽ làm cho chương trình thực thi chậm hơn Nhưng nguyên lý này rất quan trọng vì siêu thông dịch có thể được sử dụng để thêm vào chương trình các thay đổi và các vị từ điều khiển mới khi chương trình thực thi như: thay đổi chiến lược tìm kiếm, các vị từ giải thích, dò bước chương trình và tìm lỗi…
Trang 29Để làm rõ ta xét một thí dụ có liên quan đến mệnh đề Horn với chiến thuật từ dưới lên Thí dụ này sẽ tìm tất cả các kết quả suy diễn của các luật suy diễn khi các điều kiện của luật này được thoả
Thí dụ 2.8: tìm tất cả các kết quả suy diễn bằng mệnh đề Horn
relations(Rs), %tìm tên các quan hệ
member(R,Rs), %lấy ra tên của một quan hệ
Q = [R,X,Y], %tích hợp vị từ quan hệ
call(Q) %gọi thực thi vị từ được tích
member(X,[X|_])
member(X,[_|Y]):- member(X,Y)
Kết quả tất cả các quan hệ giữa các đối tượng được xuất ra khi gọi:
Truy vấn: ?-relation(R, X, Y)
mother(catherine,halvard) mother(ragnhild,tore) father(tore,halvard) parent(helga,catherine) parent(catherine,halvard) parent(ragnhild,tore) parent(tore,halvard) grandmother(helga,halvard) grandmother(ragnhild,halvard)
10 Solutions
Trang 30Trong thí dụ này, chương trình Prolog tìm kiếm kết quả theo chiều rộng trước sâu sau Nhưng nhờ vào siêu lập trình có thể được xây dựng thông dịch theo một chiến thuật khác ví dụ như sâu trước rộng sau với cùng kết quả nhưng khác nhau thứ tự Siêu lập trình là một kỹ thuật làm cho ngôn ngữ Prolog ngày càng tiến gần đến lập trình logic với công thức :
Giải thuật = Logic + Điều khiển (Algorithms=Logic+Control) ([28]) Khi thực thi chương trình Prolog kết thúc, kết quả của chương trình không lưu lại cách giải quyết vấn đề và trả lời tại sao có được kết quả đó Ứng dụng siêu lập trình, vấn đề này có thể được giải quyết bằng cách thêm vào chương trình các vị từ xuất kết quả trung gian hay ghi dấu chương trình Ứng dụng này được áp dụng rất nhiều trong hệ chuyên gia
Việc thực thi các mệnh đề trong chương trình nguồn đều do chính ngôn ngữ Visual Prolog thực thi, siêu lập trình chỉ gọi thực thi mục tiêu, can thiệp điều khiển và theo dõi quá trình thực thi
II.4 CÁC ỨNG DỤNG CỦA KỸ THUẬT SIÊU LẬP TRÌNH
Các ứng dụng mở rộng ngôn ngữ Prolog nhờ siêu lập trình như : dò tìm từng bước chương trình, tạo cây chứng minh, khái quát hóa lời giải thích cơ bản, lập trình hướng đối tượng, hệ chuyên gia, lập trình logic có ràng buộc, … Hầu hết các ứng dụng này đều dựa vào siêu lập trình để thêm các thao tác điều khiển vào chương trình và ghi lại quá trình thực thi chương trình
II.4.1 Dò bước chương trình bằng siêu lập trình
Dò bước chương trình là công cụ để theo dõi quá trình thực thi chương trình Với công cụ này, người sử dụng có thể theo dõi các vị từ đang thực thi, thứ tự gọi vị từ, giá trị trả về các vị từ, các thông số vị từ khi thực thi, quá trình suy diễn tìm mục tiêu của chương trình, …vv Một chương trình Prolog thông thường khi thực thi chỉ cần nhập vào mục tiêu (Goal) tại dấu nhắc Sau đó, chương trình thực thi và xuất
ra kết quả cuối cùng mà không thấy được quá trình suy diễn bên trong của chương trình Dò bước chương trình là công cụ cần thiết khi người lập trình muốn theo dõi quá trình thực thi chương trình và các kết quả trung gian
Thí dụ 2.9: Thí dụ thực thi một chương trình Prolog
clauses
member(X,[X|_])
Trang 31member(X,[_|L]):-member(X,L)
Truy vấn: ?-member(X,[a,b]) %nhập mục tiêu
X=a, X=b %xuất kết quả
Để theo dõi các bước trong quá trình thực thi của chương trình, chương trình được can thiệp bằng các vị từ xuất các bước thực thi hay các vị từ trong chương trình được gọi thực thi Bằng phương tiện siêu lập trình, các vị từ dò bước chương trình được chèn vào chương trình
Chương trình 2.3: Chương trình có dò bước chương trình
vị từ đang thực thi có thể hiện cấp của vị từ Khi xuất ra kết quả dò bước theo dạng cây, thông số Depth có thể được sử dụng là cấp của cây
Trang 32• Vị từ display(Message,Goal,Depth)có ba thông số :
o Message:thông báo cần xuất ra
o Goal:mục tiêu đang thực thi
o Depth:cấp của mục tiêu đang thực thi
Khi thực thi vị từ TRACE (G OAL ,D EPTH ) sinh ra các thông tin sau:
• Mục tiêu cần được thực thi
• Dò tìm các mục tiêu nhỏ bên trong mục tiêu ban đầu
• Nếu mục tiêu thoả, chương trình kết thúc tìm kiếm và thông tin kết thúc được xuất ra Nếu mục tiêu không thoả, thông tin thất bại được xuất ra
• Nếu chương trình hồi qui lại mục tiêu trước, thông báo redo được xuất ra Giả sử chương trình nguồn nhập vào là vị từ member(), siêu lập trình kiểm tra cú pháp và lưu vào cơ sở dữ liệu Truy vấn thông qua vị từ trace() kết quả nhận được như sau:
Thí dụ 2.10: Kết quả truy vấn thông qua vị từ trace().
Truy vấn: ?- trace(( member( X,[a,b]),member(X,[b,c])))
Trong khi thực thi ta thấy xuất hiện biến _0085 đây là biến đại diện cho biến
X khi suy diễn
Các bước chương trình thực thi như sau:
1 Vị từ member(_0085,[a,b]) được gọi Đây là mục tiêu thứ nhất của mục tiêu trace()
2 Vị từ member() trả về giá trị đúng với X = a
Trang 333 Tiếp tục dò tìm mục tiêu thứ hai của trace() Với X = a, ta có vị từ
4 Vị từ member() tiếp tục gọi mục tiêu nhỏ hơn member(a,[c])
5 Vị từ member() tiếp tục gọi mục tiêu nhỏ hơn member(a,[])
6 Mục tiêu này thất bại trả về mục tiêu trước đó member(a,[c])
7 Mục tiêu này thất bại trả về mục tiêu trước member(a,[b,c]).Mục tiêu
member(a,[b,c]) này thất bại trả về mục tiêu thứ hai của vị từ
trace() thất bại
8 Chương trình tiếp tục dò tìm khả năng tiếp theo của mục tiêu thứ nhất Redo:member(a,[a,b])
9 Vị từ member(_0085,[b]) được gọi
10 Vị từ này trả về trị đúng và X = b
11 Thoả mục tiêu thứ nhất với X = b
12 Gọi vị từ member() cho mục tiêu thứ hai member(b,[b,c])
13 Vị từ này trả về giá trị đúng Vậy là hai mục tiêu cùng thoả, vị từ
trace() trả về giá trị đúng với X = b
Vai trò của siêu thông dịch trong thí dụï này can thiệp vào sự thực thi mục tiêu bằng các vị từ trace(), display() để hiển thị các thông số cần thiết để theo dõi quá trình thực thi chương trình Qua các bước kiểm tra từ vựng, kiểm tra cú pháp và biến đổi các mệnh đề thành các toán hạng có cấu trúc đệ qui, siêu lập trình thao tác trên các toán hạng để can thiệp vào quá trình thực thi chương trình Các biến đổi này sẽ được đề cập chi tiết trong các chương sau Riêng vị từ member() có thể xem là một luật suy diễn và được chương trình nhận vào như là dữ liệu trong quá trình thực thi Khi thực thi yêu cầu:
Truy vấn: ?-trace(( member(X,[a,b]),member(X,[b,c])))
Vị từ clause() sẽ tìm trong cơ sở dữ liệu tất cả các mệnh đề của vị từ
member() và thực thi tuần tự các mệnh đề này
Trong khi thực thi vị từ trace() chương trình được thêm vào vị từ
display() để theo dõi quá trình thực thi và xuất ra toàn bộ quá trình thực thi Quá trình thực thi có thể được trình bày theo yêu cầu của người lập trình
II.4.2 Hệ chuyên gia
Hệ chuyên gia là một chương trình có chức năng giống như một nhà chuyên gia trong một lĩnh vực nào đó Hệ chuyên gia không những có thể đưa ra quyết định dựa theo những lý do được cung cấp mà còn có khả năng giải thích các quyết định
Trang 34đã đưa ra Thông thường hệ chuyên gia giải quyết các vấn đề mang tính không chắc chắn, không rõ ràng, không hoàn chỉnh của thông tin nhận được
Cấu trúc của hệ chuyên gia có 3 phần:
• Cơ sở tri thức: gồm các sự kiện, luật, các khái niệm và các quan hệ Đây là tri thức chuyên sâu của một lĩnh vực
• Bộ máy suy diễn: là bộ xử lý tri thức Bộ máy này suy diễn dựa trên cơ sở tri thức nhầm giải thích hoặc trả lời một vấn đề, một câu hỏi của người sử dụng
• Giao diện người dùng: giao tiếp với người sử dụng để nhận và trả lời các yêu cầu đặt ra
Khi tách riêng dữ liệu ra khỏi chương trình,hệ chuyên gia hoạt động giống như một siêu thông dịch Phương tiện siêu lập trình tạo công cụ cho hệ chuyên gia tách riêng phần cơ sở dữ liệu ra khỏi phần bộ máy suy diễn nhờ vào chức năng có thể thêm, xoá các vị từ dữ liệu trong quá trình thực thi
Với nhiều ứng dụng nhất là các ứng dụng trong hệ chuyên gia, yêu cầu tìm
mục tiêu đôi khi không quan trọng bằng yêu cầu nêu ra tại sao có được kết quả đó và bằng cách nào đạt được kết quả đó ([21]) Cây chứng minh được tạo ra trong
quá trình chương trình thực thi tìm mục tiêu nhằm để giải thích quá trình này
Cây chứng minh là đường nối từ mục tiêu và kết quả thông qua các vị từ và
Mục tiêu ban đầu
Luật dẫn 1 Luật dẫn 2
Luật dẫn 3 Mục tiêu hiện tại
Hình 2.3: Sơ đồ chuỗi các luật trả lời cho câu hỏi “tại sao”
Không gian tìm kiếm
Trang 35luật của chương trình Cây chứng minh là phương tiện tốt nhất để trả lời hai câu hỏi này Khi mục tiêu được tìm thấy, cây chứng minh sẽ chỉ ra cụ thể một chuỗi các luật và mục tiêu tìm thấy để trả lời cho câu hỏi tại sao và bằng cách nào
Lời giải thích trong trường hợp này là một chuỗi các luật nối từ mục tiêu hiện đang tìm thấy và mục tiêu ban đầu trong một sơ đồ cây các câu hỏi Để trả lời cho câu hỏi như thế nào ta phải truy ngược từ mục tiêu hiện tại đến mục tiêu đầu tiên Chương trìng 2.4: Ứng dụng siêu lập trình vào chương trình tạo cây chứng minh
Cây chứng minh được mô tả tùy thuộc vào các trường hợp sau:
• Nếu đúng thì trả về giá trị đúng
• Nếu có hai mục tiêu Goal1 và Goal2 đúng khi Goal1 đúng và Goal2 đúng
• Goal đúng nếu có một mệnh đề Goal1 -> Goal và Goal1 đúng
Nếu mục tiêu rỗng thì trả về giá trị đúng Nếu chứng minh nối (Goal1, Goal2) thì chứng minh Goal1 và chứng minh Goal2 Nếu chứng minh Goal1 thì xét trong dữ liệu chọn ra phần đầu của mệnh đề nào trùng với Goal1 và chứng minh phần thân của nó
Sự chứng minh này cũng giống như chứng minh một chương trình logic Chương trình chứng minh đơn giản dần mục tiêu cần tìm Trước tiên chọn mục tiêu đầu tiên bên trái, sau đó tìm tất cả các mệnh đề trong cơ sở dữ liệu để đơn giản mục tiêu này và cứ như thế với các mục tiêu kế tiếp đến khi mục tiêu cần chứng minh có thể xác định là đúng hoặc sai
Trong quá trình chứng minh thì cây chứng minh cũng được xây dựng Trong quá trình tìm kiếm nếu có mệnh đề bị sai hay không đúng với mục tiêu ban đầu thì
Trang 36chương trình hồi qui đến khi nào tìm hết các mệnh đề mà không thoả mãn thì mục tiêu ban đầu nhận giá trị trả về là sai
Tất cả khó khăn của chương trình đều nằm ở mệnh đề sau cùng Vì trong mệnh đề này công việc phải làm là tìm tất cả các mệnh đề và hồi qui nếu mệnh đề
bị sai
Cây chứng minh xác định mục tiêu được thực hiện bằng các mệnh đề nào và thứ tự của các mệnh đề trong quá trình chứng minh Siêu lập trình đã thêm vào chương trình các vị từ ghi lại các luật đã được thực thi dưới dạng cây để theo dõi và trả lời câu hỏi của người sử dụng
Khi tương tác với hệ chuyên gia, người sử dụng có thể cung cấp thêm một số thông tin còn thiếu cho quá trình tìm lời giải Để nhận vào các thông tin còn thiếu từ phía người sử dụng, chương trình siêu thông dịch bổ sung vị từ prove() mệnh đề sau vào cuối vị từ:
prove(A):-
askable(A), %thông tin cần thiết
not known(A), %câu trả lời chưa có trong cơ sở dữ liệu
ask(A,Answer), %hỏi người sử dụng để lấy thêm thông tin respond(Answer,A) % xử lý thông tin vừa nhận từ người sử dụng Mệnh đề này có tác dụng khi mục tiêu cần tìm chưa có sẵn trong cơ sở dữ liệu Thông tin cần thiết sẽ được bổ sung vào cơ sở dữ liệu Thông tin này được lưu trữ và được sử dụng trong các câu hỏi sau để tránh việc lập lại cùng câu hỏi nhiều lần Vị từ prove() được bổ sung như sau:
Chương trình 2.5: bổ sung vị từ prove() cho phù hợp với hệ chuyên gia
clauses
prove((Goal1,Goal2)): -!, %mục tiêu gồm nhiều mục tiêu con
prove(Goal1),prove(Goal2).%gọi thực thi từng mục tiêu con
prove(Goal): - %thực thi mục tiêu hiện tại
write(‘call:‘), %vị từ xuất mục tiêu hiện tại
write(Goal),nl, %tìm tất cả các mệnh đề trong cơ sở dữ clause(Goal, Body), %liệu có phần đầu trùng với mục tiêu prove(Body) %gọi đệ qui thực thi mục tiêu là phần
%thân vừa tìm
prove(Goal):- %nếu không tìm thấy mệnh đề trong cơ
Trang 37askable(Goal), %sở dữ liệu thì hỏi thông tin từ người sử not known(Goal), %dụng Nhận thông tin này siêu lập trình ask(Goal,Answer), %thêm vào cơ sở dữ liệu.
respond(Answer,Goal)
respond(yes,A):-assert(A) %câu trả lời “yes”
respond(no,A):-assert(untrue(A)),fail %câu trả lời “no”
Giải thích:
Hệ chuyên gia là một siêu thông dịch nhưng có một đặc điểm mở rộng là hệ sẽ nhận thêm thông tin cần thiết trong quá trình suy diễn khi thông tin bị thiếu mà không trả về ngay kết quả thất bại Khi bổ sung vị từ prove(), chương trình có thêm hai vị từ hỗ trợ là respond() và known().
Thông tin được nhận vào thông qua respond() Người sử dụng có thể đồng
ý hay không với dữ liệu hệ thống đưa ra:
Nếu đồng ý, thì hệ thống lưu vào cơ sở dữ liệu một sự kiện đúng: assert(A).
Nếu không đồng ý hệ thống lưu vào cơ sở dữ liệu một sự kiện sai: assert(untrue(A)).
Sự kiện này sẽ được hệ thống lưu trữ trong suốt quá trình truy vấn và không hỏi lại người sử dụng
Tóm lại, siêu lập trình tạo công cụ cho hệ chuyên gia xây dựng bộ máy suy diễn tách rời khỏi dữ liệu và có thể nhận dữ liệu cùng với các thông tin còn thiếu ngay trong lúc suy diễn Đồng thời siêu lập trình còn thêm vào chương trình các vị từ điều khiển chương trình tạo cây chứng minh để trả lời câu hỏi “tại sao” và “như thế nào” trong hệ chuyên gia
II.4.3 Ứng dụng siêu lập trình vào lập trình hướng đối tượng trên nền Prolog
Lập trình hướng đối tượng là lập trình lấy đối tượng làm nền tảng để xây dựng giải thuật và chương trình Phương pháp lập trình này có sự khác biệt so với lập trình theo kiểu cấu trúc hay còn gọi là phương pháp lập trình theo hướng thủ tục
Với phương pháp lập trình theo hướng thủ tục, người lập trình phân tích
nhiệm vụ lớn thành nhiều thủ tục nhỏ hơn để giải quyết Kiểu lập trình này giải
Trang 38quyết vấn đề theo hướng làm thế nào để giải quyết công việc và theo nguyên lý lập
trình từ trên xuống (top-down)
Cấu trúc dữ liệu + Giải thuật = Chương trình
Lập trình hướng đối tượng giải quyết vấn đề theo hướng tư duy khác là với một số đối tượng đã có, phải làm gì để giải quyết công việc hay làm gì với các đối tượng đã có Trong kiểu lập trình này, đối tượng đóng vai trò trung tâm hay còn
được gọi là nguyên lý lập trình từ dưới lên (bottom-up) ([30])
Phương thức + Dữ liệu = Đối tượng
So với các ngôn ngữ lập trình khác thì với Prolog nói chung và Visual Prolog nói riêng lập trình hướng đối tượng là rất cần thiết và gần gũi vì Prolog thường tác động đến các đối tượng và các quan hệ giữa chúng Thí dụ các đối tượng trong thực tế như: một người và các quan hệ trong gia đình, các loài chim và các đặc tính của chúng, các dạng hình học, vv… Nhưng trong Visual Prolog lại ít hỗ trợ cho việc lập trình hướng đối tượng và thiếu các vị từ hỗ trợ quan trọng cần được bổ sung
Mô hình lập trình hướng đối tượng là một dạng mô phỏng các mô hình
Chương trình trong mô hình này được xây dựng bằng những đối tượng(object) Các object này gởi (send) thông điệp cho nhau Tính toán được thực hiện bên trong mỗi object và kết quả có được khi đối tượng đáp ứng lại thông điệp nhận được ([16])
Mỗi object đều có một vùng bộ nhớ riêng và một số method Một object
có thể thừa kế các method của object khác Mỗi object đáp ứng lại thông điệp gởi đến bằng cách thực thi một trong những method riêng của mình Thông điệp sẽ xác định method nào được thực thi bên trong object Thực chất việc gởi thông điệp đến một object cũng giống như việc gọi hàm
Một chương trình hướng đối tượng nhằm thực thi các lệnh gởi, nhận thông điệp giữa các đối tượng và các đối tượng này đáp ứng lại thông điệp đó
Trong ngôn ngữ Prolog, một object được xem như là một quan hệ
object(Name,Methods).
Trong đó Name : tên object.
Methods : danh sách tên của các method
Các method có dạng các mệnh đề, sự kiện và luật dẫn (clause, fact và rule) Thao tác lệnh gởi thông điệp đến các object được xem như thủ tục:
send(Object,Message)
Trang 39Thao tác thực thi method là tìm thích hợp bằng vị từ get_method(Object, Method), sau đó gọi thủ tục call(Method) thực thi
Thí dụ: Trong hình học một khai báo đối tượng là hình chữ nhật như sau: object(retangle(Length,Width),
[(area(A):- A = Length * Width), decrible :- write(‘Rectangle of size‘),
write(Length * Width))])
Các thao tác gởi thông điệp đến đối tượng có thể thực hiện như sau:
Truy vấn: ?-Rec1 = rectangle(4,3),
send( Rec1, describe), send( Rec1, area( Area))
Kết quả : Rectangle of side 4 * 3
Area = 12 Thủ tục send(Object, Message) được thực hiện bằng cách tìm tất cả các
method của object Các method này thực chất là chương trình riêng của từng
object Khi nhận được message, chương trình thực thi xem message như là phần đầu của một method và chương trình dùng vị từ clause() để tìm tất cả vị từ thích hợp sau đó thực thi các vị từ này tìm ra mục tiêu
send(Object,Message):-
get_methods(Object,Methods), %lấy ra lần lượt các method.
process(Message,Methods) %thực thi method thích hợp Trong lập trình hướng đối tượng, các đối tượng còn có liên quan với nhau và thừa kế các method của nhau
Thí dụ như khi khai báo đối tượng hình vuông là đối tượng thừa kế method
tính diện tích của hình chữ nhật như sau:
object(square(Side),
[(describe:- write(‘Square with side’), write(Side))])
Thủ tục thừa kế: isa(square(Side),retangle(Side,Side))
Vì thế vị từ get_methods() cũng được bổ sung để tìm method mà object
được thừa kế từ một object tổ tiên:
get_methods(Object,Methods):- %tìm các thủ tục riêng
get_methods(Object,Methods):- %tìm các thủ tục thừa kế
Trang 40isa(Object, SuperObject), %tìm các object tổ tiên get_methods(SuperObject,Methods)
Để định nghĩa các cấu trúc lập trình object, method, isa, send hỗ trợ lập trình hướng đối tượng trong ngôn ngữ Visual Prolog mà không phải xây dựng lại ngôn ngữ này ta có thể dùng phương tiện siêu lập trình Các thủ tục này được thực hiện nhờ siêu lập trình và đây cũng là yêu cầu minh họa của đề tài Ở đây siêu lập trình đóng vai trò mở rộng ngôn ngữ Khi thêm các thủ tục này vào ứng dụng, ngôn ngữ Visual Prolog đã được mở rộng để hỗ trợ lập trình hướng đối tượng mà không cần phải xây dựng và bổ sung chức năng này vào ngôn ngữ Visual Prolog
Thí dụ một chương trình Prolog để định nghĩa đối tượng và sự thừa kế các đối tượng:
Area = 16 Ngôn ngữ Prolog không nhận dạng được các khai báo như: object,isa và cũng không thể tìm được sự liên hệ với nhau giữa các đối tượng Siêu lập trình tạo công cụ nhập và nhận dạng các object, các vị từ thừa kế isa() và các vị từ truyền thông điệp vào chương trình Khi thực thi chương trình, quan hệ giữa các đối tượng được siêu lập trình xây dựng và điều khiển sự suy diễn của ngôn ngữ Prolog Trong khi chương trình thực thi có thể thêm, bớt, sửa chữa các object và các
method thừa kế
II.4.4 Lập trình logic có ràng buộc
Một số bài toán thực tế trong các lãnh vực như: thiết kế với sự trợ giúp của máy tính (CAD), kỹ thuật đồ hoạ, thiết kế layout vi mạch, lập thời khóa biểu, lập