2017-11-18 4 views
0

그래서 나는 미로를 받았고 열려있는 이웃 (문자 'g'또는 '-'이있는 인접한 명소)의 수를 알아 내려고했습니다.Prolog의 결과 및 If-Statement에 따라 값을 할당하는 방법은 무엇입니까?

openNeighbors(Maze,(R,C),Answer):- 
openCount(Maze,(R-1,C),Up), 
openCount(Maze,(R+1,C),Down), 
openCount(Maze,(R,C-1),Left), 
openCount(Maze,(R,C+1),Right), 

Answer is Up+Down+Left+Right. 

openCount(Maze,Space,Count):- 
    find2D(Maze,What,Space), 
    ( What =:= - -> 
      Count is 1 
    ; What =:= g -> 
      Count is 1 
    ;  Count is 0 
    ) 

내 생각 과정은 내가 방금에 대한 openCount 함수를 호출 할 수 있다는 것입니다, 아래, 왼쪽, 오른쪽하지만 어떻게 포맷합니까 내 경우 openCount 함수 내 문? 내 '무엇'변수를 'g'와 '-'와 비교할 지 잘 모르겠습니다.

내가하고 싶은 것을 위해 자바 것과 동일합니다 :

if(What.equals('g')||What.equals('-')){ 
    return 1; 
}else{ 
    return 0; 
} 

답변

2

아 ~~~~~ ....

이 자신에게 호의를 수행 - 지금, 추방 -> 당신의 마음에서. 한 줄의 술어를 쉽게 피할 수 있도록 소개되었으며, 숙련 된 프롤로그 프로그래머에게는 괜찮습니다 (그리고 선택의 여지가 많은 지점을 피할 수 있습니다).

= =이 같이 '와 같은 수치'인 5 = = + 2

3 무엇 = =

'는 g 함수 아니다'로 도피한다 g. =는 '통일'입니다 - 측면을 동일한 것으로 강제하려고 시도 할 수 없으면 실패합니다. ==는 '동일'합니다. 측면이 동일하면 성공합니다. 너와 나는 같은 건물에 살고 있니? 아마도 우리 둘다 아파트 나 집에 살 수도 있지만 우리는 잘 모릅니다. 결코 사물에 묶여 있지 않습니다.

산술 연산을 수행 할 수도 있습니다. 'is'는 그 연산자입니다.

X는 5 + 6 * Y

당신이 낮은 언어처럼, 자동으로 연산을 수행 할 수 없습니다

통지 - 을 foo는 호출 (5가 Y는 +) 작동하지 않습니다, 그것은 '+'(5 전달 , Y)를 foo로 보냅니다. 이 불편 함은 많은 경이로움에 반하는 것입니다. 특히 foo가 인수를 통해 무엇을해야할지 결정할 수 있습니다. 따라서 matrix_math (5 * X + Y * Z)는 행렬을 평가할 수 있습니다. 당신이가는대로 언어를 만들 수 있습니다. 8cD 이것이 좋습니다.

어쩌면 코드 캡슐화 단위는 '함수'가 아니라 술어라고 할 수 있습니다.

그래서 함수에 대해 이야기 할 때 당신은 술어를 의미하지만, 'g는 함수가 아닙니다'라고 작성한 관리자는 올바른 용어를 알고 실제로 함수를 의미한다고합니다.

그래, 그 이유는 내장 기능을 의미했기 때문입니다. 산수 계산식에 들어갑니다.

신장 반경 * 죄 (세타)

죄 죄 함수이다. 자신 만의 기능을 정의 할 수는 없습니다. 당신이 죄 기능이없는 프롤로그에 있다면 그것을 정의하기를 원할 것입니다. 어떻게 든 값을 반환하고 술어를 사용해야합니다.

sin (Theta, SinTheta) : - ... 일부 코드는 ...

나는이 모든 것이 자의적이고 약간 미친 것처럼 보일 것이라고 확신합니다.

openCount의 두 번째 인수 주변의 괄호는 유용하지 않습니다. 하고 openCount '+'통과하고 싶지 않아 (C, 1)

SUCC (이전, 다음) 유용한 내장 술어,

SUCC '의 후계자'(왼쪽, C)입니다 , SUCC (C, 오른쪽), SUCC (위, R), SUCC (아래 R은)

은 정말 규칙 한 레벨의 몸 들여 쓰기를 권장합니다.

마지막으로, predicate_names_are_like_this_by_convention. thisTooIsAnAtomSoItsSpecicateNameButDontDoIt. < -이 작업을 수행하고 있습니다 ThisIsRightOutAndWontCompile.