Tìm hiểu ngôn ngữ Prolog và bài toán Puzzle

46 1.7K 3
Tìm hiểu ngôn ngữ Prolog và bài toán Puzzle

Đ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

ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO BÀI TẬP LỚN MÔN : HỆ CHUYÊN GIA Đề tài : Tìm hiểu ngôn ngữ Prolog và bài toán Puzzle Giảng viên hướng dẫn: Ths. Trần Hùng Cường Nhóm 1. Phạm Đình Lương 2. Hoàng Văn Hùng Hà Nội, tháng 8 năm 2013 Hà Nội, ngày…tháng…năm 2013 1. NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………………………………………………………………… ……………………………… Hà Nội, ngày… tháng…….năm 2013 MỤC LỤC Phần 1 Giới thiệu Visual prolog 3 1.1 Đặc điểm chung của ngôn ngữ prolog 4 1.2 Cấu trúc của chương trình Visual prolog 13 1.3 Các thành phần trong chương trình Visual prolog 15 Phần 2 Kết nối Visual prolog với C# 28 2.1 Tạo ra file .dll trong chương trình Visual prolog 29 2.2 Kết nối với C# 33 Phần 3 Bài toán ta-canh 36 3.1 Giới thiệu thuật toán A* 37 3.2 Giải bài toán ta canh bằng thuật toán A* 38 3.3 Giải thuật A* của bài toán ta canh viết bằng Visual prolog 39 3.4 Mở rộng bài toán N-puzzle 39 3.5 Giới thiệu về chương trình trò chơi ta canh 42 Phần 4 Tài liệu tham khảo 48 Phần 1: GIỚI THIỆU VISUAL PROLOG Visual prolog là ngôn ngữ lập trình logic được PDC phát triển dưạ trên nền tảng của Prolog và TurboProlog. Tên gọi Prolog được xuất phát từ cụm từ tiếng Pháp Programmation en logique, nghĩa là "lập trình theo logic". Xuất hiện từ năm 1972 (do Alain Colmerauer và Robert Kowalski thiết kế), mục tiêu của Visual prolog là để hổ trợ lập trình công nghiệp, nhấn mạnh đến những vấn đề phức tạp của tri thức. Ngày nay Visual prolog rất mạnh và là ngôn ngữ lập trình logic rất tốt, kết hợp các tính năng của logic, chức năng (function) và lập trình theo mô hình hướng đối tượng. Đặc biệt là trong ngành xử lý ngôn ngữ tự nhiên vì đây là mục tiêu thiết kế ban đầu của nó. Cú pháp và ngữ nghĩa của Prolog đơn giản và sáng sủa, nó được người Nhật coi là một trong những nền tảng để xây dựng máy tính thế hệ thứ năm mà ở đó, thay vì phải mô tả cách giải quyết một bài toán trên máy tính, con người chỉ cần mô tả bài toán và máy tính sẽ hỗ trợ họ nốt phần còn lại. Các tính năng của Visual prolog • Khái niệm lập trình logic (backtracking ,pattern matching) • Hỗ trợ unicode • Quản lý bộ nhớ tự động • Tính đa hình • Visual prolog là môi trường lập trình hoàn hảo với: • Graphical Integrated Development Environment (IDE) • Compiler • Linker • Debugger Với Visual prolog bạn có thể xây dựng các ứng dụng trên nền tảng Microsoft Windows 32. Nó cũng hổ trợ client-server và three-tier solutions(các giải pháp 3 tầng). 1.1. Đặc điểm chung của ngôn ngữ prolog - Prolog không phân biệt giữa khái niệm Data và Program như trong Pascal. - Sức mạnh của Prolog là đệ qui. - Toàn bộ chương trình được xem như một cơ sở tri thức (knowledgebase). - Chương trình Prolog là một tập hợp các luật (rules). - Prolog là ngôn ngữ được thiết kế chủ yếu cho các suy luận, không coi trọng tính toán. - Kowalski nói Algorithm = logic+control. - Logic là phát biểu về cái gì bài toán phải giải quyết. - Control phát biểu về làm thế nào bài toán được giải quyết. - Người lập trình luận lý chỉ phải thực hiện phần logic còn phần control hệ thống sẽ đảm nhiệm. 1.1.1. Đặc điểm của biến - Biến và hằng : Prolog qui định biến có ký tự bắt đầu là ký tự in (upppercase) hoặc ký tự gạch dưới (underscore). Hằng có ký tự bắt đầu là ký tự thường (lowercase). Thí dụ: Minh, X, Người, _minh, _x, _người … là 6 biến. minh, x, người, … là 3 hằng. - Biến trong mỗi clauses phải xuất hiện ít nhất 2 lần. - Nếu biến chỉ xuất hiện một lần trong clauses thì phải thay nó bằng biến rỗng (anonymous). Ngoài ra một thông số nào của vị từ trong clauses mà ta không quan tâm cũng có thể thay nó bằng biến rỗng. - Biến rỗng được biểu diễn bằng ký hiệu gạch dưới _ (underscore). Thí dụ: clauses danăng(X) :- biết(X, Y), chơi(X, Z). Biến Y và Z chỉ xuất hiện 1 lần nên phải đổi thành biến rỗng. Do đó : clauses danăng(X) :- biết(X, _ ), chơi(X, _ ). - Các trạng thái của biến là : tự do (free), bị trói (bound), được cởi (unbound). Các trạng thái này do hệ thống thực hiện. Người lập trình không có bất kỳ tác động nào lên biến để thay đổi trạng thái. Do đó Prolog không có hành động gán (assignment) giá trị cho biến như trong ngôn ngữ Pascal. 1.1.2. Kiểu danh sách - Đây là một loại tập hợp có bản chất đệ qui. Do đó những thao tác trên danh sách cần khai thác tính đệ qui triệt để. - Danh sách là một loại tập hợp có phần tử là chuỗi các phần tử của một tập hợp trong miền Domains. - Kiểu danh sách của Prolog được định nghĩa bằng cách thêm ký tự * vào tên kiểu phần tử. Thí dụ: domains họtên = symbol . dsSV = họtên* . dsSố = integer* . dsTên = symbol* . dsNghềnghiệp = string* . dsSV là danh sách các phần tử mà mỗi phần tử có kiểu hotên. dsSố là danh sách các phần tử mà mỗi phần tử là số nguyên. - Dạng thức của một biến kiểu danh sách : o Liệt kê : các phần tử của danh sách đặt cách nhau bằng dấu phẩy. Tất cả đặt ở giữa 2 dấu móc vuông. Thí dụ : domains dssố = integer* Biến X có kiểu Dssố là một danh sách 4 số nguyên 1, 2, 3, 4, được viết như sau : X = [1,2,3,4] o Đệ qui : Danh sách được biểu diễn gồm 2 phần, phần Head gồm 1 phần tử đầu của biểu diễn liệt kê và phần Tail gồm những phần tử còn lại của biểu diễn liệt kê. Phần Tail được biểu diễn bằng một danh sách liệt kê khác. Head và Tail đặt cách nhau dấu sổ xuống. Head và Tail được đặt trong dấu móc vuông. Thí dụ : domains dssố = integer* Biến X có kiểu Dssố là một danh sách 4 số nguyên 1, 2, 3, 4, được viết như sau : X = [1|[2,3,4]]. - Một số danh sách đặc biệt : a. Danh sách trống [] có head và tail không được định nghĩa. b. Danh sách [1,2,3,4] = [1|[2,3,4]] có head là 1, tail là [2,3,4]. c. Danh sách [1] = [1|[] ] có head là 1, tail là danh sách trống []. d. Danh sách [[1,2,3], [2,3,4,5], [6]] = [[1,2,3]|[[2,3,4,5], [6]]] có head là [1,2,3] và tail là [[2,3,4,5],[6]]. 1.1.3. Nguyên tắc trả lời GOAL của Prolog - Tuần tự từ trên xuống : hệ thống sẽ trả lời cho subgoal đầu tiên, kế đến là subgoal thứ 2, thứ 3, … cho đến subgoal cuối cùng. - So trùng (matching) : để trả lời cho từng subgoal hệ thống dò subgoal tuần tự theo từng dòng trong clauses. Việc dò tìm sẽ dừng khi subgoal trùng với một dòng clause nào đó, nếu không trùng thì dò tiếp cho đến dòng cuối cùng của clauses. 1.1.4. Cơ chế hoạt động của Prolog 1.1.4.1. Đồng nhất (unification): Khi so trùng subgoal với các dòng của clauses hệ thống prolog áp dụng cơ chế đồng nhất. - Nếu subgoal so trùng với một dòng của clauses là fact thì nó sẽ đồng nhất tên vị từ kế đến là danh sách thông số. Các thông số sẽ được đồng nhất theo dạng thức. Thí dụ : class predicates chếtạo(symbol, symbol) . clauses chếtạo(minh, tênlửa). (1) chếtạo(dũng, máytính). (2) chếtạo(thư, xehơi). (3) goal chếtạo(thư, X). Prolog sẽ trả lời bằng cách dò trên 3 mệnh đề của phần clauses. o Với mệnh đề 1 chế tạo (minh, tênlửa) : tên vị từ phù hợp cùng là chế tạo, cùng có 2 thông số, nhưng thông số thứ 1 của goal là thư khác với thông số thứ 1 của mệnh đề 1 là minh. Do đó mệnh đề này không phù hợp với goal. Việc so trùng tiếp tục. o Với mệnh đề 2 chế tạo (dũng, máytính) : tên vị từ phù hợp cũng là chế tạo, cùng có 2 thông số, nhưng thông số thứ 1 của goal là thư khác với thông số thứ 1 của mệnh đề 1 là dũng. Do đó mệnh đề này không phù hợp với goal. Việc so trùng tiếp tục. o Với mệnh đề 3 chế tạo (thư, xehơi) : tên vị từ phù hợp cũng là chếtạo, cùng có 2 thông số, thống số thứ 1 giống nhau cùng là thư, thông số thứ 2 của goal là biến X chưa có giá trị nên đồng nhất với thông số thứ 2 là xe hơi. Vậy hệ thống sẽ trả lời X là xe hơi. - Nếu subgoal so trùng với một dòng của clauses là rule thì nó đồng nhất tên, kế đó đồng nhất dạng thức thông số. Cuối cùng là kiểm tra các subgoal diên tả điều kiện có trong mệnh đề đó. Thí dụ : domains dssố = integer* class predicates dub(dssố,dssố) clauses sub( [], _ ) :- subgoal, … . (1) sub( [_|[3|Y]], [] ) :- subgoal, … . (2) [...]... coppy 3 file dll đã tạo ra từ chương trình Visual prolog vào thư mục Debug của project C# - Sau đó nhấn F6 để Buil lại và chạy chương trình Để chạy chương trình bạn nhấn Ctrl+F5 nếu bạn nhấn F5 chương trình sẽ báo lỗi Phần 3: BÀI TOÁN TA-CANH 3.1 Giới thiệu bài toán: • 8 -puzzle - Trạng thái ban đầu 2 1 4 3 6 5 7 8 - Trạng thái đích 1 2 3 8 4 7 6 5 - Bài toán giải quyết đưa trạng thái ban đầu đưa về trạng... hình sau: - Chọn tag Form1.cs và thêm vào những dòng lệnh khoanh tròn bên dưới hình: - Bây giờ ta viết sự kiện cho nút kết quả - Trở về tag Form1.cs[Design]* d_click vào button kết quả và viết sự kiện cho nó , sự kiện được thêm vào được khoan tròn như hình dưới - Sau khi viết sự kiện xong ta nhấn F6 để build chương trình và chương trình sẽ báo lỗi vì ta chưa đưa file dll vào Bây giờ ta sẽ coppy 3 file... string Output Write several arguments into a string Phần 2: KẾT NỐI VISUAL PROLOG VỚI C# Để kết nối được chúng ta sẽ tạo ra file dll trong Visual prolog rồi nhúng vào C# Ở đây ta lấy ví dụ dùng C# để gọi predicates tính giai thừa của Visual prolog 2.1 Tạo ra file dll trong chương trình Visual prolog - Chạy chương trình Visual prolog ta được hình bên dưới - Click nút New Project o Project Name: điền... với rule của Prolog thì kết quả được kiểm tra trước Việc kiểm tra được thực hiện gồm hai phần - dạng thức và giá trị Khi dạng thức và giá trị phù hợp thì hệ thống mới kiểm tra điều kiện (các subgoal) o Trong một số trường hợp trình tự thực hiện này của Prolog có tiện lợi, vì nếu hình thức kết quả không phù hợp thì không cần thiết kiểm tra điều kiện Trong khi Pascal việc kiểm tra điều kiện và hình thức... và chơi(X,_) phải thỏa + Subgoal biết(X, _ ) sẽ được duyệt trên clauses và sẽ lấy giá trị là biết(tân, vẽtranh) và còn 3 mệnh đề mà subgoal này chưa duyệt + Kế đó subgoal chơi(tân, _ ) (biến X không còn tự do đã bị buộc vào giá trị tân) được duyệt nhưng không có mệnh đề nào để nó thỏa vì vậy nó thất bại Hệ thống sẽ tự thối lui đồng thời biến X được cởi bỏ giá trị tân, nó trở lại trạng thái tự do và. .. goal đã được thỏa và biến X của vị từ đanăng lấy giá trị là kính o Chú ý : Biến trong Prolog chỉ có ý nghĩa trong mệnh đề chứa nó Do đó nhiều mệnh đề khác nhau có thể có cùng tên biến 1.2 Cấu trúc của chương trình Visual prolog - Hệ thống visual prolog cung cấp sẵn một số miền tập hợp (Domains) để người lập trình sử dụng : integer, char, real, symbol, string, … - Hệ thống Visual prolog cũng cung cấp... 8 - Trạng thái đích 1 2 3 8 4 7 6 5 - Bài toán giải quyết đưa trạng thái ban đầu đưa về trạng thái đích bằng cách di chuyển ô trống 3.2 Giới thiệu thuật toán A* - Thuật toán A* là thuật toán tìm kiếm có tính heuristic trên không gian trạng thái dựa vào hàm f, được định nghĩa như sau: f=g(n)+h’(n) g(n): chi phí thực sự đi từ nút đầu đến nút n h’(n): chi phí ước lượng đi từ nút n đến trạng thái đích ... có X = [5], ở thông số 2 có Y = 2 và [3,4] ≠ [3] (vì danh sách [3,4] có 2 phần tử còn danh sách [3] chỉ có 1 phần tử), Hệ thống trả lời là không đáp ứng được goal này mặc dù chưa hề kiểm tra đến các subgoal - Nhận xét : o Sự khác biệt giữa rule của Prolog và if … then của Pascal o If Điềukiện then Kếtquả = lệnh điều kiện của Pascal o Kếtquả if Điềukiện = Rule của Prolog o Hệ thống Pascal khi thực hiện... biến được gọi là tự do o Bị trói (bound) : Khi biến được đồng nhất thì nó bị buộc giá trị được đồng nhất vào o Được cởi (unbind) : Khi backtracking tại vị từ nào thì biến trong thông số của vị từ đó được cởi bỏ giá trị đã mang trước đó ra, và từ lúc này nó được tự do và chờ để bị buộc giá trị mới vào Ví dụ : class predicates chơi:(symbol, symbol) biết:(symbol, symbol) danăng:(symbol) clauses chơi(minh,... luật tính giai thừa và trả về kết quả cho predicates giaithua - D_click vào export.pro hình bên dưới suất hiện - Ta sẽ xây dựng luật tính giai thừa như sau: class predicates gt:(integer,integer) procedure (i,o) clauses gt (N, 1) :- N . Visual prolog 3 1.1 Đặc điểm chung của ngôn ngữ prolog 4 1.2 Cấu trúc của chương trình Visual prolog 13 1.3 Các thành phần trong chương trình Visual prolog 15 Phần 2 Kết nối Visual prolog với. viết bằng Visual prolog 39 3.4 Mở rộng bài toán N-puzzle 39 3.5 Giới thiệu về chương trình trò chơi ta canh 42 Phần 4 Tài liệu tham khảo 48 Phần 1: GIỚI THIỆU VISUAL PROLOG Visual prolog là ngôn. PROLOG Visual prolog là ngôn ngữ lập trình logic được PDC phát triển dưạ trên nền tảng của Prolog và TurboProlog. Tên gọi Prolog được xuất phát từ cụm từ tiếng Pháp Programmation en logique, nghĩa là "lập

Ngày đăng: 20/11/2014, 15:51

Mục lục

  • 1. NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN

    • 8-puzzle

Tài liệu cùng người dùng

Tài liệu liên quan