0

CLPFD を使用して End View Puzzles のソルバーを作成しようとしています (なじみのない人のために、ここに簡単な説明があります http://www.funwithpuzzles.com/2009/12/abcd-end-view-a1.html ) . 各行/列に適用する制約に取り組んでおり、問題が発生しています。

だから私はそれが次のように見えるべきだと思っています:

% NxN board, numbers from 0 to M in the row, Left/Right are the clues
% corresponding to the row
endviews(N,M,List,Left,Right):- 
    length(List,M),
    domain(List,0,M),
    stop_repeats(List,M),
    left_value(List,M,Left),
    reverse(List,RList),
    left_value(RList,M,Right)
    .

したがって、最初の 3 つの手順は非常に簡単です。ボードを初期化し、ドメインを設定し、この行が (述語0を書きました)以外の数字を繰り返さないことを確認します。stop_repeats/2私が直面している問題は、left_value/3述語の処理です。リストのほとんどは制約されておらず、この最初の正の要素の位置が実際にはわからないため、ここでどのように進めればよいかよくわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

2

たぶん、automaton/3制約がここで役立つでしょうか? (オプションの) ゼロの後に示されている最初の文字が続き、その後にゼロと文字の任意のシーケンスを受け入れる有限オートマトンを作成できます。

于 2012-05-21T15:40:46.807 に答える
1

パズルの仕様を書き留めました。それはあなたの説明よりも一般的ではないようです、それから私はマッピング0 = empty、1 = A、2 = B、3=Cを使用して制約をハードコーディングしました。

/*  File:    abc_view.pl
    Author:  Carlo,,,
    Created: May 21 2012
    Purpose:
*/

:- module(abc_view, [abc_view/0]).
:- [library(clpfd), '~/prolog/lambda'].

abc_view :-
    maplist(\Ls^(length(Ls, 4), Ls ins 0..3), [R1,R2,R3,R4]),
    transpose([R1,R2,R3,R4], [C1,C2,C3,C4]),

    maplist(all_distinct, [R1,R2,R3,R4]),
    maplist(all_distinct, [C1,C2,C3,C4]),

    start(R2, 3),
    start(R3, 3),
    finish(R3, 2),

    start(C3, 1),
    finish(C2, 2),

    maplist(writeln, [R1,R2,R3,R4]).

finish(X, V) :-
    reverse(X, Y),
    start(Y, V).

start([0,Y|_], Y).
start([Y|_], Y).

テスト:

?- abc_view.
[2,0,1,3]
[0,3,2,1]
[3,1,0,2]
[1,2,3,0]
true ;
false.

より一般的なパズルを解くためにそれを使用できることを願っています。

于 2012-05-21T18:29:42.323 に答える