Tải bản đầy đủ (.doc) (34 trang)

Đề tài“ lập TRÌNH LOGIC

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (221.22 KB, 34 trang )

Trêng §¹i häc B¸ch khoa Hµ Néi
Trung t©m §µo t¹o sau §¹i häc

-------------✆------------

Bµi tËp lín
§Ò tµi:“ LËp tr×nh logic
Gi¸o viªn híng dÉn:
Nhãm
:
Líp
:

Hµ Néi, th¸ng 09 n¨m 2005


Mục lục
1. Prolog..................................................................................................................................3
1.1 Giới thiệu về Prolog.....................................................................................................3
1.2. Từ vựng và quy tắc cú pháp của Prolog......................................................................5
1.1.1.Bảng ký hiệu của Prolog.......................................................................................5
1.1.2. Toán tử :.................................................................................................................5
1.3. Các kiểu dữ liệu trong prolog :..................................................................................6
1.4. Cú pháp của Prolog......................................................................................................9
1.5. Cấu trúc của một chơng trình Prolog.......................................................................11
2. Quá trình tìm lời giải hay quá trình thực hiện các đích của prolog ............................15
2.1. Sự bằng nhau..............................................................................................................15
2.2. Đồng nhất hoá :...........................................................................................................15
2.3. Tìm kiếm lời giải trong prolog và các thuật giải phân tích với văn phạm.............16
2.4. Phân tích tất định..................................................................................................23
A, S V*....................................................................................................................24


3. Giải thuật phân tích đệ quy trên dới ............................................................................32
Begin.............................................................................................................................34

2


1. Prolog

1.1 Giới thiệu về Prolog
Prolog đợc Alain Colmerauer thiết kế tại trờng Tổng hợp Marseille-Pháp
vào năm 1971. Sau đó đợc phát triển mạnh tại Edilburgh Anh và tại đây các
version chuẩn của Prolog đã đợc tạo ra.
Năm 1983 Nhật Bản công bố chơng trình nghiên cứu chế tạo các máy
tính thế hệ thứ 5 với Prolog đợc chọn làm ngôn ngữ nền tảng cũng giống nh
Assembly làm nền tảng cho các máy tính theo kiến trúc này voneumam.
Điểm mạnh của của Prolog so với các ngôn ngữ lập trình truyền thống
(Pascal, C, ) là :
+ Đối với các ngôn ngữ lập trình truyền thống, đứng trớc một bài toán
cần phải giải quyết,ngời lập trình cần phải xác định cấu trúc dữ liệu cần dùng
để biểu diễn dữ liệu và các giải thuật tác dụng lên dữ liệu để đạt đợc kết quả
mong muốn.
Ví dụ nh : Đứng trớc bài toán quản lý sinh viên, ngời lập trình phải xác
định xem phải dùng cấu trúc dữ liệu nào để có thể biểu diễn đợc đối tợng sinh
viên . Chẳng hạn, họ có thể nghĩ đến kiểu bản ghi :
Sinh viên = record
Ten : string 30;
Diem : real ;
End;
Sau khi đã biểu diễn đợc đối tợng, họ phải nghĩ tới muốn tác động lên
các đối tợng đó ( sắp xếp, tìm kiếm. ) họ phải dùng thuật toán gì .

Niklaus Wirth đã đa ra một công thức nổi tiếng:
Programs = date structures +Alongths
+ Còn với Prolog thì sao :
Prolog đợc coi là ngôn ngữ cơ sở cho lập trình logic.

3


Đứng trớc một bài toán ngời lập trình khai báo cho máy tính một số
khẳng định cần thiết về tính chất của đối tợng và một số quy luật suy diễn mô
tả quan hệ giữa các đối tợng, dựa trên việc suy diễn theo các luật kết hợp với
các khẳng định đã có, chơng trình prolog tự xác định cách thức dẫn ra lời giải.
Ví dụ :
- Đã là ngời ai cũng phải chết, Hùng là ngời vậy Hùng có chết không?
Muốn có giải đáp, ta khai báo cho Prolog biết Hùng là ngời và cung cấp cho
Prolog luật suy diễn : Là ngời phải chết.
Sau đó ta có thể hỏi Prolog : Hùng có chết không ? .
Dựa vào khẳng định và luật suy diễn đã đợc cung cấp, Prolog sẽ tự động
tìm ra câu trả lời.
Trong Prolog: Nếu biết A đúng và từ A suy ra B thì B cũng đúng. Prolog
không cần quan tâm đến A, B biểu diễn cho đối tợng gì, thể hiện cho sự kiện
nào, và đợc biểu diễn bằng kiểu dữ kiện ra sao ( số nguyên, số thực, file, danh
sách. ) .
Với Prolog và lập trình logic :
Chơng trình = Sự kiện + Suy diễn Kết quả.
Ngày nay, Prolog là một công cụ rất quan trọng cho việc lập trình trong
lĩnh vực trí tuệ nhân tạo. Do Prolog có khả năng giải quyết hiệu quả các vấn đề
có liên quan đến xử lý ký hiệu và khả năng suy diễn tự động đợc cài đặt sẵn
trong hệ thống của nó.
Prolog đợc dùng để viết các chơng trình nh :

+ Dịch ngôn ngữ : Dịch ngôn ngữ tự nhiên của con ngời, viết chơng
trình dịch Compiler thờng ngắn hơn rất nhiều so với các ngôn ngữ khác.
+ Tạo giao diện ngời máy bằng ngôn ngữ tự nhiên :
+ Xây dựng hệ chuyên gia .
+ Cài đặt các cơ sở dữ liệu quan hệ.

4


+ Giải quyết các vấn đề liên quan đến logic toán học, lý thuyết trừu tợng, xử lý công thức, phơng trình vi phân, tích phân.
Một câu hỏi đặt ra là :
Cơ chế tìm hiểu lời giải của Prolog nh thế nào ? Để trả lời câu hỏi này ,
trớc tiên ta phải làm quen với những khái niệm cơ sở của Prolog .
1.2. Từ vựng và quy tắc cú pháp của Prolog.
1.1.1.Bảng ký hiệu của Prolog.
-

Chữ cái :

+ Nhóm các chữ cái viết hoa:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.
+ Nhóm các chữ cái viết thờng :
a b c d e f g h i j k l m n o p q r s t u v w x y z.
+Chữ số :
0123456789.
+ Các ký hiệu đặc biệt :
!, ,#,$,%,&,,(,),-,~,^,\,|,{,},@,+,-,*,/,:,
< , > , . , ?.
1.1.2. Toán tử :
+ Toán tử số học : + , - , * , /, mod, div.

+ , - ( Phép đổi dấu ).
+ Toán tử quan hệ : < , < = , > , > = , = , < > , > < .
Để thể hiện tri thức trong Prolog sử dụng hình thức vị từ nh đã nói ở
phần I.
Hung eats apple đợc biểu diễn bằng eats ( Hung, apple ).
Hung loves Linh đợc biểu diễn bằng loves ( Hung, Linh).

5


Hung owns books đợc biểu diễn bằng owns(Hung, book).
Và ngợc lại khi có một vị từ :
Likes (Hung, Computers ) đợc hiểu là : Hung likes Computers.
1.3. Các kiểu dữ liệu trong prolog :
1.

Char : Là ký tự ở giữa dấu nháy đơn vị ví dụ : a, b, c

2.

Integer : Là số nguyên, giới hạn của số nguyên là :
-32768

3.

đến

32767.

Số thực :

Số thực tĩnh :

23.18

Số thực động:

1e+21

Số thực nằm trong giới hạn :
1e 307 và 1e + 307
Trong biểu thức nếu có cả số nguyên và số thực thì số nguyên sẽ đợc
chuyển thành số thực.
4.

String : Xâu ký tự đợc viết trong dấu nháy kép.
Ví dụ :

5.

Computers, house.

Symbol : Ký hiệu .

Chia làm 2 loại :
+ Dãy các chữ , số và dấu gạch dới viết liên tiếp,ký tự đầu phải là một
chữ viết thờng.
+ Dãy các ký tự đợc viết trong dấu nháy kép : Banana.
Symbol và string có thể đợc sử dụng thay cho nhau, nhng chúng đợc
trình biên dịch của Turbo Prolog xử lý khác nhau.
+ Symbol đợc chơng trình biên dịch ghi vào bản ký hiệu và nạp lên bộ

nhớ và nhờ đó các thủ tục tìm kiếm và đồng nhất đợc xử lý rất nhanh. Tuy
nhiên nó cũng đòi hỏi bộ nhớ cho bản ký hiệu này.

6


6.

File :

File là kiểu dữ liệu có ý nghĩa nh kiểu dữ liệu file trong các ngôn ngữ
lập trình truyền thống.
Prolog cung cấp nhiều vị từ cho phép xử lý file.
Vị từ :
+ Openread : Vị từ này có 2 đối số :
Ví dụ :
Openread (f, hung.txt)
Tơng đơng với lệnh
Assign (f, trung.txt)
Reset (f); trong pascal.
Tác dụng của nó là mở file trung.txt để đọc, file đợc tác động qua
biến f.
+ Openwrite (f, trung.txt)
Vị từ này tơng đơng với lệnh
Assign (f, trung.txt)
Rewrite(f)
Nếu file trung.txt đã tồn tại thì nội dung của nó sẽ bị xoá.
+ Openappend(f, trung.txt)
Mở file trung.txt để ghi thêm, con trỏ đặt ở cuối file.
Sau khi mở file, ta có thể thao tác với nội dung của file đó nhờ các vị từ

đã đợc Prolog cung cấp sẵn :
Writedevice ( biến file ).
Readdevice ( biến file ).
7.

Kiểu cấu trúc ( Đối tợng phức hợp ).

7


Để biểu diễn các đối tợng nh đối tợng sinh viên trong pascal ta phải sử
dụng kiểu bản ghi record, trong C ta phải dùng struct, cũng nh vậy trong
Prolog ta phải dùng kiểu cấu trúc.
Cấu trúc dùng để biểu diễn cho các đối tợng mà bản thân nó lại chứa
các đối tợng khác.
Để xác định một đối tợng, ta phải xác định các thuộc tính của đối tợng
đó. Muốn xác định đợc một sinh viên ta phải xác định tên, ngày sinh của anh
ta.
Cú pháp của cấu trúc giống nh cú pháp của logic vị từ.
+ Tên của cấu trúc đợc gọi là functor.
+ Các thành phần của cấu trúc đợc viết trong dấu (.) và đợc phân cách
bởi dấu ,.
Ví dụ :
Sinh viên ( trung, hanoi).
Sach(mot_thoang_co_don, tacgia(ntt).
8.

Danh sách.

Danh sách là kiểu cơ bản của Prolog nó gần giống nh mảng trong pascal

nhng nó lại có những đặc điểm khác quan trọng.
+ Danh sách là một dãy các phần tử có thứ tự và số phần tử của danh
sách không định trớc.
+ Các phần tử của danh sách có thể là kiểu dữ liệu bất kỳ.
Danh sách đợc ký hiệu bởi [ ] các phần tử đợc viết ở trong và đợc phân
cách bằng dấu phẩy.
+ Danh sách rỗng ký hiệu là [ ].
+ Nếu không rỗng, nó sẽ gồm 2 phần : đầu ( head ), đuôi ( tail).
Đầu danh sách là phần xuất hiện đầu tiên của danh sách, còn đuôi là
phần còn lại của danh sách sau khi đã bỏ đi phần đầu.

8


Ví dụ :
[a]

: đầu là a, đuôi là [ ].

[a,b,c,d] : đầu là a, đuôi là [b,c,d].
[[a,b],c] : đầu là [a,b], đuôi là c.
+ Trong danh sách : phần đầu và phần đuôi có thể biểu diễn phân cách
nhau bằng ký hiệu |.
Ví dụ :
[[a,b] | c]
Sở dĩ phải phân danh sách ra làm phần đầu và phần đuôi là vì một trong
những thao tác cơ bản xử lý danh sách là tách phần đầu và phần đuôi của danh
sách.
Danh sách là một kiểu dữ liệu rất quan trọng trong prolog bởi thế ta sẽ
xét một số thao tác cơ bản với danh sách ở phần sau :

1.4. Cú pháp của Prolog.
Mỗi ngôn ngữ lập trình có các quy tắc để viết các đại lợng ( tên, số,)
và prolog cũng vậy.
+ Hằng :
Chia làm 2 loại.
Hằng ký hiệu.
Hằng số.
- Hằng ký hiệu :
Có 2 loại Hằng ký hiệu :
+ Dãy các chữ hoặc chữ số bắt đầu bằng một chữ thờng.
+ Dãy ký hiệu nằm trong dấu nháy đơn .
- Hằng số : Dùng để biểu diễn số nó có thể có mặt trong các biểu thức.

9


- Biến : Đợc viết nh hằng ký hiệu trừ đặc điểm là phải bắt đầu bằng một
chữ hoa hoặc một dấu gạch dới.
Biến đợc dùng để biểu diễn cho đối tợng mà ta cha thể đặt tên.
Chẳng hạn nh muốn biết Hùng loves tất cả những ai ta không thể
duyệt tất.
?_loves ( hung, Hoa)
?_loves ( hung, Ly)
Với ngôn ngữ tự nhiên ta phải hỏi Hung loves ai ? Và trong Prolog thể
hiện bởi :
?_loves (hung, X)
X thay thế cho các đối tợng mà ta cha biết có thể là Hoa, Ly.
Prolog phân biệt đợc biến với các tên gọi cụ thể của các đối tợng vì biến
bắt đầu bằng chữ hoa còn hằng ký tự hoặc bắt đầu bằng chữ thờng hoặc nằm
trong dấu nháy đơn.

Biến vô danh ký hiệu bởi dấu _ nó có một tính chất đặc biệt là có thể
ký hiệu cho mọi đối tợng.
+ Quy tắc viết các khẳng định, vị từ.
o. Tên vị từ bắt đầu bằng chữ thờng.
o. Các đối số của vị từ đợc viết trong ngoặc đơn.
o. Trong Prolog các suy dẫn đợc viết nh sau :
P : -P1 , P2 ,.Pn . ( * )
Trong đó :
P , P1 , P2, .Pn là các vị từ.
(*) đợc hiểu là : P đúng nếu P1 và P2 đều đúng. Cách viết trên tơng đơng
với :
P

if

P1 and P2 , and Pn .

10


Ví dụ : Vị từ thành phần :
thanh_phan (X, [ X |_ ].
thanh_phan (X, [ _ | Y ] : - thanh_phan (X,Y) đợc hiểu là :
X là thành phần của

[X | _ ]

X là thành phần của

[ _ | Y ] nếu


X là thành phần của Y.
Ví dụ : Vị từ giai thừa.
giai_thua(1,1).
(1)

giai_thua (N, ket_qua): -

(2)

N>0

(3)

N1 = N-1

(4)

giai_thua (N1, giai_thua N1 ),

(5)

ket_qua = N * giai_thua N1 .

Đợc hiểu là :
/* 1 giai thừa là 1*/
(1) N giai thừa là kết quả nếu :
(2) N > 0




(3) N1 = N-1 và
(4) N1 giai thừa bằng giai thừa N1 và
(5) Kết quả = N* giai thừa N1 .
1.5. Cấu trúc của một chơng trình Prolog.
Một chơng trình Prolog gồm các phần cơ bản sau :
1.

Domains.

Khai báo kiểu các đối tợng đợc dùng trong các vị từ của chơng trình.

11


Nhng nếu đối số của vị từ đợc viết dới dạng kiểu của đối số thì ta không
cần phải khai báo, ví dụ nh :
Bult(symbol, symbol )
Chia_het(integer, integer)
Cú pháp của khai báo là :
Domains
Nguoi, sach= symbol
.
2.

Predicates.

Đây là phần khai báo các vị từ đợc dùng trong phần Clauses. Nếu trong
Clauses dùng vị từ nào trong phần này ta phải khai báo nó trừ những vị từ
chuẩn đợc prolog cung cấp mà ta sẽ nói đến ở mục những vị từ đợc prolog

cung cấp .
Cú pháp của việc khai báo vị từ là :
Tên các vị từ ( đối số )
Ví dụ :
Giaithua (integer, integer)
Loves ( symbol, symbol )
3.

Clauses.

Gồm các khẳng định và các luật suy diễn mà chơng trình phải tuân theo
trong quá trình đi tìm lời giải.
Cú pháp của nó tuân theo quy tắc mà ta đã nói ở phần 2,3.
4.

Goal .

Đây là đích mà chơng trình phải giải đáp.
Nếu nó có sẵn trong chơng trình.

12


Ví dụ nh :
Goal.
Yeu(hung, X )

/* Hùng yêu ai */

Thì nó đợc gọi là goal nội.

Còn nếu chơng trình không có phần goal, khi chạy chơng trình máy sẽ
đa ra.
Goal : - đợc gọi là goal ngoại .
Chơng trình sẽ chờ những đích đợc đa vào cần giải quyết.
Sau đây là một chơng trình đơn giản thể hiện cấu trúc của một chơng
trình prolog.
Ví dụ 1 :
Domains
Nguoi=symbol
Predicates
Loves(hung,hoa) . /* hung loves hoa */
Loves(kien,hoa) . /* kien loves hoa */
Loves(hung, ly). /* hung loves ly */
Goal
Loves(X,hoa)
Chạy chơng trình ta đợc.
X=hung
X=kien
Solution.
Ví dụ 2 :
Domains

13


Mon,nguoi=symbol
predicates
mon_kho (mon)
di_choi(nguoi)
truot(nguoi,mon)

Clauses
Monkho(tri_tue_nhan_tao).
Dichoi(X) : - monkho(mon).
Truot(X,mon): - dichoi(X)
Write(Dự đoán là . X. truot ,mon)
Khi chạy chơng trình ta cho
Goal ngoại
Truot(hung, tri_tue_nhan_tao)
Ta đợc :
Dự đoán là Hung truot tri_tue_nhan_tao.
Một câu hỏi đặt ra là : Quá trình tìm lời giải cho các câu hỏi diễn ra nh
thế nào ?
Để trả lời cho câu hỏi trên, ta đi tiếp phần sau :

14


2. Quá trình tìm lời giải hay quá trình thực hiện các
đích của prolog .

2.1. Sự bằng nhau.
Là một tính chất quan trọng của logic vị từ bậc nhất.
Tính chất bằng nhau đợc cài sẵn vào hệ thống của prolog, đợc ký hiệu là
=.
+ Một hằng đợc coi là bằng chính nó.
Hung = hung.
100 = 100
+ Hai cấu trúc bằng nhau nếu nó có cùng tên ( functor ), cùng số thành
phần và các thành phần tơng ứng bằng nhau.
2.2. Đồng nhất hoá :

Là quá trình gán giá trị ( truyền tham số ) cho các biến và quá trình này
phải tuân theo quy tắc sau :
+ Một biến cha gán giá trị có thể đồng nhất với một đối tợng bất kỳ.
+ Hằng có thể đồng nhất với chính nó hoặc với một biến cha đợc
gán trị.
+ Một cấu trúc có thể đồng nhất với một cấu trúc khác nếu có cùng tên,
cùng số thành phần và các thành phần tơng ứng có thể đồng nhất đợc với nhau.
Ví dụ : Hai cấu trúc sau là không thể đồng nhất nếu m n.
Struct 1 ( X, struct 2 ( X, const )
Và struct 1 ( m, struct 2 ( n, const ) ).
+ Hai khẳng định đồng nhất đợc với nhau nên vị từ và các đối tơng ứng
giống nhau. Ta xét ví dụ sau :
domains
nguoi, vat = symbol
predicates

15


thich ( nguoi, vat )
clauses
thich ( hung, computers ).
thich ( hung, sach ).
Thich ( hoa, tien ).
Goal :
Thich ( X, sach ).
Tìm kiếm lời giải trong prolog là gì ?
2.3. Tìm kiếm lời giải trong prolog và các thuật giải phân tích với
văn phạm.
Quá trình tìm kiếm lời giải thực chất là quá trình làm thoả mãn các vị từ

của phần Goal mà thao tác chính là thao tác đồng nhất hoá : thay thế các biến
bằng các giá trị có thể có, có bao nhiêu cách thay thế sẽ có bấy nhiêu lời giải.
Sau khi biến đợc gán giá trị, nó có làm thoả các đích không ? và quy tắc
nào cho biết một đích đã đợc thoả ?
Quy tắc để một đích thoả là :
1.

Một clauses dạng S thì nó đã đợc thoả, ví dụ :

thich ( hung, computers ).
thich ( hung, sach ).
thich ( hoa, tien ).
2.

Một clauses dạng

P : -P1, P2,. Pn
đợc hiểu là P đợc thoả khi P1 và P2 và P3.. Pn thoả.
Ví dụ :
Yeu ( hung, X ) : - con gái ( X ), xinh ( X ).
Khi ta đặt ra câu hỏi :

16


? P1, P2 Pn .
nghĩa là hãy làm thoả P1 sau đó là P2 . Và Pn.
Bây giờ, giả sử ta muốn biết những gì mà cả Hùng và Hoa cùng thích,
muốn vậy ta đặt câu hỏi ? thich ( hung, X ), thich ( hoa, X ).
Để đạt đợc đích này theo ( 2 ) phải làm thoả đồng thời

và thich ( hoa, X ).

thich (hung, X)

Prolog tìm cách làm thoả thich ( hung, X ) trớc bằng cách duyệt các
khẳng định trong cơ sở dữ liệu, tìm cách khẳng định có thể đồng nhất với câu
hỏi gán trị cho X . Một câu hỏi đặt ra là :
+ Prolog duỵêt theo thứ tự nào ? ( * ) và với X vừa đợc gán trị có làm
cho thich ( hoa, X ) thoả không ?
+ Nếu không thoả phải xử lý nh thế nào ? ( * * ).
Chiến lợc tìm kiếm để làm thoả các đích là nhất quán.
+ Thứ tự u tiên từ trên xuống dới, từ trái qua phải ( * ).
+ Việc thực hiện một đích tơng tự nh việc áp dụng một luật trong văn
phạm, ta phải tìm kiếm một luật prolog mà phần của nó tơng ứng với đích và
thay thế đích này bởi vế bên phải của luật bằng phép đồng nhất nh đã nêu.
Viêc làm này tơng đơng với áp dụng một sản xuất thay vế trái của sản xuất
bằng vế phải của nó.
Quá trình tìm kiếm lời giải cho một câu hỏi tơng đơng với việc phân
tích xem một xâu W có thuộc ngôn ngữ sinh ra bởi một văn phạm G không ?
Trớc tiên ta xét xem các giải thuật phân tích của văn phạm và sau đó
xem prolog dùng giải thuật gì trong quá trình tìm kiếm lời giải.
Giả sử ta có văn phạm :
G = ( N, T, S , P ).
Trong đó :
+ N : Tập các ký hiệu không kết thúc.

17


+ T : Tập các ký hiệu kết thúc.

+ S : Ký hiệu đầu.
+ P : Tập con hữu hạn của V * NV * x V *.
Phần tử của P là các cặp ( , ).
Viết gọi là một suất của văn phạm.
+ Gọi : X S là một suy dẫn.
Nếu = A
= à


A à là một sản xuất của P.

Ví dụ một văn phạm :
G = ( N, T, S, P ).
N={S}
T = { a, b, c }
P:
S aSbS
S aS
Sc
Ta định nghĩa là dạng câu nếu xuất phát từ ký hiệu đầu S bằng cách áp
dụng các suy dẫn ta có thể đến đợc .
Ví dụ a S là dạng câu :
+ Ta goi một xâu là một câu nếu nó là dạng câu và nó chỉ chứa các ký
hiệu kết thúc .

18


Ví dụ : ac là một câu vì : S aS ac.
Và c, C T

+ Ngôn ngữ sinh ra từ G là tập tất cả các xâu sinh ra từ G, ký hiệu là L
( G ).
L ( G ) = { W T* | S * W }
Bây giờ phân tích một xâu w chẳng hạn : w = abc là xem w có thuộc
L(G) không.
Nh vậy việc phân tích xâu w chính là viết suy dẫn hoặc xem viết cây cú
pháp đối với câu đó.
Nó giống với việc thực hiện một đích trong prolog là áp dụng các luật
trong phần Clauses để làm thoả đích.
Đối với văn phạm thông thờng, với xâu vào w ngời ta xét xâu vào từ trái
đến phải bắt đầu từ ký hiệu trái nhất rồi đến ký hiệu tiếp theo cho đến hết.
Phân tích chính là hình thành cây cú pháp còn prolog là xây dựng cây
lời giải.
Có hai kiểu phân tích ứng với 2 phơng pháp hình thành cây cú pháp,
đó là :
+ Phân tích trên xuống

Top _ down.

+ Phân tích dới lên Bottom_up.
Phân tích Top_down đối với một xâu w là xuất phát từ ký hiệu đầu S
( gốc cây ) bằng cách áp dụng các suy dẫn trái ( mở rộng cây ) để thử tạo ra w
( tới lá ).
Phân tích Bottom_up : Ngợc với phân tích top_down ta xuất phát từ
chính xâu vào w bằng cách thu gọn các suy dẫn phải ( chặt cành ) để đi về S
( gốc ).

19



Nếu việc phân tích thành công : Đến đợc w với Top_down và về đợc gốc
với bottom_up, thì ta kết luận w thuộc vào ngôn ngữ sinh ra bởi văn phạm G
nếu không thì w không thuộc ngôn ngữ sinh ra bởi văn phạm .
Đối với prolog đích nêu ra ở goal đợc thoả còn ngợc lại đích không đợc
thoả.
Tại một thời điểm trong quá trình phân tích, ta phải chọn sản xuất nào
để mở rộng cây ( hay chặt cành với bottom_up ) ?
1 | 2 | 3 | n chọn nào, còn đối với prolog chọn luật nào
trong số các luật của clauses trong quá trình làm thoả đích ?
Có nhiều phơng pháp để giải quyết nhng ngời ta quy về hai phơng pháp
chính.
+ Phân tích quay lui.
+ Phân tích tất định.
Phân tích quay lui : Chọn sản xuất từ sản xuất đầu tiên thử áp dụng, tiếp
tục áp dụng các sản xuất lại chọn từ sản xuất đầu tiên.
Nếu sai quay lui về sản xuất trớc. Đây cũng chính là hình ảnh của cơ
chế Backtracking cơ chế duyệt các trạng thái và tìm kiếm lời giải của
prolog.
+ Xuất phát từ đích Prolog duyệt cơ sở dữ liệu trong clauses từ trình
clauses đầu tiên xem có khẳng định hoặc đầu của một luật có thể đồng nhất đợc với đích không ? Nếu đợc prolog ghi nhớ vị trí này và tiến hành gán trị cho
các biến nếu tại vị trí này lại là đầu của một luật P : -P 1, P2. Pn thì lại tiến
hành làm thoả cho các Pi.
ở bớc thứ k :

Nếu không tìm đợc một khẳng định nào hoặc không tìm đợc đầu của
luật để đồng nhất đợc với đích thì bớc này ta đã thất bại phải quay lui về luật
đã đợc đánh dấu ở bớc trớc ( k 1 ) ta không áp dụng luật này phải duyệt các
khẳng định hay các luật từ vị trí sau của luật này.

20



Giải thuật phân tích quay lui cho văn phạm G (N, T, S, P ), các sản
xuất đợc đánh số 1, 2 q đối với xâu w có thể mô tả nh sau :
+ Dùng biến trỏ trỏ vào w lúc đầu chỉ vào ký hiệu trái nhất.
+ Dựng cây một nút mang nhãn S đầu tiên, S đợc chọn làm nút
hoạt động .
Thực hiện hai thao tác sau một cách đệ quy :
1. Nếu nút hoạt động là ký hiệu không kết thúc, giả sử là A N, ta chọn
sản xuất đầu tiên A x1 x2 xk và dựng cây từ A tới các nút mang nhãn x 1,
x2 xk lấy x1 làm nút hoạt động.
2. Nếu nút hoạt động là ký hiệu kết thúc a T. So sánh với ký hiệu đang
đợc trỏ của w sẽ có 2 khả năng xảy ra :
+ Nếu a trùng với ký hiệu đang trỏ : biến trỏ dịch 1 vị trí về bên phải và
lấy nút liền bên phải làm nút hoạt động.
+ Nếu không trùng quay lui lại đến lựa chọn trớc thứ lựa chọn khác, nếu
mọi khả năng đã vét cạn mà không suy dẫn ra w khi đó sẽ thông báo sai.
Nhận xét về giải thuật phân tích quay lui cho văn phạm hay
Backtracking của prolog .
+ Vì phải thử lần lợt cho nên tốn thời gian.
+ Vấp phải khó khăn khi G là văn phạm đệ quy trái. Văn phạm đệ quy
trái là văn phạm chứa sản xuất dạng.
A A ( sản xuất đệ quy trái ).
Nguyên nhân do giải thuật luôn lấy x 1 làm nút hoạt động, do đó sẽ rơi
vào vòng lặp vô hạn.

Một số kết quả rất quan trọng là:

21



Phân tích top_down là dừng khi và chỉ khi văn phạm không chứa sản
xuất đệ quy trái.
Tuy nhiên, đây không phải là hạn chế thực sự, bởi vì ta có thể biến một
văn phạm đệ quy trái về một văn phạm đệ quy phải tơng đơng với nó và giải
thuật sẽ dừng.
Hai văn phạm tơng đơng với nhau nếu nó sinh ra cùng một ngôn ngữ.
Cơ chế tìm lời giải trong prolog nh giải thuật phân tích quay lui, prolog
luôn tìm luật từ trên xuống dới, do vậy, khi gặp phải một luật đệ quy trái, nó
cũng rơi vào vòng lặp vô hạn.
Ví dụ nh đoạn chơng trình sau :
Nguoi (X) : - nguoi ( Y), me (Y, X ), /* X là ngời nếu Y là ngời và Y là
mẹ X8/
Nguoi( hung ).
Bây giờ nếu ta đặt câu hỏi
?- nguoi( hung )
Prolog sẽ duyệt từ trên xuống luật đầu đợc dùng, nó gán trị cho X : X =
hung, tiếp đến nó đi làm thoả các đích ở vế phải của luật tức là làm thoả nguoi
( Y ).
để thoả đích này, nó lại duyệt từ đầu và cứ thế cho đến khi hết bộ nhớ.

Phơng án giải quyết
+ Biến đổi văn phạm đệ quy trái về văn phạm tơng đơng không còn đệ
quy trái của tơng ứng là biến đổi các luật trong clause thành các luật không
còn đệ quy trái nữa.

22


+ Ngoài ra, prolog còn cung cấp vị từ cut, đây là vị từ không đối số

ký hiệu ! , mục đích để kết thúc quá trình backtracking trong một số điều
kiện, do logic của chơng trình yêu cầu hay khi ta biết việc làm thoả một số
đích không làm tăng chất lợng của lời giải, việc quay lui lúc này chỉ làm mất
thời gian.
Nh đã nói trong quá trình tìm kiếm lời giải, việc quay lui lúc này chỉ
làm mất thời gian.
Nh đã nói trong quá trình tìm kiếm lời giải ở bớc thứ k, nếu prolog áp
dụng luật j thì luật này phải đợc ghi nhớ để quay lui, nhng khi gặp toán tử cut,
mọi đích trớc đó đều đợc thoả và nh vậy, ở đích tiếp theo nếu không thành
công sẽ không thể quay lui đợc.
Trái với cut, prolog cung cấp vị từ fail, vị từ fail là vị từ luôn sai mà khi
sai prolog sẽ quay lui. Nh vậy, fail đợc dùng khi muốn hiệu ứng backtracking
xảy ra.
Nh vậy, do cách tự động tìm lời giải của prolog theo giải thuật
backtracking hay tơng đơng với thuật toán phân tích quay lui trong văn phạm
nên thứ tự các luật đợc viết ở clause hết sức quan trọng, một chơng trình nếu
đổi thứ tự các luật thì với cùng một câu hỏi có thể cho trả lời khác nhau nh ta
đã thấy.
2.4. Phân tích tất định
Phân tích tất định là kiểu phân tích mà tại mỗi bớc đứng trớc
lựa chọn:
A 1 | 2 . | n
Ta biết chắc chắn phải chọn i nào.
Tuy nhiên, các giải thuật phân tích tất định chỉ áp dụng hiệu qủa đợc với
một lớp văn phạm phi ngữ cảnh, nghĩa là với một xâu w có độ dài n : ta chỉ cần
tiến hành n* c ( thao tác ), những văn phạm đó là :
-

Văn phạm LL ( K )


23


-

Văn phạm xem trớc ( precedence)

-

Văn phạm LR ( K )

1.

Văn phạm LL ( K ) ( Language Left)

2.

G = (N, T, S, P )

3.

L(G) = ( w T* / S w )

4.
Xét 1 lớp con của VPPNC mà ta có thể áp dụng phân tích
top_down tất định :
5.

1 ĐN : First, follow.


6.

Cho VPPNc G = ( N, T, S, P )

7.

k Z*

8.

Xâu V*

9.

(+) Tập FIRSTk () = x T*

1.

* x, l(x) = k

x, l(x) =< k

FIRsTk() : tập hợp các xâu kết thúc, suy dẫn đầu tiên từ , có độ dài
=< k
Nhận xét : Nếu gồn toàn ký hiệu kết thúc, ta lấy k ký tự đầu.
Ví dụ : G = ( N, T, S, P ) = { ( S, A )} T = { a, b }
P : S a Abb/b

A bS/aa


First1(S ) = {a, b }
A, S V*
First(S)1 = First1 (a, Abb) FirstS1 (b )
= a Abb :

a Abb 1(x) = 1(a) = 1

24


First1 ( a Abb ) = {a}
= b : b

1(x ) = 1(b) = 1

FirstS1 (b ) = {b }
First1 ( A ) = {a, b }
FirstS1(bS) = {b}
=aa: aa 1(x) = L () = 1
FirstS1 (aa) = {a}
FirstS2 = First2 ( a Abb) FirstS2 ( b )
= a Abb : abSbb aaabb
L(x) = L(ab) = 2; 1(x) = 1(aa ) = 2
=b 1(x) = 1(b) = 1
FirstS2 ( S ) = { ab, aa, b }
Tập Followk ()= { x T*/ S và x = Firstk ()
Tập Followk () là tập hợp các xâu kết thúc, liền bên phải trong bất kỳ
dạng câu, độ dài =< k
Ví dụ : Follow1(S) = {b}
2. Định nghĩa sản xuất LL(k )

Cho VP G = ( N, T, S, P ), sản xuất A là LL(k) nếu :
S *x A x 1 * x z1
S *x A x 2 * x z2
Nếu Firstk(z1 ) = Firstk ( z2 ) kéo theo 1 = 2
3.Định nghĩa : Văn phạm LL ( k )

25


×