ASP & Clingo

Thực hành ASP cộng sĩ số của lớp ghép

Dùng biểu thức tổng có mã nhóm để tránh tính thiếu hai nhóm bằng sĩ số.

Thực hànhThực hành4 phút đọcClingo

Thích và đánh giá Bình luận và hỏi đáp
Phòng 40 đủ chỗ. Định danh nhóm quyết định ý nghĩa của tổng.
Phòng 40 đủ chỗ. Định danh nhóm quyết định ý nghĩa của tổng. Mở hình lớn ↗

1. Đề bài

Một lớp ghép có nhóm N1 gồm 18 sinh viên và N2 cũng gồm 18. Có hai phòng với 30 và 40 chỗ. Viết mô hình chọn phòng đủ chỗ. Thử cố tình tính tổng chỉ với giá trị sĩ số rồi giải thích vì sao có thể nhận phòng sai.

2. Hướng dẫn viết

Trong #sum, để mã nhóm đứng sau trọng số. Nhờ đó hai nhóm có 18 người trở thành hai phần tử khác nhau. Tiếp theo, cấm chọn phòng có sức chứa nhỏ hơn tổng. Trường hợp số người bằng sức chứa được chấp nhận.

3. Đối chiếu lời giải

Chương trình in si_so(36) và chon(p40). Nếu chỉ dùng trọng số làm bộ định danh, hai giá trị 18 trùng nhau và tổng bị tính thành 18. Dùng #show để thấy cả phòng và số đếm trung gian.

Nếu chưa có Clingo, cài bằng python -m pip install clingo.

Chạy ví dụ bằng python -m clingo hoc_asp_dem_suc_chua.lp -n 0.

Môi trường thực hành. Clingo 5.8 trở lên. Có thể cài bằng python -m pip install clingo và gọi python -m clingo thay cho lệnh clingo.

Clingo · hoc_asp_dem_suc_chua.lpTải mã nguồn
nhom(n1,18). nhom(n2,18).
phong(p30,30). phong(p40,40).
si_so(T) :- T = #sum { N,M : nhom(M,N) }.
1 { chon(P) : phong(P,_) } 1.
:- chon(P), phong(P,C), si_so(T), T>C.
#show si_so/1.
#show chon/1.

4. Bài tập mở rộng

Thêm phòng 36 chỗ rồi chạy với -n 0. Xác định hai phòng hợp lệ. Sau đó thay N2 bằng 23 sinh viên và giải thích vì sao không còn nghiệm nếu không thêm phòng lớn hơn.

Đọc thêm Tài liệu ngôn ngữ ASP của Potassco.