簡體   English   中英

解決Prolog中的Kakuro拼圖(5x5)

[英]Solving Kakuro puzzle (5x5) in Prolog

在此輸入圖像描述

假如說:

A+B+C=24
E+F+G=11
J+K+L=22
N+O+P=14
A+E=17
B+F+J+N=26
C+G+K+O=15
L+P=13

考慮到上述約束,使用謂詞solve/1 ,我怎樣才能找到問題的可能解決方案? 我的第一次嘗試是在下面,沒有結果。 提前致謝!

solve(L1) :-
    L1 = [A,B,C,E,F,G,J,K,L,N,O,P],
    A is 24-B-C,
    B is 26-F-J-N,
    C is 15-G-K-O,
    E is 11-F-G,
    E is 17-A,
    J is 22-K-L,
    N is 14-O-P,
    L is 13-P,
    write(L1).

正如@lurker在評論中已經說過的那樣,使用CLP(FD)約束

另外,我建議:

  1. 而不是solve/1 ,使用像solution/1這樣的聲明性名稱 您應該描述的解決方案是什么使人,這樣的關系在各個方向上是有道理的,還例如,如果解決方案已經給出要驗證它。
  2. 按照慣例,讓代表列表的變量以s結尾是有意義s
  3. 與純代碼分開的副作用。 事實上,完全消除副作用。 為您做印刷!

例如:

:- use_module(library(clpfd)).

solution(Ls) :-
    Ls = [A,B,C,E,F,G,J,K,L,N,O,P],
    A #= 24-B-C,
    B #= 26-F-J-N,
    C #= 15-G-K-O,
    E #= 11-F-G,
    E #= 17-A,
    J #= 22-K-L,
    N #= 14-O-P,
    L #= 13-P.

這已經適用於以下查詢:

?- solution(Ls), Ls ins 0..sup, label(Ls).
Ls = [6, 3, 15, 11, 0, 0, 9, 0, 13, 14, 0, 0] ;
Ls = [6, 3, 15, 11, 0, 0, 10, 0, 12, 13, 0, 1] ;
Ls = [6, 3, 15, 11, 0, 0, 11, 0, 11, 12, 0, 2] ;
etc.

我完成這個作為一個簡單的練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM