2013-06-11 2 views
0

ntiles 문제를 해결하기 위해 노력하고 있습니다. 그리드가 있습니다. 그리드에 주어진 크기의 N 개의 타일을 찾고자합니다. 우리는 다음과 같은 규칙이 :그리드에 n 개의 타일을 찾는 방법 - 프롤로그

ntiles(A/B, Grid, N, Pos1/Pos2) :- 

그리고 우리가 타일을 찾을 수있는 가능한 위치를 반환해야합니다 :

>ntiles(2/1,3,2,P). 

P=[1/1,1/3]?; 
P=[1/1,2/3]?; 
P=[2/1,1/3]?; 
P=[2/1,2/3]?; 
No. 

나는 간단한 재귀 문제가 있지만 그것을 해결하기 위해 관리 couldnt는 생각합니다. 먼저 1/1 위치에서 시작하는 단일 행에서만 타일을 찾으려고했습니다. 이것은 내가 현재 첫 행에 머물러 있다는 것을 의미합니다. 나는 이것을 달성하면 칼럼을 구현하기가 쉽다고 생각했다. 당신이 내 코드를 검사 할 때

당신은 나를 이해합니다

ntiles(A/B, G, N, K) :- 
    setof(X/Y, horizontal(A/B, G, N, X/Y), K). 

horizontal(A/B, G, N, P1/P2) :- 
    N > 0, 
    P is A + 2, 
    P =< G, 
    horizontal(A/B, G, N-1, P/1). 

이 코드를 반환 '거짓'. 나는 그것을 K의 목록으로 되돌릴 것으로 예상했다. 당신은 문제가 어디 있는지 생각하고 있는가?

이 문제를 해결하기 위해 통찰력을 줄 수 있습니까?

미리 감사드립니다.

답변

0

많은 문제가 있습니다.

주된 이유는 모든 솔루션을 얻으려면 setof/3을 사용해야하고 종류가 'backtrack에서 생성'목표를 요구하지만 결정적 목록 생성자로 horizontal/4가 대신 코딩됩니다.

다른 문제가있다 : N> 0 (즉, N은 0) 어떤 기저 케이스 대해 때

  • 수평/4 만 성공?
  • P1, P2는 싱글 톤 : 솔루션에서 어떤 역할도 수행 할 수 없습니다.
  • 산술 연산을 명시 적으로 수행해야합니다. 그러면 N-1을 전달하는 대신 - 예 : M is N-1을 추가하고 재귀 호출에서 M을 전달해야합니다.

answer 나는 아주 (아주) 비슷한 문제를 제기했다.