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

TIỂU LUẬN NHẬN BIẾT TỪ HÁN VIỆT

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 (289.9 KB, 27 trang )

MỤC LỤC
GIỚI THIỆU...........................................................................................................................2
PHẦN 1: CƠ SỞ LÝ THUYẾT............................................................................................3
PHẦN 2. CÀI ĐẶT VÀ DEMO CHƯƠNG TRÌNH .........................................................18
TÀI LIỆU THAM KHẢO....................................................................................................27


Tiểu luận môn học Công nghệ tri thức

GIỚI THIỆU
Trong quá trình sử dụng tiếng Việt, việc phân biệt được từ các từ Hán-Việt và các
từ thuần Việt sẽ giúp cho người đọc dễ dàng hiểu đúng nghĩa câu văn hơn. Tuy nhiên,
việc nhận biết được các từ Hán-Việt không phải là một điều đơn giản với đa số người đọc.
Tác giả Phan Ngọc đã đưa ra một số mẹo đơn giản để giúp chúng ta nhận biết các từ HánViệt một cách dễ dàng. Các mẹo này được trình bày thông qua cuốn sách “Mẹo giải nghĩa
từ Hán - Việt và chữa lỗi chính tả, NXB Thanh Niên năm 2000.
Nhằm nâng cao việc áp dụng kiến thức đã học trong mơn học Cơng nghệ tri thức,
nhóm chúng em chọn đề tài “Xây dựng chương trình để nhận biết một từ nhập vào có
phải là từ Hán-Việt hay khơng? Dựa vào các luật (mẹo chính tả ) của GS. Phan Ngọc” Đề
tài sẽ xây dựng một chương trình cho phép người dùng kiểm tra một từ có phải là từ HánViệt hay không.
Nội dung của đề tài được chia làm 3 phần sau đây:
I. Nghiên cứu cơ sở lý thuyết để xây dựng đề tài
II. Phân tích bài tốn để xây dựng chương trình
III. Demo chương trình

Trên những cơ sở lý thuyết học được, nghiên cứu các tài liệu tham khảo và
sự giúp đỡ của các thành viên trong lớp, chúng tơi xin được tổng kết và báo cáo đề
tài. Kính mong được sự góp ý chân thành của quý thầy và các anh chị. Chúng tôi
xin chân thành cảm ơn sự chỉ bảo tận tình của PGS.TS. Phan Huy Khánh giúp
chúng tơi hồn thành tốt đề tài này.
Nhóm làm đề tài:
Đinh Thị Thiên Anh


Lê Hồng Dũng
Lê Thị Thu Hà

Trang 2


Tiểu luận môn học Công nghệ tri thức

PHẦN 1: CƠ SỞ LÝ THUYẾT
1.

Phát biểu bài tốn

Xây dựng chương trình để nhận biết một từ nhập vào có phải là từ Hán-Việt hay
khơng? Dựa vào các luật (mẹo chính tả ) của GS. Phan Ngọc. Ví dụ “quốc gia”, “tổ
quốc”… là từ Hán-Việt, tuy nhiên “nhà nước”, “đất nước”… không phải là từ Hán-Việt
(từ thuần Việt).

2.

Cơ sở lý thuyết liên quan

Nhằm mục đích giải quyết bài tốn trên chúng ta phải dựa lý thuyết về logic vị từ và cách
sử dụng chúng trong Prolog. Trong phần này chúng ta sẽ đi vài nghiên cứu một số nội
dung cơ bản đó.
2.1. Xây dựng sự kiện trong ngôn ngữ Prolog (7 -11 – giáo trình Prolog)
Để xây dựng các sự kiện trong chương trình Prolog, ta lấy một ví dụ về cây gia hệ như
sau:
(a)


(b)
Tom

Mary

parent
Bill

Ann

Liz

Sue

Tom

Bill

Jim

Hình 1. Cây gia hệ

Trong câu gia hệ (a), các nút chỉ người, còn các mũi tên chỉ quan hệ cha mẹ của
(parent of). Sự kiện Tom là cha mẹ của Bill được viết thành một vị từ trong Prolog như
sau:
Parent(Tom, Bill).
Ở đây, vị từ parent có hai đối số là Tom và Bill. Người ta có thể biểu diễn vị tự này
bằng một cây như trong hình (b) ở trên: nút gốclà tên vị từ, các nút còn lại là các nút đối.

Trang 3



Tiểu luận môn học Công nghệ tri thức
Trong cây gia hệ ở trên, ta có thể tiếp tục viết các vị từ khác để nhận được một
chương trình Prolog gồm 6 vị từ như sau:
Parent(Mary, Bill).
Parent(Tom, Bill).
Parent(Tom, Liz).
Parent(Bill, Ann).
Parent(Bill, Sue).
Parent(Sue, Jim).
Sau khi hệ thống Prolog nhận được chương trình này, thực chất là một cơ sở dữ
liệu, người ta có thể đặt các câu hỏi liên quan đến quan hệ Parent. Ví dụ câu hỏi Bill có
phải là cha mẹ của Sue được gõ vào trong hệ thống đối thoại của Prolog (dấu nhắc lệnh)
như sau:
? – parent(Bill,Sue).
Sau khi tìm thấy sự kiện này trong chương trình, Prolog trả lời:
Yes
Ta tiếp tục đặt câu hỏi khác:
? – parent(Liz,Sue).
No
Bởi vì Prolog khơng tìm thấy sự kiện Liz là người mẹ của Sue trong chương trình.
Tương tự, Prolog sẽ trả lời No cho sự kiện:
? – parent(Tom,Ben).
Vì tên Ben chưa được đưa vào chương trình. Ta có thể tiếp tục đặt ra các câu hỏi
thú vị khác. Chẳng hạn ai là cha (hay mẹ) của Liz?
? – parent(X,Liz).
Lần này, trước khi đưa ra câu trả lời Yes hoặc No, Prolog đưa ra một giá trị của X
làm thoả mãn câu hỏi trên đây:
X=tom

Để biết được ai là con của Bill ta chỉ cần viết:
? – parent(Bill,x).
Với câu hỏi này, Prolog sẽ có hai câu trả lời, đầu tiên là:
X=ann ->;
Để biết được câu trả lời tiếp theo, trong hầu hết các cài đặt của Prolog, người sử
dụng phải gõ vào một dấu chấm phẩy(;) sau ->:

Trang 4


Tiểu luận môn học Công nghệ tri thức
X=Sue
Nếu đã hết phương án trả lời mà vẫn tiếp tục gõ dấu (;), Prolog trả lời No, ngược
lại trả lời Yes.
Người sử dụng có thể đặt các câu hỏi tổng quát hơn, chẳng hạn: ai là cha mẹ của
ai? Nói cách khác, cần tìm X và Y sao cho X là cha mẹ của Y. Ta viết như sau:
?- parent(X, Y)
Sau khi trả lời câu hỏi đầu tiên, Prolog sẽ lần lượt tìm kiếm các cặp cha mẹ - thoả
mãn và lần lượt hiển thị kết quả nếu chừng nào người sử dụng cịn u cầu cho đến khi
khơng cịn kết quả lời giải nào nữa (kết thúc bởi chữ Yes):
X = Mary
Y = Bill ->;
X = Tom
Y = Bill ->;
X = Tom
Y = Liz ->;
X = Bill
Y = Ann ->;
X = Bill
Y = Sue ->;

X = Sue
Y = Jim ->;
Tuỳ theo cài đặt của Prolog, người sử dụng có thể gõ vào dấu chấm (.) hoặc Enter
để chấm dứt giữa chừng luồng trả lời.
Ta có thể tiếp tục đưa ra những câu hỏi phức tạp hơn khác, chẳng hạn ai là ông
(bà) của Jim? Thực tế quan hệ ông – bà chưa được định nghĩa, cần phân tách câu hỏi này
thành hai phần sơ cấp hơn:
Ai là cha (mẹ) của Jim? Giả sử có tên là Y.
Ai là cha mẹ của Y? Giả sử có tên là X.

Trang 5


Tiểu luận mơn học Cơng nghệ tri thức
X

parent
Y

grandparent

parent
Jim

Hình 2. Quan hệ ông bà được tập hợp từ hai quan hệ cha mẹ

Lúc này, ta có ta có thể viết chương trình của Prolog như sau:
?- parent(Y, jim), parent(X, Y)
Prolog trả lời:
Y=Sue

X=Bill
Yes
Câu hỏi trên đây tương ứng với các câu hỏi: Tìm X và Y thoả mãn:
Parent(Y,

Jim).


Parent(X, Y).
Nếu thay đổi thứ tự hai thành phần câu hỏi, thì nghĩa logic vẫn khơng thay đổi và
Prolog trả lời cùng kết quả (có thể thay đổi về thứ tự), nghĩa là ta có thể đặt câu hỏi như
sau:
?- parent(X, Y),

parent(Y, Jim).

X = Bill
Y = Sue
Yes
Bây giờ ta đặt câu hỏi ai là cháu của Tom?
?- parent(Tom, X),

parent(X, Y).

X = Bill
Y = Ann ->;
X = Bill
Y = Sue ->;
No
Trang 6



Tiểu luận môn học Công nghệ tri thức
Một câu hỏi khác có thể như sau: Ann và Sue có cùng cha mẹ không? nghĩa là ta
diễn đạt thành hai gia đoạn:
1. Tìm X là cha mẹ của Ann
2. X tìm thấy có cùng cha mẹ của Sue khơng?
Câu hỏi và trả lời trong Prolog như sau:
?- parent(X, Ann), parent(X, Sue).
X= Bill
Trong Prolog, câu hỏi được gọi là đích (goal) cần phải được thoả mãn. Mỗi câu hỏi
đặt ra đối với cơ sở dữ liệu có thể tương ứng với một hoặc nhiều đích. Chẳng hạn dãy các
đích:
parent(X, Ann), parent(X, Sue).
Tương ứng với câu hỏi là phép hội của hai mệnh đề:
X là một cha mẹ của Ann, và
X là một cha mẹ của Sue.
Nếu câu trả lời là Yes, thì có nghĩa đích đã được thoả mãn, hay đã thành cơng.
Trong trường hợp ngược lại, câu trả lư là No, có nghĩa là đích khơng được thoả mãn,
hay đã thất bại.
Nếu có nhiều câu trả lời cho một câu hỏi, Prolog sẽ đưa ra câu trả lời đầu tiên và
chờ yêu cầu của người sử dụng tiếp tục.
2.2. Xây dựng luật trong ngơn ngữ Prolog (Trang 11-22 giáo trình Prolog)
2.2.1.

Định nghĩa luật

Từ chương trình gia hệ trên đây, ta có thể dễ dàng bổ sung các thông tin khác, chẳng
hạn bổ sung các sự kiện về giới tính (nam, nữ) của những người đã nêu tên trong quan hệ
parent như sau:

woman(Mary).
man(Tom).
man(Bill).
woman(Liz).
woman(Sue).
woman(Ann).
man(Jim).
Ta đã định nghĩa các quan hệ đơn woman và man vì chúng chỉ liên quan đến một đối
tượng duy nhất. Cịn quan hệ parent là nhị phân, vì liên quan đến một cặp đối tượng. Như
vậy, các quan hệ đơn dùng để thiết lập một thuộc tính của một đối tượng. Mệnh đề:

Trang 7


Tiểu luận mơn học Cơng nghệ tri thức
woman(Mary).
được giải thích: Mary là nữ. Tuy nhiên, ta cũng có thể sử dụng quan hệ nhị phận để định
nghĩa giới tính:
sex(Mary,
sex(Tom,
sex(Bill,

female)
female)
female)

. . . . .
Bây giờ chúng ta đưa vào một quan hệ mới child, đối ngược với parent như sau:
child(Liz, Tom)
Từ đó, ta định nghĩa các luật mới như sau:

child(X, Y) :- parent(X, Y).
Luật trên được biểu diễn là:
Với mọi X và Y,
Y là con của X nếu
X là cha (hay mẹ) của Y.
Với mọi X và Y,
nếu X là cha (hay mẹ) của Y thì
Y là con của X.
Có sự khác nhau cơ bản giữa sự kiện và luật. Một sự kiện, chẳng hạn:
parent(Tom, Liz).
là một điều gì đó ln đúng, khơng có điều kiện gì ràng buộc. Trong khi đó, các luật liên
quan đến các thuộc tính chỉ được thoả mãn nếu một số điều kiện nào đó được thoả mãn.
Mỗi luật bao gồm hai phần:
• Phần bên phải chỉ điều kiện, còn được gọi là thân của luật, và
• Phần bên trái chỉ kết luận, cịn gọi là đầu của luật.
Nếu điều kiện parent(X, Y) là đúng, thì child(X, Y) cũng đúng và là hậu quả logic của
phép suy luận.
child(Y, X)
Y).
đầu

:-

parent(X,
thân

Câu hỏi sau đây giải thích cách Prolog sử dụng các luật: Liz có phải là con của
Tom không?

Trang 8



Tiểu luận môn học Công nghệ tri thức
?- child(Liz, Tom)
Thực tế, trong chương trình khơng có sự kiện nào liên quan đến con, mà ta phải
tìm cách áp dụng các luật. Luật trên đây ở dạng tổng quát với các đối tượng X và Y bất
kỳ, mà ta lại cần các đối tượng cụ thể Liz và Tom.
Ta cần sử dụng phép thế bằng cách gán giá trị Liz cho biến Y và Tom cho biến X.
Người ta nó rằng các biến X và Y đã được ràng buộc:
X = Tom

Y = Liz
Lúc này, phần điều kiện có giá trị parent(Tom, Liz) và trở thành đích con (sub
goal) để Prolog thay thế cho đích child(Liz, Tim). Tuy nhiên, đích này thoả mãn và có giá
trị Yes vì chính là sự kiện đã thiết lập trong chương trình.
Sau đây, ta tiếp tục bổ sung các quan hệ mới. Quan hệ mẹ mother được định nghĩa
như sau (chú ý dấu phẩy (,) chỉ phép hội hay phép và logic):
mother(X, Y)

:-

parent(X, Y), woman(X).

được hiểu là:
Với mọi X và Y, X là mẹ của Y
nếu X là cha(hay mẹ) của Y và X là nữ.
Đồ thị sau đây minh hoạ việc định nghĩa các quan hệ child, mother và grandparent
sử dụng một quan hệ khác:
Trong đồ thị, người ta qui ước rằng: các nút tương ứng với các đối tượng (là các
đối của các quan hệ). Các cung nối các nút tương ứng với các quan hệ nhị phân, được

định hướng từ đối thứ nhất đến đối thứ 2 của quan hệ.
X

parent

X

parent

child
Y

woman
mother

Y
X

parent
Y

grandparent

parent
Jim

Hình 3. Định nghĩa các quan hệ child, mother và grandparent từ quan hệ parent

Trang 9



Tiểu luận môn học Công nghệ tri thức
Một quan hệ đơn được biểu diễn bởi tên quan hệ tương ứng với nhãn của đối tượng đó.
Các quan hệ cần định nghĩa được biểu diễn bằng các cung có nét đứt. Mỗi đồ thị được
giải thích như sau: Nếu các quan hệ được chỉ bởi các cung có nét liền được thoả mãn, thì
quan hệ biểu diễn bởi cung có nét đứt cũng được thoả mãn.
Như vậy, quan hệ ông – bà grandparent được viết như sau:
Grandparent(X, Z)

:-

parent(X, Y), parent(Y, Z).

Để thuận tiện cho việc đọc chương trình Prolog, ta có thể viết một luật trên nhiều dòng,
dòng đầu tiên là phần đầu của luật, các dòng tiếp theo là phần thân của luật, mỗi đích trên
một dịng phân biệt. Bây giờ quan hệ grandparent được viết lại như sau:
Grandparent(X, Z)

:-

parent(X, Y),
parent(Y, Z).
Ta tiếp tục định nghĩa quan hệ chị em gái sister như sau:
Với mọi X và Y, X là chị em gái của Y nếu
(1) X và Y có cùng cha (cùng mẹ), và
(2) X là nữ.
sister(X, Y)

:-


parent(Z, X),
parent(Z, Y),
woman(X).
X

parent

parent
Jim

Y

woman

sister

Hình 4. Định nghĩa quan hệ chị em gái

Chú ý cách giải thích điều kiện X và Y có cùng cha mẹ: một Z nào đó phải là một
cha mẹ của X, và cũng Z đó phải là cha mẹ của Y.
Hay nói cách khác là: Z1 là một cha mẹ của X, Z2 là một cha mẹ của Y, và Z1
đồng nhất với Z2.
Ann là nữ, Ann và Sue cùng cha mẹ nên Ann là chị em gái của Sue, ta có:

Trang
10


Tiểu luận môn học Công nghệ tri thức
?- sister(ann, sue).

Yes
Ta cũng có thể hỏi ai là chị em gái của Sue như sau:
?- sister(X, Sue).
Prolog sẽ lần lượt đưa ra hai câu trả lời:
X = ann
X = sue
Yes
Vậy thì Sue là em gái của chính mình?! Điều này sai vì ta chưa giải thích rõ trong
định nghĩa chị em gái. Nếu chỉ dựa vào định nghĩa trên đây thì câu trả lời của Prolog là
hoàn toàn hợp lý. Prolog suy luận rằng X và Y có thể đồng nhất với nhau, mỗi người đàn
bà có cùng cha mẹ sẽ là em gái của chính mình. T cần sử lại định nghĩa bằng cách thêm
vào điều kiện X và Y phải khác nhau. Như sẽ thấy sau này, Prolog có nhiều cách để giải
quyết, tuy nhiên lúc này ta sử dụng quan hệ:
different(X, Y)
đã được Prolog nhận biết và được thoả mãn nếu và chỉ nếu X và Y không bằng nhau.
Định nghĩa chị (em) gái mới như sau:
sister(X, Y)

:-

parent(Z, X),
parent(Z, Y),
woman(X).
different(X, Y).
Ví dụ 1: Ta lấy ví dụ cổ điển sử dụng hai tiên đề sau đây:
Tất cả mọi người đều chết
Socrate là mộtngười
Ta viết trong Prolog như sau:
mortal(X)


:- man(X).

man(socrate).
Một định lý được suy luận một cách logic từ hai tiên đề này là Socrate phải chết. Ta đặt
các câu hỏi như sau:
?- mortal(socrate)
Ví dụ 2: Ta đã xây dựng các sự kiện và các luật có dạng vị từ chứa tham đối, sau đây, ta
lấy một ví dụ khác về sự kiện và luật không chứa tham đối:

Trang
11


Tiểu luận môn học Công nghệ tri thức
‘ It is sunny’.
‘It is summer’.
‘It is hot’ :‘It is summer’, ‘It is sunny.
‘ It is cold’ :‘It is winter’, ‘It is snowing’.
Từ chương trình trên, ta có thể đặt câu hỏi:
?-

‘It is hot ‘.

Yes
Câu trả lời ‘It is hot’ là đúng vì có các sự kiện ‘It is sunny’ và ‘It is summer’ trong chương
trình. Cịn câu hỏi “?- ‘It is cold”. Có câu trả lời sai.
2.2.2.

Định nghĩa các luật đệ quy


Bây giờ chúng ta thêm một quan hệ mới vào chương trình. Quan hệ này chỉ sử dụng
quan hệ parent, và chỉ có hai luật. Luật thứ nhất định nghĩa các tổ tiên trực tiếp, luật thứ
hai định nghĩa các tổ tiên gián tiếp.
Ta nói rằng X là một tổ tiên gián tiếp của Z nếu tồn tại một liên hệ cha mẹ (ơng bà)
giữa X và Z:

X

parent

X

parent

ancestor
Y

parent

ancestor

(a)
parent
Y

(b)
Hình 5. Quan hệ tổ tiên trực tiếp và gián tiếp
Trong cây gia hệ ở trên, Tom là tổ tiên trực tiếp của Liz, và tổ tiên gián tiếp của Sue.
Ta định nghĩa luật 1(tổ tiên trực tiếp) như sau:
Với mọi X và Z,

Trang
12


Tiểu luận môn học Công nghệ tri thức
X là tổ tiên của Z nếu
X là cha mẹ của Z.
ancestor(X, Z):parent(X, Z).
Định nghĩa luật 2 (tổ tiên gián tiếp) phức tạp hơn, trìng Prolog trở nên dài dịng
hơn, mỗi khi càng mở rộng mức tổ tiên hậu duệ như chỉ ra ở hình 6 dưới đây. Kể cả luật
1, ta có tổ tiên được định nghĩa như sau:
ancestor(X, Z):- %luật

định nghĩa tổ tiên trực tiếp

parent(X, Z).
ancestor(X, Z):- % luật 2: tổ tiên gián tiếp là ông bà (tam đại)
parent(X, Y),
parent(Y, Z).
ancestor(X, Z):- % tổ tiên gián tiếp là cố ông cố bà (tứ đại)
parent(X, Y1),
parent(Y1, Y2),
parent(Y2, Z).
ancestor(X, Z):- % ngũ đại đồng đường
parent(X, Y1),
parent(Y1, Y2),
parent(Y2, Y3),
parent(Y3, Z).

Trang

13


Tiểu luận môn học Công nghệ tri thức
. . . . . .
X

parent

X

ancestor

parent

Y

parent
Y1

parent

parent

X

Y

ancestor


Y1
parent

Y2
parent

ancestor
Y2

parent
Z

Z

parent
Z

Hình 6. Các cặp tổ tiên hậu duệ gián tiếp ở các mức khác nhau

Tuy nhiên, tồn tại một cách định nghĩa tổ tiên gián tiếp ở mức bất kỳ nhờ phép đệ
quy như sau:
Với mọi X và Z,
X là một tổ tiên của Z nếu
tồn tại Y sao cho
(1) X là cha mẹ của Y và
(2) Y là tổ tiên của Z
ancestor(X,

Z) :-


parent(X, Z).
ancestor(X,

Z) :-

parent(X, Y),
ancestor(Y, Z).

Trang
14


Tiểu luận mơn học Cơng nghệ tri thức
ancestor
X

.....

Y

Z

ancestor
Hình 7. Dạng đệ qui của quan hệ tổ tiên.

?- ancestor(Mary, X).
X = Jim ->;
X = Ann ->;
X = Sue ->;
X = bill

Yes
Trong Prolog, hầu hết các chương trình phức tạp đều sử dụng đệ quy, đệ quy là
một khả năng mạnh của Prolog.
Cho đến lúc này, ta đã định nghĩa nhiều quan hệ khác nhau (parent, woman, man,
grandparent, child, sister, mother, và ancestor). Ta thấy mỗi quan hệ tương ứng với một
mệnh đề, tuy nhiên, quan hệ ancestor lại có hai mệnh đề.
Người ta nói rằng những mệnh đề này liên quan đến quan hệ ancestor. Trong
trường hợp tất cả các mệnh đề đều liên quan đến một quan hệ, người ta nhận được một
thủ tục.
2.3. Cấu trúc và xử lý danh sách trong Prolog
Danh sách là một trong những cấu trúc đơn giản nhất và thuận tiện trong Prolog, nó
tạo ra mơi trường lập trình thuận tiện trong prolog. Để giải quyết bài toán bán vé tàu trên
prolog chúng ta sẽ nghiên cứu một số khái niệm cơ bản về prolog.
2.3.1.

Biểu diễn danh sách

Danh sách là kiểu dữ liệu đơn giản dễ biểu diễn. Danh sách các phần từ gồm anne,
tennis, tom, skies được biểu diễn thành danh sách như sau:
[anne,
2.3.2.

tennis,

tom,

skies]

Một số vị từ xử lý danh sách của prolog


SWI – Prolog có sẵn một số vị từ xử lý danh sách như sau:

Vị từ
append(List1,

Ý nghĩa
Ghép hai danh sách List1 và List2 thành List3
Trang
15


Tiểu luận môn học Công nghệ tri thức
List2, List3)
member(Elem,List)

Kiểm tra Elem có phải là phần tử của danh sách List hay
khơng.

nextto(X,Y,List)

Kiểm tra phần tử Y có đứng ngay sau phần tử X trong danh
sách List hay khơng.

delete(List1,
Elem, List2)

Xố trong List1 những phần tử có trong Elem và trả kết quả
về trong List2.

Select(Elem, List, Lấy phần tử Elem khỏi danh sách List để trả về những phần

Reset)
tử còn lại trong Rest, có thể dùng để chèn phần tử vào danh

sách.
nth0(Index,
Elem)

List, Kiểm tra phần tử thứ Index (tính từ 0) của danh sách List có

nth1(Index,
Elem)

List, Kiểm tra phần tử thứ Index (tính từ 1) của danh sách List có

phải là Elem hay không.
phải là Elem hay không.

last(List, Elem)

Kiểm tra phần tử đứng cuối cùng trong danh sách List có
phải là Elem hay không.

reverse(List1,
List2)

Nghịch đảo thứ tự các phần tử của danh sách List1 để trả về
kết quả trong List2

permutation(List1, Hoán vị danh sách List1 thành danh sách List2
List2)

Flatten(List1,
List2)

Chuyển danh sách List1 chứa các phần tử bất kỳ thành danh
sách phẳng List2.

sumlist(List,sum)

Tính tổng các phần tử của danh sách List chứa toàn số để trả
về kết quả trong sum

numlist(Low,
High,List)

Nếu Low và High là các số sao cho Low =danh sách List=[Low, Low + 1, …, High]
Bảng 1. Mô tả các vị từ trong xử lý danh sách của Prolog

2.3.3.

Một số thao tác cơ bản trên danh sách

Dựa vào các vị từ có sẵn chúng ta có thể viết thành các phép toán để sử dụng trong
danh sách như sau:
Trang
16


Tiểu luận môn học Công nghệ tri thức
+ Kiểm tra một phần tử có mặt trong danh sách hay khơng:

Sử dụng hàm member(X,L) để kiểm tra.
+ Ghép hai danh sách
Sử dụng hàm có sẵn append(L1, L2, L3)để ghép hai danh sách.
+ Bổ sung một phần tử vào danh sách
Sử dụng hàm insert(X, L, [X|L]) để thực hiện thao tác này.
+ Loại bỏ một phần tử ra khỏi danh sách:
Sử dụng phép vị từ có sẵn remove(X, L, L1) để xây dựng phép toán này.
+ Nghịch đảo danh sách
Sử dụng phép vị từ reverse(List1, List2) để thực hiện phép toán này.
+ Danh sách con
Dùng vị từ member để xây dựng nên hàm sublist (List1, List2) để kiểm
tra List1 có phải là con của List2 hay không.

Trang
17


Tiểu luận môn học Công nghệ tri thức

PHẦN 2. CÀI ĐẶT VÀ DEMO CHƯƠNG TRÌNH
1.

Phân tích bài tốn

Cách thực hiện bài tốn:
-

Định nghĩa khơng gian

-


Xác định các thuộc tính, tính chất và phân lớp

-

Tìm các sự kiện

-

Phát biểu thành các luật

-

Chuyển thành Logic vị từ

-

Cài đặt trên Prolog

1.1. Xác định các không gian
-

Gọi X là không gian tất cả các chữ có nghĩa - Lọc từ file từ điển tiếng Việt

-

Gọi Y là không gian tất cả các từ trong tiếng Việt - Lọc từ file từ điển tiếng Việt

-


Gọi Z là không gian tất cả các từ ghép trong tiếng Việt - Lọc từ file từ điển tiếng
Việt

-

Gọi M là không gian các từ đồng nghĩa nhau – Xây dựng mới

1.2. Xây dựng các luật
Căn cứ vào các mẹo đã được trình bày tại cuốn sách Mẹo giải nghĩa từ Hán Việt và Chữa
lỗi chính tả, Nhà xuất bản Thanh niên, 2000 của tác giả Phan Ngọc. Chúng ta xây dựng
các luật như sau:
1.2.1.

Luật 1

Nếu một chữ có nghĩa nhưng không hoạt động làm thành một từ được mà chỉ làm
thành một bộ phận của từ thơi thì đó là một chữ Hán-Việt.
-

Gọi hàm Meaning(x, X): kiểm tra x có trong tập X hay khơng để kiểm tra từ đó có
nghĩa khơng?.

-

Gọi hàm Word(x, Y): kiểm tra x có trong Y hay khơng để khẳng định x có đứng
riêng 1 từ hay không?

-

Gọi hàm Join_Words(x,x1, Z): kiểm tra x có trong Z hay khơng để khẳng định nó

có thể kết hợp với các chữ khác thành từ hay không?.

Vậy nếu kiểm tra một từ x thoả mãn điều kiện như sau:

Trang
18


Tiểu luận mơn học Cơng nghệ tri thức

¬Word(x,

Meaning(x, X)^

Y)^Join_Words(x,x1, Z).

thì x là từ Hán-Việt.
Trong đó: x1 là một chữ bất kỳ khác nào đó.
1.2.2.

Luật 2

Nếu một chữ mà ta khơng hiểu nghĩa của nó, và nó khơng làm thành từ, lại xuất
hiện trong hai từ có một sự giống nhau nào đó về nghĩa thì đó là chữ Hán-Việt.
-

Sử dụng các hàm đã định nghĩa ở luật 1.

-


Gọi hàm Thesaurus(x,y) là hàm kiểm tra 2 từ có đồng nghĩa hay khơng, bằng cách
kiểm tra nó tồn tại trong M.

-

Gọi hàm different(x, y) để kiểm tra x và y khác nhau.

Vậy nếu kiểm tra một từ x thoả mãn điều kiện như sau:

¬Meaning(x,

¬Word(x,

X)^

Y)

^different(Join_Words(x, x1, Z),Join_Words(x, x1, Z))
^Thesaurus(Join_Words(x, x1, Z),Join_Words(x, x1, Z))
thì x là từ Hán-Việt.
1.2.3.

Luật 3

Trong một từ Hán-Việt thì các yếu tố và các chữ của nó đều là từ Hán-Việt. Vậy nếu
ta tạo một từ có yếu tố Hán-Việt như ở luật 1 và luật 2 thì các chữ trong từ Hán-Việt đều
là từ Hán-Việt.
- Gọi Han_Viet12(x, K) là hàm kiểm tra x có phải là từ Hán-Việt hay không.
nếu kiểm tra một từ x thoả mãn điều kiện như sau:
Meaning(x, X)^Word(x, Y)

^Han_Viet(Join_Words(x, x1, Z), K)
thì x là từ Hán-Việt.
1.2.4.

Luật 4

Nếu ta có thể sắp vào trước hoặc sau cái chữ mà chúng ta đang xét một trong
những chữ nhất, hữu, vơ, dân, nhân, bất thì đó là chữ Hán-Việt.
-

Gọi x2 là một chữ bất kỳ trong các chứ trong các từ nhất, hữu, vô, dân, nhân, bất

nếu kiểm tra một từ x thoả mãn điều kiện như sau:
Join_words(x,x2,Z) v join_words(x2, x, Z)
thì x là từ Hán-Việt.
Trang
19


Tiểu luận môn học Công nghệ tri thức

2.

Cài đặt chương trình

Căn cứ vào phân tích luật ở trên, kết hợp với việc xử lý của ngơn ngữ lập trình Prolog ta
xử lý như sau:
2.1. Đọc file lên danh sách
Để có thể kiểm tra một từ có phải là Hán - Việt hay không ta phải load cơ sở dữ liệu từ
điển lên danh sách tương ứng như những không gian đã nêu. Thủ tục đọc File dữ liệu và

load lên danh sách như sau:
%--------------------------------------------------------% Doc noi dung mot file va ghi len danh sach !
%--------------------------------------------------------docfile(File,List) :seeing(Old),

/* save for later */

see(File),

/* open this file */

readlist(List),

/* read from File */

seen,

/* close File */

see(Old),

/*

!.

/* stop now */

previous read source */

readlist([H|T]) :read(H),
H \== end_of_file,

!,
readlist(T).
readlist([]).

2.2. Thiết lập luật 1
%--------------------------------------------------------%Thiet lap luat 1 !
%--------------------------------------------------------% Ham nay kiem tra chu X co nghia hay khong?
meaning(X, ChuCoNghia):-member(X,ChuCoNghia),!.
% Ham kiem tra X co phai la tu Tieng Viet hay khong?
word(X, TuTiengViet):-member(X,TuTiengViet),!.

Trang
20


Tiểu luận môn học Công nghệ tri thức
% Kiem tra chu X ket hop voi 1 chu co nghia khac co lam thanh 1
tu hay khong
join_words(X,[],TuTiengViet):-var(X),var(TuTiengViet).
join_words(X,[Head|Tail],TuTiengViet):member(append(X,Head),TuTiengViet),
nl,
join_words(X,Tail,TuTiengViet).
% Kiem tra X co phai tu Han - Viet hay khong theo luat 1
rule1(X):docfile('c:/prolog/ChuCoNghia.txt', ChuCoNghia'),
docfile('c:/prolog/TuTiengViet.txt', TuTiengViet),
meaning(X,ChuCoNghia),
!word(X,TuTiengViet),
join_words(X,ChuCoNghia, TuTiengViet).

2.3. Thiết lập luật 2

Sử dụng các hàm ở luật 1 và xây dựng thêm một số hàm mới để kiểm tra một từ có
phải là Hán - Việt hay không.
%---------------------------------------------------------------%Thiet lap luat 2 !
%---------------------------------------------------------------% Ham tra ve mot tu khi ket hop X voi mot phan tu trong DS
%ChuCoNghia ma thuoc vao DS TuTiengViet
join_words_tu(X,[],TuTiengViet,Tu):var(X),var(Tu),var(TuTiengViet).
join_words_tu(X,[Head|Tail],TuTiengViet,Tu):member(append(X,Head),TuTiengViet),
Tu=append(X,Head),
!,
nl,
join_words(X,Tail,TuTiengViet,Tu).

Trang
21


Tiểu luận môn học Công nghệ tri thức
% Ham different lay tung phan Tu trong DS co nghia co bang voi
%mot tu con lai trong DS do ma co nghia hay khong
different:repeat,
join_words_tu(X,ChuCoNghia,TuTiengViet,Tu),
join_words_tu(X,ChuCoNghia,TuTiengViet,Tu1),
Tu==Tu1,!.
% Kiem tra X co phai tu Han - Viet hay khong theo luat 2
rule2(X):meaning(X,ChuCoNghia),
!word(X,TuTiengViet),
different.

2.4. Thiết lập luật 3
Kiểm tra một phần tử X1 nếu là chữ Hán - Việt và có thể kết hợp với X thành một từ

thì X là chữ Hán - Việt
%----------------------------------------------------------%Thiet lap luat 3 !
%----------------------------------------------------------% Kiem tra neu X ket hop voi X1 thoa man tu han viet o luat 1 va
2 thi X la tu Han Viet
rule3(X):Rule1(X1);Rule2(X1),
join_words(X,X1,TuTiengViet).

2.5. Thiết lập luật 4
Luật 4 xét kết hợp phần tử X với một trong các từ Nhất, Hữu, Vô, Dân, Nhân, Bất
thành một từ. Đặt các từ trên lên một File, sau đó load lên một List và tiến hành thực
hiện. Chương trình như sau:
%--------------------------------------------------------%Thiet lap luat 4 !
%---------------------------------------------------------

Trang
22


Tiểu luận môn học Công nghệ tri thức
% Kiem tra X neu ket hop voi 1 trong cac tu Nhat, Huu, Vo, Dan,
Nhan. Bat thanh tu thi X la tu Han %Viet
% Luu ca tu tren tren 1 File Luat4.txt
rule4(X):docfile('c:/prolog/Luat4.txt', Luat4'),
join_words(X,Luat4,TuTiengViet);
join_words(Luat4,X,TuTiengViet).

2.6. Tổ hợp thành chương trình chính
Chương trình chính sẽ kiểm tra chữ X nếu thoả mãn một trong 4 luật ở trên thì X là từ
Hán - Việt. Chương trình như sau:
%-------------------------------------------------------------%Chuong trinh chinh kiem tra neu 1 tu dung 1 trong 4 luat thi

se la tu Han Viet !
%-------------------------------------------------------------main(X):rule1(X);
rule2(X);
rule3(X);
rule4(X);
write('Day la tu han viet'),!.

2.7. Trình đơn Menu:
Để giúp cho chương trình thêm sinh động và dễ dùng ta cài đặt thực đơn như sau:
%-------------------------------------------------------------% Menu goi chuong trinh
%-------------------------------------------------------------hanviet:write('Chuong trinh kiem tra tu Han Viet'),
nl,
write('1. Kiem tra theo luat 1'),
nl,
write('2. Kiem tra theo luat 2'),
nl,
write('3. Kiem tra theo luat 3'),

Trang
23


Tiểu luận môn học Công nghệ tri thức
nl,
write('4. Kiem tra theo luat 4'),
nl,
write('5. Kiem tra ca 4 luat'),
nl,
write('6. Thoat'),
nl,

write('________________________________________'),
nl,
write('Hay chon chuc nang thuc hien: (Tu 1-6)'),
read(N),
thuchien(N).
% Thoat chuong trinh
thuchien(6):-!.
% Kiem tra theo luat 1
thuchien(1):nl,
write('Ban da chon kiem tra theo luat 1 '),
write('Nhap vao mot tu de kiem tra:

'),

read(X),
nl,
Rule1(X),
menu.
% Kiem tra theo luat 2
thuchien(2):nl,
write('Ban da chon kiem tra theo luat 2 '),
write('Nhap vao mot tu de kiem tra:

'),

read(X),
nl,
Rule2(X),
menu.
% Kiem tra theo luat 3


Trang
24


Tiểu luận môn học Công nghệ tri thức
thuchien(3):nl,
write('Ban da chon kiem tra theo luat 3 '),
write('Nhap vao mot tu de kiem tra:

'),

read(X),
nl,
Rule3(X),
menu.
% Kiem tra theo luat 4
thuchien(4):nl,
write('Ban da chon kiem tra theo luat 4 '),
write('Nhap vao mot tu de kiem tra:

'),

read(X),
nl,
Rule4(X),
menu.
% Kiem tra theo ca chuong trinh
thuchien(5):nl,
write('Ban da chon kiem tra theo ca chuong trinh '),

write('Nhap vao mot tu de kiem tra:

'),

read(X),
nl,
main(X),
menu.

3.

Demo chương trình

Chương trình được lưu trên thư mục c:\prolog. Biên dịch chương trình và mở Prolog để
thực hiện theo các bước sau:
1. Gọi chương trình bằng lệnh:
hanviet.

Trang
25


×