2011-08-03 2 views
1

에서 나는 최근에 수은이 코드 예제를 건너 왔어요 :"="및 "=>"수은

append(X,Y,Z) :- 
    X == [], 
    Z := Y. 
append(X,Y,Z) :- 
    X => [H | T], 
    append(T,Y,NT), 
    Z <= [H | NT]. 

는 프롤로그 프로그래머 인, 궁금 : 정상적인 통일 = 과의 차이점은 무엇 := 또는 여기에 사용되는 =>?

Mercury reference에서 이러한 연산자는 다른 우선 순위를 갖지만 차이점을 설명하지는 않습니다.

+0

하자 다시 쓰기 압입하여 코드 : ' APPEND (X, Y, Z)를 - X == [] Z = Y. APPEND (X, Y, Z) - X => [H | T], append (T, Y, NT), Z <= [H | NT]. ' –

+0

내가 다시 노력 할게요, 하자 들여 쓰기를 사용하여 코드를 재 - 쓰기 : APPEND (X, Y, Z)을 : - X == [], Z : = Y. append (X, Y, Z) : - X => [H | T], append (T, Y, NT), Z <= [H | NT]. 4 개의 공백으로 모든 코드를 들여 쓰기해야하는 것 같습니다. –

답변

4

먼저하자 다시 쓰기 들여 쓰기를 사용하여 코드를 : 당신은 의견 작동하지 않는 것 네 개의 공간으로 모든 코드를 들여 갖고있는 것 같다

append(X, Y, Z) :- 
    X == [], 
    Z := Y. 
append(X, Y, Z) :- 
    X => [H | T], 
    append(T, Y, NT), 
    Z <= [H | NT]. 

을, 내 의견이 위의 무시한다 (나는 그들을 삭제할 수 없다).

위의 코드는 실제 수은 코드가 아니며 의사 코드입니다. <==> 연산자가 통일이 아닌 입력기 (IIRC)에 사용되므로 실제 머큐리 코드로는 의미가 없습니다. 또한, 나는 전에 := 연산자를 보지 못했고, 무엇이 무엇인지 잘 모르겠습니다. 의사 코드의이 스타일에서

은 저자가 :=XY의 값을 할당 통일의 지정 유형 것을 보여주기 위해 노력하고 있음을 (저는 믿습니다). 유사하게 =>분해도X이고 <=구조Z 인 것을 보여줍니다. 또한 ==X과 빈 목록 간의 동등성 테스트를 보여줍니다. 이러한 모든 작업은 통합 유형입니다. 컴파일러는 술어의 각 모드에 대해 사용해야하는 통일 유형을 알고 있습니다. 이 코드는 말이 모드는보다 효율적인 코드를 생성하고 프로그램이 모드 올바른지 확인 할 수 있으므로 사용하는 통일의 유형을 알고, append(in, in, out)

수은이 점에서 프롤로그 다르다입니다.

한 가지 더,이 의사 코드에 대한 실제 수은 코드는 다음과 같습니다 모든 통일은 =와 술어 및 모드 선언이 추가 된 것입니다

:- pred append(list(T)::in, list(T)::in, list(T)::out) is det. 

append(X, Y, Z) :- 
    X = [], 
    Z = Y. 
append(X, Y, Z) :- 
    X = [H | T], 
    append(T, Y, NT), 
    Z = [H | NT]. 

하는 것으로.

+0

비어있는 "무인"변수 및 변수에 이미 "서식하는"변수가 포함되어있는 변수를 호출합니까? 아니면 다른 용어가 있습니까? – CMCDragonkai

3

콘크리트 수은 구문에서 연산자 :=은 필드 업데이트에 사용됩니다.