Kiến trỳc gúi DLV: lớp DlvHandler

Một phần của tài liệu Nghiên cứu các phương pháp biểu diễn tri thức trong lập trình Logic (Trang 74)

Trong phần này, ta sẽ phỏc thảo kiến trỳc toàn diện của gúi DLV và lớp

Ở phần trước, ta đó biết đến cỏch viết và thực hiện một chương trỡnh trong DLV. Ta cú thể chạy nú từ một dũng lệnh mụ tả cỏc thụng số cần thiết và chương trỡnh đầu vàọ Cỏc tập trả lời DLV sẽ được đưa ra dưới dạng văn bản.

Gúi DLV thực hiện DLV trong một cỏch xử lý mở rộng tự nhiờn, thực hiện như một dũng lệnh gọi cơ bản. Mỗi ứng dụng Java cú một lớp đơn

javạlang.Runtime cho phộp ứng dụng tự thực hiện giao diện của nú với mụi trường mà ứng dụng đang chạy trong đú.

Phương thức Runtimẹexec() tạo ra một tiến trỡnh tự nhiờn và đưa ra một lớp con của javạlang.Process cú thể được sử dụng để điều khiển một tiến trỡnh và thu nhận thụng tin về nú. Lớp javạlang.Process cung cấp cỏc phương thức để thực hiện đầu vào và đầu ra như một tiến trỡnh, chờ cho tiến trỡnh này thực hiện xong, kiểm tra trạng thỏi kết thỳc và phỏ hủy tiến trỡnh nàỵ Lớp DlvHandler quản lý một đối tượng DLV là một tiến trỡnh tự nhiờn, bằng cỏch sử dụng phương thức Runtimẹexec() và lớp javạlang.Process. Tất cả cỏc điều khiển I/O DLV chuẩn sẽ được định hướng đến đối tượng

DlvHandler (bờn trong mỏy ảo Java). Với cỏch này, lớp DlvHandler cú thể đưa dữ liệu vào cho DLV và lấy kết quả từ DLV.

Chỳ ý rằng cỏc thụng số cần thiết cho DLV và cỏc file văn bản chứa chương trỡnh vào được xỏc định là cỏc thụng số dũng lệnh là một mảng xõụ Dữ liệu được lưu trong bộ nhớ (bằng cỏch sử dụng đối tượng Predicate) hoặc trong cỏc cơ sở dữ liệu được định hướng đến DLV.

Đối tượng DlvHandler sẽ tập trung cỏc kết quả DLV và phõn tớch chỳng, xõy dựng một tập cỏc đối tượng Model.

Hỡnh 3-2 Quỏ trỡnh xử lý DLV

Tất cả cỏc lớp của gúi DLV trong Java được đặt trong một gúi cú tờn là DLV.

Để nhỳng cỏc chương trỡnh logic phõn biệt vào bờn trong cỏc cõu lệnh Java, ta phải gọi đến gúi DLV và thực hiện cỏc bước sau:

1. Thiết lập cỏc thụng số cần thiết và dữ liệu vào 2. Chạy DLV

3. Quản lý kết quả DLV

Ta thiết lập dữ liệu vào bằng cỏch sử dụng đối tượng Program. Ta sử dụng một đối tượng DlvHandler để thiết lập cỏc thụng số cần thiết, chạy cỏc đối tượng tiến trỡnh DLV và quản lý kết quả DLV. Lớp DlvHandler cung cấp cỏc

điều khiển đầy đủ trờn mụi trường DLV. Đối tượng DlvHandler gọi DLV,

đưa dữ liệu vào và nhận kết quả rạ Ngay khi DLV đưa ra một kết quả, đối tượng DlvHandler phõn tớch nú và tạo ra một đối tượng Model. Đối tượng

DlvHandler lưu trữ mỗi đối tượng Model trong một tập. Ta cú thể quả lý tập cỏc đối tượng Model bằng cỏc phương thức thớch hợp. Lớp DlvHandler thực hiện một giao diện tương ứng với giao diện javạutil.Enumeration để truy nhập đến cỏc đối tượng Model.

Hơn thế nữa, mỗi đối tượng DlvHandler cú một đối tượng

phõn tớch kết quả ra DLV. Đặc biệt là OutputDescriptor mụ tả cỏch xõy dựng cỏc đối tượng Predicate được thờm vào với cỏc đối tượng Model. Gúi DLV

cung cấp ba kiểu của đối tượng Predicate (xem trong hỡnh 3.1): - lớp Predicate

- lớp FilePredicate

- lớp JDBCPredicate

Lớp đầu tiờn lưu trữ dữ liệu trong bộ nhớ chớnh; lớp thứ hai lưu trữ dữ liệu trong một file văn bản (theo định dạng datalog); lớp cuối cựng lưu trữ dữ liệu trong một bảng cơ sở dữ liệu quan hệ. Bằng cỏch sử dụng lớp

OutputDescriptor, ta sẽđịnh rừ lớp vị từđược sử dụng cho mỗi vị từ nền. Với cỏch này, ta cú thể chọ một thiết bị lưu trữ (bộ nhớ chớnh, đĩa cứng, v.v...) cho mỗi vị từ nền.

Nhưđó núi ở trờn, DLV cú thể sử dụng rất nhiều thời gian để tớnh toỏn cỏc tập trả lời bởi vỡ cỏc chương trỡnh logic phõn biệt cú thể là những bài toỏn rất khú. Nhưng khi một mụ hỡnh mới được tớnh xong, DLV sẽđưa ra ngay lập tức. Để cú thể nắm giữđược đặc tớnh này, ta cú ba trạng thỏi cho chương trỡnh Java làm việc: đồng bộ (synchronous), đồng bộ mụ hỡnh (model synchronous) và khụng đồng bộ (asynchronous).

Nếu ta chạy DLV trong chếđộđồng bộ, luồng Java đang gọi DLV sẽ bị

khúa cho đến khi DLV kết thỳc việc tớnh toỏn. Luồng Java đang gọi DLV chỉ được truy nhập vào kết quả DLV khi việc thực hiện DLV kết thỳc. Nếu ta chạy DLV trong chế độ đồng bộ mụ hỡnh hoặc trong chế độ khụng đồng bộ, luồng Java gọi DLV cú thể truy nhập đến cỏc mụ hỡnh vừa được tớnh xong.

Gúi DLV cung cấp một phương thức kiểm tra liệu đó cú một mụ hỡnh mới hay chưạ Nếu ta chạy DLV trong chếđộđồng bộ mụ hỡnh, phương thức này sẽ khúa luồng Java gọi DLV cho đến khi cú một mụ hỡnh mới hoặc DLV

kết thỳc. Nếu ta chạy DLV trong chế độ khụng đồng bộ, phương thức này sẽ

Chương 4 CÁC BÀI TOÁN MINH HA

Một phương phỏp nổi tiếng cho cỏch giải cỏc bài toỏn logic là phương phỏp sinh lời giải và kiểm tra, trong đú cỏc lời giải cú thể của bài toỏn được tạo ra và những lời giải khụng tương ứng sẽ bị loại bỏ khi kiểm trạ Cũng tương tự

như cỏch thụng thường khi chỉ ra một bài toỏn thuộc lớp NP, sau khi lựa chọn ngẫu nhiờn, việc kiểm tra sẽ được thực hiện trong thời gian đa trị. Phần sinh lời giải trong cỏch biểu diễn của bài toỏn cú được nhờ việc liệt kờ cỏc khả

năng cú thể và phần kiểm tra cú được nhờđưa ra cỏc ràng buộc để loại bỏ cỏc khả năng vi phạm điều kiện của bài toỏn. Do đú tập trả lời của chương trỡnh kết quả sẽ phự hợp với bài toỏn đưa rạ Ta cũn gọi cỏch thực hiện theo phương phỏp sinh lời giải và kiểm tra là liệt kờ và loại bỏ.

Việc giải quyết cỏc bài toỏn theo cỏch biểu diễn này phụ thuộc vào cỏch liệt kờ cỏc khả năng cú thể, tức là những biến nào được sử dụng và cỏc giỏ trị mà biến nhận được. Thụng thường cỏc tri thức ẩn và hiện về miền này

được sử dụng để làm giảm kớch thước của khụng gian cỏc khả năng cú thể

(hoặc khụng gian trạng thỏi). Và cú thể thờm một số điều kiện kiểm tra bờn trong phần sinh lời giảị Một vớ dụ cho cỏch này là bài toỏn N quõn hậụ Trong cỏch biểu diễn cỏc ràng buộc, cần phải lựa chọn cẩn thận với cỏch biểu diễn dưới dạng là thực tế hay là luật. Vớ dụ, xem xột chương trỡnh Π:

. . . . p a q b a not b b not a ← ← ← ←

Giả thiết ràng buộc của chương trỡnh: “p phải nhận giỏ trị đỳng”. Do đú ta cú thể loại bỏ cỏc khả năng đểp là khụng đỳng. Nếu ta biểu diễn ràng buộc này dưới dạng thực tế trong chương trỡnh Π: p←. thỡ kết quả chương trỡnh cú hai tập trả lời {a, p} và {b, q, p} là tập khụng mong muốn. Cỏi ta cần là loại bỏb,

q ra khỏi khụng gian trạng thỏi và tập trả lời là {a, p}. Vậy cỏch đỳng đắn để

biểu diễn ràng buộc này trong chương trỡnh Πlà: ←notp.

Ta sẽ xột 2 bài toỏn N quõn hậu và Cõy bao trựm nhỏ nhất để minh họa cho cỏch suy diễn và tỡm kiếm lời giải cho bài toỏn logic.

Hai bài toỏn N quõn hậu và Cõy khung nhỏ nhất sẽ minh họa cỏch biểu diễn tri thức trong lập trỡnh logic bằng DLV. Với mỗi bài toỏn, cú nhiều cỏch

để biểu diễn tri thức, phần này sẽ phõn tớch tiết từng cỏch biểu diễn và cài đặt cụ thể một cỏch biểu diễn trong mụi trường lập trỡnh DLV.

4.1Bài toỏn N quõn hậu 4.1.1 Phõn tớch bài toỏn

Với một bảng kớch thướcn nì , ta cần phải đặt n quõn hậu sao cho khụng quõn hậu nào cú thể ăn lẫn nhaụ Cú nghĩa là chỉ cú chớnh xỏc một quõn hậu trờn một hàng và một cột, khụng cú hai quõn hậu nào ở cựng trờn một đường chộọ

Theo cỏch tiếp cận liệt kờ và loại bỏ, đầu tiờn ta cần phải liệt kờ cỏc cỏch đặt n quõn hậu trờn bảng n nì và sau đú loại bỏ cỏc trường hợp cỏc quõn hậu cú thể ăn lẫn nhaụ Dưới đõy sẽ xem xột một số cỏch biểu diễn phương phỏp tiếp cận nàỵ Sự khỏc nhau giữa cỏc cỏch này nằm trong cả phần liệt kờ và phần loại bỏ. Trong một số phần liệt kờ, bản thõn nú chứa cỏch liệt kờ kộm hơn và kốm theo loại bỏ, trong khi đú, trong phần loại bỏ, điều kiện của nú lại chứa cả liệt kờ.

(1) Đặt từng quõn hậu vào trong cỏc ụ vuụng cú thể: Ta sẽ đặt tờn cho cỏc quõn hậu từ 1 đến n và sử dụng vị từat(I, X, Y) để biểu diễn quõn hậu I

vị trớ (X, Y). Phần liệt kờ bao gồm phộp liệt kờ kộm hơn trong khụng gian cú thểđược định nghĩa là với mỗi một ụ sẽ là cú quõn hậu hoặc khụng và chứa phộp loại bỏ sao cho mỗi quõn hậu ở một ụ và khụng cú hai quõn hậu ở cựng một vị trớ. Cỏch biểu diễn bài toỏn được viết như sau:

(a)Khai bỏo: Ta cú miền ứng dụng như sau:

( ) ( ) ( ) ( ) ( ) ( ) 1 . ... . 1 . ... . 1 . ... . queen queen n row row n col col n ← ← ← ← ← ←

(b)Liệt kờ: Cỏc luật liệt kờ tạo ra cỏc khụng gian cú thể sao cho n

quõn hậu khỏc nhau được đặt trong bảng n nì ở những vị trớ khỏc nhaụ Cỏc luật đú như sau: ị Với mỗi vị trớ (X, Y) và mỗi quõn hậu I, I cú thểđặt ở vị trớ (X, Y) hoặc khụng. ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) , , , , , _ , , . _ , , , , , , , .

at I X Y queen I row X col Y not not at I X Y

not at I X Y queen I row X col Y not at I X Y

← ←

iị Với mỗi quõn hậu I, nú được đặt ở nhiều nhất 1 vị trớ.

( ) ( ) ( ) ( ) ( ) ( ) ( )

( ) ( ) ( ) ( ) ( ) ( ) ( )

, , , , , , , , , , , . , , , , , , , , , , , .

queen I row X col Y row U col Z at I X Y at I U Z Y Z

queen I row X col Y row Z col V at I X Y at I Z V X Z

← ≠

← ≠

iiị Với mỗi quõn hậu I, nú được đặt ở ớt nhất 1 vị trớ.

( ) ( ) ( ) ( ) ( )

( ) ( )

, , , , , .

, .

placed I queen I row X col Y at I X Y

queen I not placed I

← ←

iv. Khụng cú hai quõn hậu nào đặt ở cựng một vị trớ.

( ), ( ), ( ), ( ) (, , , ) (, , , ), .

queen I row X col Y queen J at I X Y at J X Y I J

← ≠

(c)Loại trừ

iị Khụng cú hai quõn hậu khỏc nhau trờn cựng một cột

iiị Khụng cú hai quõn hậu khỏc nhau trờn cựng một đường chộo

Chỳ ý rằng (1)(b)(iv) là một dạng con của cả hai luật (1)(c)(i) và (1)(c)(ii). Núi cỏch khỏc, khi đó cú (1)(c)(i) và (1)(c)(ii), ta khụng cần

đến luật (1)(b)(iv) nữạ Luật này được nhắc đến ởđõy khi ta muốn liệt kờ cỏc trường hợp cú thể.

(2) Đặt từng quõn hậu vào cỏc vị trớ nhất định: Ta biểu diễn một cỏch trỡnh bày trong khi liệt kờ cỏc trạng thỏi cú thể, vấn đề quan tõm ở đõy, cỏc quõn hậu cần được đặt trong những vị trớ nhất định.

(a)Khai bỏo: giống như (1)(a) (b)Liệt kờ:

ị Kết nối cỏc hiệu quả của (1)(b)(i) – (iii) bằng cỏc luật sau, trong đú đảm bảo rằng mỗi quõn hậu được đặt ở một vị trớ duy nhất. Hai luật đầu tiờn định nghĩa other at I X Y_ ( , , )

cú nghĩa quõn hậu I được đặt ở vị trớ khỏc với (X Y, ). Luật thứ ba đảm bảo điều kiện rằng nếu quõn hậu I khụng được đặt ở vị trớ khỏc với (X Y, ) thỡ nú phải được đặt ở (X Y, ). ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) _ , , , , , , , , , , . _ , , , , , , , , , , . , , , , , _ , , .

other at I X Y queen I row X col Y row U col Z at I U Z Y Z other at I X Y queen I row X col Y row Z col V at I Z V X Z at I X Y queen I row X col Y not other at I X Y

← ≠

← ≠

iị Luật sau giống như (1)(b)(iv), nú đảm bảo hai quõn hậu

được đặt ở những vị trớ khỏc nhaụ

( ), ( ), ( ), ( ) (, , , ) (, , , ), .

queen I row X col Y queen J at I X Y at J X Y I J

← ≠

(3) Đặt từng quõn hậu vào cỏc vị trớ nhất định sao cho chỳng khụng thể ăn lẫn nhau theo hàng dọc hoặc hàng ngang. Với cỏch trỡnh bày này, ta đặt hai ràng buộc liệt kờ vào phần liệt kờ. Do đú, mỗi khi liệt kờ trạng thỏi cú thể, ta đảm bảo rằng khụng cú hai quõn hậu nào ở cựng một hàng hoặc một cột.

(a)Khai bỏo: giống (1)(a) (b)Liệt kờ:

ị Giống như (2)(b)(i):

iị Hai ràng buộc đầu trong (2)(c) giống như (1)(c)(i) và (1)(c)(ii) được thay thế như sau và ta sẽ khụng sử dụng (2)(b)(ii) nữa, vỡ nú đó được kết hợp trong cỏc luật sau:

( ) ( ) ( ) ( ) ( ) ( ) ( )

( ) ( ) ( ) ( ) ( ) ( ) ( )

_ , , , , , , , , , , .

_ , , , , , , , , , , .

other at I X Y queen I row X col Y col V queen J at J X V I J other at I X Y queen I row X col Y row U queen J at J U Y I J

← ≠ ← ≠ (c)Loại bỏ: ta cần một luật loại bỏ giống như luật (1)(c)(iii) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) , , , , , , , , , , , , , .

row X col Y row U col V queen I queen J at I X Y at J U V I J abs X U abs Y V

≠ − = −

(4) Đặt cỏc quõn hậu với cỏc trạng thỏi cú thể trờn bàn cờ: với ba cỏch trỡnh bày trờn, ta gỏn tờn cho cỏc quõn hậu và lần lượt đặt chỳng vào cỏc vị trớ. Ta cú thể nhận được hiệu quả tớnh toỏn và cỏch lập trỡnh ngắn gọn hơn bằng cỏch bỏ qua việc gỏn tờn cho cỏc quõn hậụ Dưới đõy, ta cú thể xỏc

định cỏch biểu diễn (1) bằng cỏch khụng phõn biệt cỏc quõn hậụ Ta sẽ

sử dụng vị từ in X Y( , ) cú ý nghĩa là một quõn hậu được đặt ở vị trớ

(X Y, ).

(a)Khai bỏo:

( ) ( ) ( ) ( ) 1 . ... . 1 . ... . row row n col col n ← ← ← ←

(b)Liệt kờ: bao gồm hai phần. Vỡ ta khụng cần phõn biệt cỏc quõn hậu, nờn sẽ khụng cần sử dụng đến (1)(b)(ii) – (iv). ị Xỏc định mỗi ụ cú quõn hậu hay khụng cú. ( ) ( ) ( ) ( ) ( ) ( ) ( ) ( ) _ , , , , . , , , _ , .

not in X Y row X col Y not in X Y

in X Y row X col Y not not in X Y

← ←

iị Để chắc chắn đó đặt tất cản quõn hậu, thay vỡ phải đếm, ta sử dụng tri thức cỏc quõn hậu khụng ăn lẫn nhau, chỳng phải ở khỏc hàng nhau, và khi đú, mỗi quõn hậu ở một hàng, biểu diễn bằng luật sau:

( ) ( ) ( ) ( )

( ) ( )

_ , , , .

, _ .

has queen X row X col Y in X Y

row X not has queen X

← ←

(c)Loại bỏ: sử dụng phiờn bản (1)(c).

ị Hai quõn hậu khụng thểở trờn cựng một cột.

( ), ( ), ( ), , ( , ) (, , ).

row X col Y row XX X XX in X Y in XX Y

← ≠

iị Hai quõn hậu khụng thểở trờn cựng một hàng.

( ), ( ), ( ), , ( , ) (, , ).

row X col Y col YY Y YY in X Y in X YY

← ≠

iiị Hai quõn hậu khụng thểở trờn cựng một đường chộọ

( ) ( ) ( ) ( )

( ) ( ) ( ) ( )

, , , , , ,

, , , , .

row X col Y row XX col YY X XX Y YY

in X Y in XX YY abs X XX abs Y YY

← ≠ ≠

− = −

4.1.2 Cài đặt

Bài toỏn N quõn hậu được biểu diễn bằng chương trỡnh logic tổng quỏt trong mụi trường lập trỡnh DLV. Chương trỡnh được lưu trong file cú tờn

NQueens4.dl và được cài đặt theo thuật toỏn (4) trỡnh bày trong phần 4.1.1 ở

trờn.

Chương trỡnh biểu diễn bài toỏn như sau:

col(X) :- #int(X), X > 0.

out(X, Y) :- row(X), col(Y), not in(X, Y). in(X, Y) :- row(X), col(Y), not out(X, Y). has_queen(X) :- row(X), col(Y), in(X, Y). :- row(X), not has_queen(X).

:- Y <> YY, in(X, Y), in(X, YY). :- X <> XX, in(X, Y), in(XX, Y).

:- in(X1, Y1), in(X2, Y2), X2=X1+N, Y2 = Y1 + N, N > 0. :- in(X1, Y1), in(X2, Y2), X2=X1+N, Y1 = Y2 + N, N > 0.

Trong đú, #int(X) là cỏc hàm của ngụn ngữ lập trỡnh Datalog phõn biệt, cho biết X nhận giỏ trị trong khoảng từ 0 đến N, với Nđược nhận từ dũng lệnh. Dũng lệnh để chạy chương trỡnh trong DLV như sau:

$ DLV -silent –N=4 NQueens4.dl

Một phần của tài liệu Nghiên cứu các phương pháp biểu diễn tri thức trong lập trình Logic (Trang 74)

Tải bản đầy đủ (PDF)

(114 trang)