2013-05-08 1 views
1

Ivan Bratko 책에서 프롤로그를 공부 중입니다. 인공 지능 프로그래밍과 책에서 을 사용하는이 8 버전의 퀸즈 문제를 발견했습니다. I라고 생각Prolog에서 공간 상태 "그래프"를 사용하는 8 개의 퀸 솔루션이 작동하지 않습니다.

s(Queens, [Queen|Queens]) :- member(Queen, [1,2,3,4,5,6,7,8]), 
          noattack(Queen, Queens). 

goal([_,_,_,_,_,_,_,_]). 

noattack(_,[],_). 

noattack(Y,[Y1|Ylist],Xdist) :- 
            Y1-Y =\= Xdist, 
         Y-Y1 =\= Xdist, 
            Dist1 is Xdist + 1, 
            noattack(Y,Ylist,Dist1). 

solve(N,[N]) :- goal(N). 

solve(N, [N|Sol1]) :- s(N,N1), 
         solve(N1,Sol1). 

그것은 (그 noattack/3 관계를 사용한다) 순열에 기초하여 8 퀸즈 과제 해결을 결합하고 /2 술어 : 스페이스 상태 "그래프" 문제를 해결 가능한 후계 국가 상태 (내 그래프의 노드)를 구축하십시오.

의 (ActualState, SuccessorState)

난 단지 내가 정확히 8 여왕을 배치 할 필요가 지정 있다고 생각 목표/1 조건 : 그래서 내가 좋아하는 뭔가가있다.

이 책에서이 쿼리를 실행하면 해결 ([], 솔루션)이 증가하고 퀸즈 수가 증가하는 보드 위치 목록이 생성되며이 목록은 8 명의 여왕의 안전한 구성으로 끝나게됩니다. .

하지만이 작동하지 않습니다이 쿼리를 실행하려고 나는이 출력 얻을 것이다 경우 : 바르게, 라인 2에서 호출 된 noattack 술어 만이 매개 변수를 사용하기 때문에

?- solve([],Solution). 
ERROR: s/2: Undefined procedure: noattack/2 
ERROR: However, there are definitions for: 
ERROR:   noattack/3 

을하지만, noattack 술어에는 3 개의 매개 변수가 있어야합니다 ... 책의 bue가이 잘못된 방식으로 제공되며이 문제를 어떻게 해결할 수 있는지 모르겠습니다 ...

왜? 내가 뭘 놓치고 있니?

+1

, 당신은 당신이 입력 한 확신 그게 정확히 있니? (나는 거의 확신하지 못했다.) –

+0

나는 TYPO 오류를 수정했지만 지금은 다른 문제가있다 ... 불행히도이 책에서 주어진 해결책이 잘못되었거나 완료되지 않은 것 같다. – AndreaNobili

답변

2

몇 가지 버그 : 다음

s(Queens, [Queen|Queens]) :- member(Queen, [1,2,3,4,5,6,7,8]), 
          noattack(Queen, Queens, 1). 

noattack(_,[],_) :- !. 
noattack(Y,[Y1|Ylist],Xdist) :- Y =\= Y1, 
            Y1-Y =\= Xdist, 
            Y-Y1 =\= Xdist, 
            Dist1 is Xdist + 1, 
            noattack(Y,Ylist,Dist1). 

,

18 ?- solve([],_X), last(_X,S). 
S = [4, 2, 7, 3, 6, 8, 5, 1] ; 
S = [5, 2, 4, 7, 3, 8, 6, 1] ; 
S = [3, 5, 2, 8, 6, 4, 7, 1] ; 
S = [3, 6, 4, 2, 8, 5, 7, 1] ; 
S = [5, 7, 1, 3, 8, 6, 4, 2] ; 
S = [4, 6, 8, 3, 1, 7, 5, 2] 

하고,

이 프로그램의 컴파일 시간 경고의 전체 무리가있다
25 ?- findall(X, solve([],X), _S), length(_S,N). 
N = 92. 
+0

좋아, tnx와 평소만큼 개입은 나에게 큰 도움을주었습니다. (불행하게도 지난 학기에이 과정을 수강 할 수 없었습니다. 직장에서 일하기도하고 때로는 Prolog를 혼자 공부하기 때문에 ...) 이제이 코드를 깊이 이해하려고 노력할 것입니다. 지금 나는 그것에 대해 당신에게 일반적인 purposte 질문 만 있습니다. 이전 예에서 DFS에 의한 프로그램 탐색은 공간 상태 "그래프"를 방문합니다. 그래프의 모든 노드는 유효한 상태를 나타냅니다. 1)이 경우 유효한 상태는 8 개의 여왕 구성으로 공격이없는 곳입니까? – AndreaNobili

+0

2) 그래프를 명시 적으로 선언 한 적이 없으며 유효한 상태에서 다른 동작 상태로 전환시키는 s/2 술어에 의해 자동으로 빌드 된 것으로 볼 수 있습니까? 이 상황을 잘 이해할 수있는 몇 가지 힌트를 주시면 매우 감사하겠습니다 .- Tnx – AndreaNobili

+0

. 주목할 것은,'s (X, Y)'에서, Y는 항상 X보다 더 긴 목록 1 요소 (또한리스트)이다. 그래서's/2'는 한 명의 여왕을 체스 판에 배치하여 이미 그 여왕을 공격하지 못하도록하는 "움직임"을 나타냅니다. –