2017-12-21 39 views
0

퍼즐은 이렇게됩니다 : 섬에는 4 개의 사원이 있습니다. 각 성전에는 그것이 지어 졌던 이름, 위치 및 날짜가 있습니다. 네 가지 조합 (이름, 위치, 날짜)이 올바른지 결정하는 데 도움이되는 4 가지 단서가 있습니다. 프롤로그를 사용하여이 문제를 해결해야합니다.프롤로그 그리드 기반 로직 퍼즐이 붙어

사원의 이름은 hori_takesi, okabe honzo, sama takako 및 takahashi입니다. 위치는 Funai, Toyagi, Uchida 및 Usui입니다. 하나는 마에게 타카코을이고 다른 하나는 오카베이며, 우치다의 신사와 1645 년에 지어진 성전의

  1. : 날짜는 1525, 1585, 1645 및 다음과 같은 단서를 제공하는 1705

    있습니다 혼조.

  2. 나이의 사원 toyagi의 성전이 120년 우스
  3. 호리의 성전 이전에 건축 된 다카하시
  4. 전에 지어진 takesi WASA

내가 다음 knowlegde 기반을 만들어 사마 타카코 후 내장 된 모든 가능한 조합을 보유합니다.

temple(hori_takesi, Location, Y). 
temple(okabe_honzo, Location, Y). 
temple(sama_takako, Location, Y). 
temple(takahashi, Location, Y). 

temple(Name, funai, Y). 
temple(Name, toyagi, Y). 
temple(Name, uchida, Y). 
temple(Name, usui, Y). 

temple(Shrine, Location, 1525). 
temple(Shrine, Location, 1585). 
temple(Shrine, Location, 1645). 
temple(Shrine, Location, 1705). 

프롤로그를 요청할 쿼리는? -solution (X)입니다. 이것은 4 가지 모든 올바른 조합을 반환해야합니다. 그래서 X는 4 개의 요소, 즉 사원의 목록입니다.

용액 (X). 모든 단서가 사실이라면 사실이됩니다.

clue1(X) :- temple(Name, uchida, Y), Y\= 1645 
clue2(X) :- temple(Name, funai, Y), temple(Shrine, takahashi, Y1), Y < Y1. 
clue3(X) :- temple(Name, toyagi Y), temple(Shrine, usui, Y1). Y1 is Y + 120. 
clue4(X) :- temple(hori_takesi, Loc, Y), temple(sama_takako, Loc, Y1) Y > Y1. 
solution(X) :- clue1(X), clue2(X), clue3(X), clue4(X). 

여기에서 onwarts을 진행하는 방법을 잘 모르겠어요 : 그래서 나는 다음과 같은했다. 또 다른 팁은 member/2를 사용하는 것입니다. 그러나 그것을 구현하는 방법에 대해 잘 모르겠습니다. 누군가가 나를 도울 수 있으면 사랑해.

+1

사마 타카코 이후에 지어진 – damianodamiano

+1

@damianodamiano : 고급 도구를 배우기 전에 더 나은 OP가 기초를 배웁니다. CLP (FD) 그것은 [누수 추상화] (https://en.wikipedia.org/wiki/Leaky_abstraction)입니다. 귀하의 술어에서 무슨 일이 일어나고 있는지를 모른 채 사용할 수는 없습니다 ... – CapelliC

+0

질문 제목에서 a 당신의 시도에서 빠진 근본적인 세부 사항. 변수가 함께 재생할 수있는 단일 술어로 * 그리드를 모델링해야합니다. 모든 단서는 그리드 행의 일부 하위 세트에서 작동합니다. 각 행은 엔티티를 나타 내기 때문입니다. – CapelliC

답변

0

다음은이 문제에 대한 나의 답변입니다. SICStus Prolog를 사용하고 있으며 clpfd 라이브러리를 사용하고 있습니다.

:- use_module(library(clpfd)). 

유한 도메인에서 문제를 정수로 변환해야합니다.

그래서 저는 성전 이름이 1..4가 될 것이라고 결정했습니다. 위치와 연도는 질문과 같은 순서로 적용됩니다.

솔루션의 이름 순서가 포함되어 있으므로 이름에 순서가 다른 솔루션이 있습니다.

names([hori_takesi, okabe_honzo, sama_takako, takahashi]). 
locations([funai, toyagi, uchida, usui]). 
years([1525, 1585, 1645, 1705]). 

제한은 제약을 사용하는 것입니다. 해결책은 요건을 충족시켜야합니다.

solver(Temples):- 
    years(Years), 
    length(Temples, 12), 
    domain(Temples, 1, 4), 
    global_cardinality(Temples, [1-3, 2-3, 3-3, 4-3]), 
    optim(Temples), 
    clue1(Temples), 
    clue2(Temples), 
    clue3(Temples), 
    clue4(Temples), 
    labeling([], Temples), 
    write(Temples). 

optim(Temples):- 
    element(1, Temples, N1), 
    element(2, Temples, N2), 
    element(3, Temples, N3), 
    element(4, Temples, N4), 
    all_distinct([N1, N2, N3, N4]), 
    10 #= N1 + N2 + N3 + N4, 
    element(5, Temples, N5), 
    element(6, Temples, N6), 
    element(7, Temples, N7), 
    element(8, Temples, N8), 
    all_distinct([N5, N6, N7, N8]), 
    10 #= N5 + N6 + N7 + N8, 
    element(9, Temples, N9), 
    element(10, Temples, N10), 
    element(11, Temples, N11), 
    element(12, Temples, N12), 
    all_distinct([N9, N10, N11, N12]), 
    10 #= N9 + N10 + N11 + N12. 

첫 번째 단서는 : 우치다의 신사와 1645 년에 지어진 사원 중 하나는 사마 타카코이고 다른 하나는 오카베의 honzo입니다.

clue1(Temples):- 
    element(7, Temples, N1), 
    element(11, Temples, N2), 
    (N1 #= 3 #/\ N2 #= 2) 
    #\/ (N2 #= 3 #/\ N1 #= 2). 

두 번째 단서 : 다카하시 이전에 파나이 사원이 세워졌습니다. 그래서 나는 funai 위치 5와 takahashi 4에 요소를 가져다가 N1과 N2에 값을 저장합니다. 그런 다음 데이트를해야합니다. 날짜는 사원의 마지막 4 요소이므로 위치를 8보다 크게 할 것입니다.그런 다음 날짜와 동일한 값 N1과 N2를 갖는 요소를 가져 와서 솔루션이 단서 Y2> Y1을 만족하도록 제한합니다.

clue2(Temples):- 
    element(5, Temples, N1), 
    element(4, Temples, N2), 
    Y1 #> 8, 
    Y2 #> 8, 
    element(Y1, Temples, N1), 
    element(Y2, Temples, N2), 
    Y2 #> Y1. 

세 번째 힌트 : 도가기의 사원은 우스에서 사원보다 120 년 전에 지어졌습니다. 또는 날짜의 우리의 주문, 날짜 위치 사이의 차이는 2

clue3(Temples):- 
    element(6, Temples, N1), 
    element(8, Temples, N2), 
    Y1 #> 8, 
    Y2 #> 8, 
    element(Y1, Temples, N1), 
    element(Y2, Temples, N2), 
    abs(Y1 - Y2) #= 2. 

네 번째 단서 : 호리 takesi는 당신이 문제를 해결하기 위해 clpfd 라이브러리를 사용한다

clue4(Temples):- 
    element(1, Temples, N1), 
    element(3, Temples, N2), 
    Y1 #> 8, 
    Y2 #> 8, 
    element(Y1, Temples, N1), 
    element(Y2, Temples, N2), 
    Y1 #> Y2. 
+0

CLP (FD) 강력한 도구이지만 여기에 실제로 잘못 사용 된 것입니다 ... – CapelliC

+1

@CapelliC 왜 오용이라고합니까? – BlueDi

+0

나는 강력한 도구를 통해 장난감이나 장난감 등의 문제를 해결하기위한 노력이 줄어들 것이라고 기대합니다. 코드가 매우 길어서 이해하는데 문제가 있습니다 (예 : Clue4/1에서 Y1 #> 8의 목적은 무엇입니까?). 그래서 나는 당신의 대답이 줄리어스를 혼란스럽게 할 수 있다고 생각합니다. – CapelliC