Làm mịn khung làm việ c

Một phần của tài liệu ứng dụng framework và lập trình ràng buộc cho bài toán lập thời khóa biểu (Trang 60 - 65)

Khung làm việc là một công cụ diễn tả sự trừu tượng và được sử dụng trong các

định nghĩa mô hình cơ bản. Chúng chỉđược sử dụng khi vấn đề cần giải quyết phải có các tham số phù hợp với nó hoặc mức độ to lớn của vấn đề phải tương ứng với nó.

Một vấn đề đặt ra là, làm sao có thể áp dụng khung làm việc để giải quyết các vấn đề cụ thể, quy mô nhỏ, và đôi khi các tham số của bài toán không tương ứng với khung làm việc. Một giải pháp được đưa ra đó chính là sự làm mịn. Không có một quy tắc nào trong việc định nghĩa khung làm việc tại một mức chi tiết cố định nào, bản thân các khung làm việc phụ thuộc vào sự làm mịn, sự trừu tượng và sự hợp thành, tức là khung làm việc được xây dựng có mức độ chi tiết, hay mức độ trừu tượng phụ thuộc vào từng bài toán, từng cách xây dựng, quan điểm của người xây dựng, mục đích của khung làm việc…, và cuối cùng là các thành phần hợp thành nên chính khung làm việc

đó. Hơn thế nữa, một vài sự làm mịn này cũng được định nghĩa như là các khung làm việc.

3.2.2.1. Một ví dụ về làm mịn

Khung làm việc trong hình 17 sau minh họa mối quan hệ giữa một nhà kinh doanh (Trader), tạo ra các hóa đơn ( Order) gửi các nhà phân phối ( Distributor).

Hình 17. Khung làm việc cho việc thương mại: duy trì kho hàng

Khung làm việc cũng chỉ ra rằng nhà kinh doanh luôn có một hoá đơn khi kho hàng ở mức thấp hơn mức quy định. Chính vì vậy mà kho hàng có thể luôn luôn tránh

được việc thiếu hàng. Đây chính là một khung làm việc mức cao, nói lên nhiệm vụ

tổng thể của hệ thống mà không đi vào các chi tiết quá cụ thể như cách thức các hóa

đơn tạo ra như thế nào- đó chính là các công việc mà các nhà thiết kế phải làm. Để làm

điều này, có thểđịnh nghĩa những chi tiết trong chính mô hình đó hoặc xây dựng một khung làm việc khác chứa các thông tin này.

Chúng ta hãy xem xét khung làm việc trong hình 18, một khung làm việc làm mịn của khung làm việc trong hình 17, khi sản phẩm của bất kỳ kho hàng nào ở mức thấp, nhà kinh doanh tạo ra một đơn hàng gửi người phân phối bằng cách sử dụng hành động make_order. Khi Order được tạo ra, người phân phối có thể giao hàng và người kinh doanh có thể trả tiền. Trong ví dụ trước (hình 17), chúng ta chỉ sử dụng “kết quả”, tức là chỉ biết kết quả của hành động mà không nói đến nguyên nhân của các hành động đó, thì ở đây ta chia ra nguyên nhân và kết quả. Đầu tiên ta tạo ra kết

depletion (p:Product)

stock( product): int lowLimit( product):int

<Trader>

<Distributor >

stock( product): int lowLimit( product):int <Sản phẩmt> Ngày <Order> Từ đang nợ * Các hoá đơn Tới * Cho * 0,1 Đã phân phối *

Yêu cầu cung cấp hàng cho kinh doanh

inv Trader:: ( p:Product::

quả có tên depletion(p) (sự làm rỗng: ở đây có nghĩa là làm giảm sản phẩm p trong kho hàng) là một tên đặt sẵn trong khung làm việc cho bất cứ hành động nào là nguyên nhân cho việc làm giảm p. Thứ hai, chúng ta tạo ra một điều kiện sau cho depletion;

đó chính là yêu cầu thực hiện hành động make_order. Việc phân chia nguyên nhân kết quả như vậy rất có ích khi chúng ta có các mối quan hệ nhiều nhiều và ta muốn làm rõ các nguyên nhân dẫn đến mỗi kết quả.

Hình 18. Sự cộng tác Trade Supply

depletion (p:Product) stock( product): int lowLimit( product): int

<Trader>

<Distributor >

stock( product): int lowLimit( product): int <Product> Date <Order > Tạo hóa đơn Phân phối Trả Từ Chưa trả * Các hoá đơn Tới * Cung cấp hàng cho kinh doanh

Cho *

0,1 Đã phân phối *

action dist:Distributor –> trd:Trader :: deliver(o:Order) -- Khi một nhà cung cấp gửi hàng tới nhà kinh doanh

pre o.to = trd & o.from = dist post o.delivered <> null

& (trd.stock(o.for) += o.quantity)

action rtlr:Trader –> dist:Distributor :: make_order (prod:Product, q:int)

-- Khi một nhà kinh doanh gửi thanh toán tới nhà cung cấp post

let n:Order.new [quantity=q, to=rtlr, from=dist, for=prod,paid = 0,

delivered=null, cost=dist.price(prod, q, rtlr)], rtlr.orders += n & dist.outstanding += n

inv effect

post t:Trader, p:Product::

t.stock(p) < t.stock@pre(p) ==> t.depletion (p))

effect Trader:: depletion (p:Product)

post stock(p) < lowLimit(p) ==>

exists dist:Distributor, n: integer, n> 0 & [[ this –> d.make_order (p, n) ]]

<depletion (p:Product)>

2.2.2.2. Làm tài liệu sự làm mịn

Khi chúng ta muốn thông báo cho người sử dụng khung làm việc Cung cấp hàng cho kinh doanh biết rằng việc sử dụng cùng các điểm đặt chỗ trước để thay thế

trong cả hai khung làm việc điều đạt được tập các mục đích được đặt ra trong khung yêu cầu cung cấp hàng cho kinh doanh. Tức là nếu hai khung làm việc được kết hợp lại với nhau, việc làm tài liệu sẽ không bị trùng lặp, ta không phải nói tất cả các thứ có trong Cung cấp hàng cho kinh doanh mà nó đã được ngầm định trong yêu cầu cung cấp hàng cho kinh doanh. Như vậy khi làm mịn khung làm việc thì các những yếu tố

cơ bản của khung làm việc sẽ không phải làm lại mà nó được ngầm định sử dụng lại. Chúng ta có thể viết điều này như trong hình 19 :

Hình 19. Làm tài liệu sự làm mịn khung làm việc

Yêu cầu cung cấp hàng cho

Cung cấp hàng cho kinh

Bất kỳ hành động nào đều phải gọi

make_order nếu kho hàng của thương nhân bị thiếu hàng. Đối số liên quan:

• Trader :: stock(p) < stock@ pre(p) => [[depletion(p)]]

• depletion(p) post stock(p) <lowLimit(p) => [[makeOrder(p)]]

Chương 4.

Xây dng h thng cho bài toán lp Thi khóa biu

Một phần của tài liệu ứng dụng framework và lập trình ràng buộc cho bài toán lập thời khóa biểu (Trang 60 - 65)