1. Trang chủ
  2. » Luận Văn - Báo Cáo

Mở rộng phương tiện siêu lập trình cho ngôn ngữ visual prolog

117 13 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 117
Dung lượng 611,77 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 2

Ngườ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 W—X

-

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 4

LỜ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 5

TÓ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 6

Meta-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 7

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 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 8

III.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 9

DANH 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 10

DANH 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 11

CHƯƠ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 12

ngữ 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 13

ngữ 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 14

Ngôn ngữ Visual Prolog sử dụng hai khái niệm projectglobal 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 15

thự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 18

CHƯƠ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 19

Tươ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 20

Mộ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 21

và 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 22

II.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 23

Giả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, XY 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 26

Như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 27

II.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 28

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 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 30

Trong 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 31

member(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 33

3 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 35

luậ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 36

chươ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 37

askable(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()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 38

quyế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 39

Thao 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 methodobject

đượ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 40

isa(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

Ngày đăng: 18/02/2021, 08:01

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w