>

2x2 축 (20 x 15)이 있습니다. 거기에서 두 원의 중심 위치를 계산하고 싶습니다. computeShapeBelow/2는 첫 번째가 두 번째 원 아래에 있고 물론 원의 가장자리가 내 X-Y 축 (20) 15 제한 내에 있어야하는 경우 두 원의 가능한 중심을 찾습니다. 오류가 발생합니다 : callable' expected, found 2' (an integer) . 오류와 아래 쿼리는 예상 원 구조 입력 [[circle, id], Radius, [X, Y]]. 를 보여줍니다.  나는 여기에 OverOver에 대한 답변을 보았지만 해결책이 나이 오류가 발생하는 이유는 분명하지 않습니다. 또한 callable/1, call/1 및 call/2 사용에 대한 SWIPL 설명서는 너무 간단합니다.

:- use_module(library(clpfd)).
computeShapeBelow(Shape1,Shape2,Xcord1,Ycord1,Xcord2,Ycord2) :- 
   nth0(2,Shape1,Location1), nth0(2,Shape2,Location2),
   nth0(1,Shape1,Dim1), nth0(1,Shape2,Dim2),
   nth0(0,Location1,Xcord1), nth0(0,Location2,Xcord2),
   nth0(1,Location1,Ycord1), nth0(1,Location2,Ycord2),
   Xcord1 in 0..20, Xcord2 in 0..20, 
   Ycord1 in 0..15, Ycord2 in 0..15,
   Ycord2 #> Ycord1+Dim1, Dim2.
?- computeShapeBelow([[circle1,1],4,[X1,Y1]],[[circle,2],2,[X2,Y2]], X1, Y1, X2,Y2).
ERROR: Type error: `callable' expected, found `2' (an integer)
ERROR: In:
ERROR:    [8] computeShapeBelow([[circle1|...],4|...],[[circle|...],2|...])
ERROR:    [7] <user>

  • 답변 # 1

    아마도 오타 일거야. Dim2  여기

    와이즈 비즈 그러나 일반적인 스타일 노트로서 CLP (FD) 구조와 nth0/3와 같은 전통적인 프롤로그 구조와 혼합하는 것에주의하십시오. 내 경험상 문제를 디버깅 할 때 CLP (FD)에는매우다른 사고 방식이 필요합니다. 변수의 인스턴스화 상태가 알려질 때까지 실행이 지연되고 변수를 '터치'해야하기 때문입니다 ( 예를 들어 findall/3로 수집하면 예기치 않은 결과가 발생할 수 있습니다.

    문제에 CLP (FD)가 필요하지 않지만 무차별 대입으로 충분하다면

    ...,Ycord2 #>Ycord1+Dim1,Dim2.

    대신/3 사이에서 사용하는 것이 더 쉽습니다. 예를 들어

    VAR in Low..High
    
    

    일 수있다

    Xcord1 in 0..20,
    
    

    between(0,20,Xcord1),

관련 자료

  • 이전 java - 단방향 일대일 관계의 최대 절전 모드에서 소유자 인 부모 엔터티
  • 다음 python - 파이썬 - 모듈과 디렉토리에서 효율적으로 사용할 수있는 기능을 정의하는 방법