Viết một bộ giải dòng chảy ASP / Prolog / SAT


9

Flow Free là một game android gây nghiện, trong đó bạn phải kết nối các cặp yếu tố lại với nhau thông qua những con rắn không chồng chéo và lấp đầy toàn bộ lưới. Để biết mô tả, xem tại đây:

https://play.google.com/store/apps/details?id=com.bigduckgames.flow&hl=vi

Tôi có một giải pháp ASP (lập trình tập trả lời) chỉ có một vài quy tắc và tôi không nghĩ có thể diễn đạt cùng một giải pháp gần như chính xác như một ví dụ SAT, nhưng tôi rất muốn được chứng minh là sai.

Bất kỳ ngôn ngữ nào cũng tốt, nhưng tôi nghi ngờ nó có thể được thực hiện chính xác mà không cần chạy một số loại bộ giải, đó là lý do tại sao tôi gắn nhãn là ASP / Prolog / SAT

Người chiến thắng là nhân vật ít nhất.

Bạn có thể giả sử vấn đề được xác định bằng cách sử dụng các vị từ:

v(V). % A vertex

a(V,W). % V and W are adjacent

c(C). % A color

s(V,C). % V is an endpoint of color C

Hơn nữa, đầu vào thỏa mãn

a(W,V) :- a(V,W) % Adjacencies are bidirectional

2{s(V,C) : v(V)}2 :- c(C). % Every color has exactly two endpoints

Vị ngữ giải pháp sẽ có dạng

e(V,W,C).

Nói rằng có một cạnh giữa V và W của màu C.

Các cạnh phải là hai chiều (cùng màu). Mỗi đỉnh phải có các cạnh đến và từ nó có chính xác một màu. Điểm cuối có chính xác một cạnh, tất cả các đỉnh khác có chính xác hai cạnh. Không có vòng lặp, mỗi con rắn phải được truy nguyên trở lại hai điểm cuối.

Đây là một đầu vào mẫu để kiểm tra nó trên (5x5 Cấp 2 trong Gói thông thường):

v(v11; v12; v13; v14; v15).
v(v21; v22; v23; v24; v25).
v(v31; v32; v33; v34; v35).
v(v41; v42; v43; v44; v45).
v(v51; v52; v53; v54; v55).

a(v11, v12).
a(v12, v13).
a(v13, v14).
a(v14, v15).
a(v12, v11).
a(v13, v12).
a(v14, v13).
a(v15, v14).
a(v11, v21).
a(v12, v22).
a(v13, v23).
a(v14, v24).
a(v15, v25).

a(v21, v22).
a(v22, v23).
a(v23, v24).
a(v24, v25).
a(v22, v21).
a(v23, v22).
a(v24, v23).
a(v25, v24).
a(v21, v31).
a(v22, v32).
a(v23, v33).
a(v24, v34).
a(v25, v35).
a(v21, v11).
a(v22, v12).
a(v23, v13).
a(v24, v14).
a(v25, v15).

a(v31, v32).
a(v32, v33).
a(v33, v34).
a(v34, v35).
a(v32, v31).
a(v33, v32).
a(v34, v33).
a(v35, v34).
a(v31, v41).
a(v32, v42).
a(v33, v43).
a(v34, v44).
a(v35, v45).
a(v31, v21).
a(v32, v22).
a(v33, v23).
a(v34, v24).
a(v35, v25).

a(v41, v42).
a(v42, v43).
a(v43, v44).
a(v44, v45).
a(v42, v41).
a(v43, v42).
a(v44, v43).
a(v45, v44).
a(v41, v51).
a(v42, v52).
a(v43, v53).
a(v44, v54).
a(v45, v55).
a(v41, v31).
a(v42, v32).
a(v43, v33).
a(v44, v34).
a(v45, v35).

a(v51, v52).
a(v52, v53).
a(v53, v54).
a(v54, v55).
a(v52, v51).
a(v53, v52).
a(v54, v53).
a(v55, v54).
a(v51, v41).
a(v52, v42).
a(v53, v43).
a(v54, v44).
a(v55, v45).

s(v11, yellow).
s(v45, yellow).
s(v41, blue).
s(v55, blue).
s(v51, red).
s(v43, red).
s(v42, green).
s(v33, green).

c(red; green; blue; yellow).

Và để kiểm tra đầu ra

shouldbe(v33,v32,green).
shouldbe(v42,v32,green).
shouldbe(v43,v53,red).
shouldbe(v51,v52,red).
shouldbe(v55,v54,blue).
shouldbe(v41,v31,blue).
shouldbe(v45,v35,yellow).
shouldbe(v11,v12,yellow).
shouldbe(v12,v11,yellow).
shouldbe(v35,v45,yellow).
shouldbe(v31,v41,blue).
shouldbe(v54,v55,blue).
shouldbe(v52,v51,red).
shouldbe(v53,v43,red).
shouldbe(v32,v42,green).
shouldbe(v32,v33,green).
shouldbe(v53,v52,red).
shouldbe(v52,v53,red).
shouldbe(v54,v44,blue).
shouldbe(v31,v21,blue).
shouldbe(v35,v25,yellow).
shouldbe(v12,v13,yellow).
shouldbe(v13,v12,yellow).
shouldbe(v25,v35,yellow).
shouldbe(v21,v31,blue).
shouldbe(v44,v54,blue).
shouldbe(v44,v34,blue).
shouldbe(v21,v22,blue).
shouldbe(v25,v15,yellow).
shouldbe(v13,v14,yellow).
shouldbe(v14,v13,yellow).
shouldbe(v15,v25,yellow).
shouldbe(v22,v21,blue).
shouldbe(v34,v44,blue).
shouldbe(v34,v24,blue).
shouldbe(v22,v23,blue).
shouldbe(v15,v14,yellow).
shouldbe(v14,v15,yellow).
shouldbe(v23,v22,blue).
shouldbe(v24,v34,blue).
shouldbe(v24,v23,blue).
shouldbe(v23,v24,blue).

:-not e(V,W,C),shouldbe(V,W,C).
:-e(V,W,C),not shouldbe(V,W,C).

Ngoài ra, mức 21 5x5 phải là câu đố đầu tiên có nhiều hơn 1 giải pháp (cụ thể, có 9 giải pháp chứ không phải 40) Để thiết lập cấp 21, hãy đặt một vài dòng cuối cùng của đầu vào thành

s(v55, yellow).
s(v44, yellow).
s(v15, blue).
s(v45, blue).
s(v51, red).
s(v53, red).
s(v22, green).
s(v14, green).
s(v23, orange).
s(v43, orange).

c(red; green; blue; yellow; orange).

Câu trả lời:


4

ASP (clingo), 180 byte

{e(V,W,C):a(V,W),c(C)}.r(V):-s(V,_).r(V):-r(W),e(W,V,_).o(V):-r(V),{e(V,W,_):v(W);s(V,_)}=2.:-e(V,_,C),e(V,_,D),C!=D.:-e(V,W,C),not e(W,V,C).:-v(V),not o(V).:-s(V,C),e(V,_,D),C!=D.

Tôi chưa quen với ASP, vì vậy tôi rất hào hứng khi tìm thấy nhiệm vụ này, ngay cả khi nó hơi cũ. Thật tuyệt khi thấy có những nơi dành cho các biến thể và một cơ hội để chơi gôn dẫn đến giới hạn hiểu biết của tôi (tôi hy vọng nó vẫn đúng, có vẻ như vậy).

Đây là một phiên bản nhận xét:

% Select some edges e(V,W,C) s.t. V and W are adjacent and C is a color.
{e(V,W,C):a(V,W),c(C)}.

% Auxilary predicates:

% A vertex is reachable from an endpoint if
% it is an endpoint ...
r(V):-s(V,_).
% ... or it has an edge to it from a reachable vertex.
r(V):-r(W),e(W,V,_).

% A vertex is okay if it is reachable and either
% is an endpoint with one edge or is not an endpoint and has two edges.
% This is golfed to: the set of edges from V and endpoints V has
% cardinality 2.
o(V):-r(V),{e(V,W,_):v(W);s(V,_)}=2.

% Constraints:  We do not want ...

% edges from the same vertex with different colors:
:-e(V,_,C),e(V,_,D),C!=D.

% edges without their inverses:
:-e(V,W,C),not e(W,V,C).

% vertices that are not okay:
:-v(V),not o(V).

% edges from endpoints with the wrong color
:-s(V,C),e(V,_,D),C!=D.

% We're only interested in the e predicate:
#show e/3.

Tôi không biết về các bộ giải ASP khác nhau, nhưng tôi đã sử dụng clingo, trong debian được chứa trong gói gringo.

Nếu bạn gặp vấn đề trong một tập tin probvà mã của tôi trong một tập tin solve, hãy gọi clingo 0 prob solve. Đối với mỗi giải pháp, bạn sẽ nhận được danh sách các cạnh màu mà nó sử dụng (và tất cả các vị từ khác nếu bạn sử dụng phiên bản golf thiếu #showđường kẻ). Nếu bạn chỉ muốn số lượng giải pháp, thêm tùy chọn -q. Nếu bạn chỉ muốn biết nếu có ít nhất một giải pháp, hãy gọi mà không có 0.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.