2012-05-21 2 views
1

CLPFD를 사용하여 End View Puzzles의 솔버를 작성하려고합니다. 익숙하지 않은 사용자는 http://www.funwithpuzzles.com/2009/12/abcd-end-view-a1.html입니다. 각 행/열에 적용하고 몇 가지 문제가있는 제약 조건을 다루고 있습니다. 꽤 정직하고 있습니다 그래서 처음 3 단계End View Puzzle, Prolog

% 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) 
    . 

을 : 도메인을 설정, 보드를 초기화하고 있는지 확인하는 것이이 행하지 않습니다

그래서 나는 이런 식으로 뭔가를 찾아야한다 생각하고 있어요 0이 아닌 반복 번호 ( stop_repeats/2 술어를 작성했습니다). 내가 만나는 문제는 left_value/3 술어를 다루는 것입니다. 목록의 대부분은 제약이 없기 때문에이 첫 번째 긍정적 인 요소의 위치를 ​​실제로 알지 못하기 때문에 여기서 어떻게 진행해야할지 모르겠습니다. 도움이 될 것입니다.

+0

'left_value'는 내 대답에'start'와 유사해야합니다. – CapelliC

답변

2

아마도 automaton/3 제약이 여기에 도움이 될까요? 표시된대로 첫 번째 문자 다음에 0을 받아 들일 수있는 유한 오토 마톤을 만든 다음 임의의 0과 문자 시퀀스를 구성 할 수 있습니다.

1

나는 퍼즐 사양을 적었습니다. 그것은 당신의 설명보다 덜 일반적으로 보인다. 그런 다음 매핑 0 = 빈, 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. 

나는 당신이 당신의 더 일반적인 퍼즐을 해결하는 데 사용할 수 있기를 바랍니다.