2013-03-21 5 views
1
에 목록에서 특정 요소를 받고

나는 프롤로그 목록에 대한이 튜토리얼을 읽는 방법 목록에서 특정 요소를 얻는 방법, 나는 예를 건너 왔어요되었습니다프롤로그

?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z]. 

    X = dead(z) 
    Y = [] 
    Z = _9593 

난 몰라 무엇을 변수 Z에 대해 _9593 값을 어디에서 얻습니까?

답변

1

밑줄 우리는 우리가 처음 밑줄은 다음 Y, 다음 X[2. [b.c]]에 할당 dead(z) 다음 두 번째 밑줄에 할당, []에 할당 []에 할당 한

[_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z]. 

귀하의 예제 변수에 대한 관심과 int로하지 않는 의미 그리고 꼬리는 밑줄입니다. 우리가 신경 쓰지 않는 것은 밑줄입니다. 그러나 오른쪽에 변수 Z이 있습니다. _Z에 할당하고 그 프롤로그 방법은 임의로 변수 _something과 귀하의 경우는 _9593입니다. 결국 당신은 밑줄이 무엇인지 신경 쓰지 않기 때문에 걱정하지 않아야합니다.

2

@ Templar의 설명에 대해 궁금해합니다. 기술 세부 사항은 정확하지만 용어를 올바르게 사용하는 것에 대해 걱정합니다.

여기에 할당이 없습니다. 통일 밖에 없습니다. 우리가 여기에서 할 일은 [_, X, _, Y|_][[], dead(z), [2, [b, c]], [], Z]을 통합하는 것입니다. 결과가 없으며 값 또는 변수가있는이 있습니다. Prolog가 계속 진행할 수 없을 때 왼쪽과 오른쪽으로 걷는 것을 상상하는 것보다는 함께 묶어 놓은 목록을 상상하는 것이 더 안전 할 수도 있습니다.

먼저 Prolog는 _와 []을 (를) 통합하려고합니다. _은 "나는 상관하지 않는다"라는 의미이기 때문에 이것은 간단하게 성공합니다. 이 통일에 의해 구속력이 성립되지 않습니다.

다음으로 Prolog는 X를 dead(z)과 통합하려고 시도합니다. 이것은 X가 언 바운드 (unbound) 되었기 때문에 간단히 성공합니다. 그러면 바인딩이 설정됩니다 (X = dead(z)). 이 변수는 밑줄로 시작하지 않으므로 Prolog는이 바인딩에 관심이 있다고 생각하므로보고합니다.

다음으로 Prolog는 _을 [2, [b, c]]과 통합하려고 시도합니다. 다시 말하지만, 이것은 바인딩을 확립하지 않고는 거의 성공하지 못합니다.

다음으로 Prolog는 Y를 []와 통합하려고 시도하지만, 다시는 쉽게 성공하지만, 이번에는 Y = []를 설정하여 Y가보고합니다.

다음 단계를 진행하기 전에 표기법을 변경해야합니다. Prolog에서 [X|T]은 X로 시작하고 T로 계속되는 목록입니다. 따라서 [X|_]은 X를 목록의 첫 번째 요소와 통합하고 꼬리를 버립니다. 그래서이 경우에 |_]은 본질적으로이 목록에 더 많은 내용이있을 수 있다고 말합니다. 그러나 나는 그것이 무엇인지 알기 위해 특별히 신경 쓰지 않습니다. (그런데 비어있는 목록은 일치 할 것입니다.)

다음으로 Prolog는 익명의 꼬리 |_을 Z와 통합하려고 시도합니다. Z가 바인딩되지 않았으므로 Prolog는 다시 성공합니다. 프롤로그는 익명의 변수를 만들어 Z에 바인딩하여 바인딩을 설정합니다.

그래서 @Templar와 동일한 정보가 있지만 어휘에는 약간 다른 단어가 사용됩니다.

+0

미안하지만, 나는 정말로 임무보다는 통일이라는 것을 의미했다. – Templar

2
Z = _9593 

이는 자동 생성 된 고유 변수 이름입니다. 규칙과 사실의 변수는 유일성을 보장하기 위해 (일관되게) 이름을 변경해야합니다. 서로 관련이없는 두 개의 쿼리에서 Z을 사용하면 두 변수는 관련이 없으므로 다른 이름을 사용해야합니다.

당신은 간단한 목표와 같은 효과를 볼 수

1 ?- Z=Z. 

Z = _G213 

Yes 
2 ?- write(Z). 
_G236 

Z = _G236 

2139593는 특정 프롤로그 구현에 의해 유지 일부 내부 카운터의 단지 반영이다. 선두의 언더 스코어는 대개 그것이 일회용 변수라는 신호입니다.