2014-06-13 2 views
0

내가 작업중인 일부 프롤로그 코드에서 인스턴스화 오류가 발생했습니다. 라는 술어가 (희망) (다음라고도 함) 노드에 연결되어 아이들의 목록을 생성에 연결된 통화를 연결할 때프롤로그 인스턴스화 오류 문제

uncaught exception: error(instantiation_error,(is)/2) 

오류가 발생합니다.

나는 링크 테스트를 거쳤으며 자체적으로 정상적으로 작동하는 것처럼 보입니다. 나는 그것이 '아이'와 관련이 있다고 생각하지만 프롤로그를 처음 접했을 때 나는 정확히 무엇이 정확한지 모릅니다.

연결이 제대로 작동하지만 실제로는 작동하지 않는 연결의 두 번째 버전이 있습니다.

여기에 코드의 일부입니다 :

linked(loc(A, B), loc(C, D)) :- C is A+1, D is B+1. 
linked(loc(A, B), loc(C, D)) :- C is A-1, D is B-1. 
linked(loc(A, B), loc(C, D)) :- C is A, D is B-1. 
linked(loc(A, B), loc(C, D)) :- C is A, D is B+1. 
linked(loc(A, B), loc(C, D)) :- C is A-1, D is B. 
linked(loc(A, B), loc(C, D)) :- C is A+1, D is B. 

connects(State, End, Colour, Next, Close) :- linked(Child, Next) 

이보다 프로그램에 더하지만 훨씬 디버깅을 통해 나는 문제가 발생하는 경우이 선이 있다는 결론에 도달 한이 있습니다.

추가 정보 Connects는 동일한 요소의 끊어짐없는 경로가 있는지 여부를 확인하는 연결됨이라는 조건 자에 사용되는 조건 자입니다. Linked는 두 노드가 서로 옆에 있는지 (수직, 대각선, 수평, 정사각형 격자가 아닌 육각형을 생각하는) 술어입니다. 여기

is 오른쪽의 변수가 있기 때문에 너무

[e,e,b,e,e], 
    [e,w,w,b,e], 
    [b,w,b,w,w], 
[w,w,b,b,b], 
[e,e,b,w,e] 

답변

1

오류 수율 인 예시적인 상태이다.

connects/5에서 linked(Child,Next)을 사용하지만 Child은 사용되지 않으며 항상 언 바운드입니다. 따라서 linked/2이 호출되면 AB은 항상 오류를 유발하는 변수입니다.

linked(State,Next)을 의미합니까?

+0

안녕하십니까? 당신의 대답이 실제로 내 문제를 해결하지는 못했지만 생각의 관점에서 올바른 길로 나를 놓았습니다. 방금 "링크 된 (다음, 하위)"로 변경되었으며 이제 작동합니다! : D ... 다음 문제로 넘어 가기 : P – user3738728