나는 프롤로그 목록에 대한이 튜토리얼을 읽는 방법 목록에서 특정 요소를 얻는 방법, 나는 예를 건너 왔어요되었습니다프롤로그
?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
X = dead(z)
Y = []
Z = _9593
난 몰라 무엇을 변수 Z에 대해 _9593 값을 어디에서 얻습니까?
나는 프롤로그 목록에 대한이 튜토리얼을 읽는 방법 목록에서 특정 요소를 얻는 방법, 나는 예를 건너 왔어요되었습니다프롤로그
?- [_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
X = dead(z)
Y = []
Z = _9593
난 몰라 무엇을 변수 Z에 대해 _9593 값을 어디에서 얻습니까?
밑줄 우리는 우리가 처음 밑줄은 다음 Y
, 다음 X
이 [2. [b.c]]
에 할당 dead(z)
다음 두 번째 밑줄에 할당, []
에 할당 []
에 할당 한
[_,X,_,Y|_] = [[], dead(z), [2, [b, c]], [], Z].
귀하의 예제 변수에 대한 관심과 int로하지 않는 의미 그리고 꼬리는 밑줄입니다. 우리가 신경 쓰지 않는 것은 밑줄입니다. 그러나 오른쪽에 변수 Z
이 있습니다. _
을 Z
에 할당하고 그 프롤로그 방법은 임의로 변수 _something
과 귀하의 경우는 _9593
입니다. 결국 당신은 밑줄이 무엇인지 신경 쓰지 않기 때문에 걱정하지 않아야합니다.
@ 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와 동일한 정보가 있지만 어휘에는 약간 다른 단어가 사용됩니다.
Z = _9593
이는 자동 생성 된 고유 변수 이름입니다. 규칙과 사실의 변수는 유일성을 보장하기 위해 (일관되게) 이름을 변경해야합니다. 서로 관련이없는 두 개의 쿼리에서 Z
을 사용하면 두 변수는 관련이 없으므로 다른 이름을 사용해야합니다.
당신은 간단한 목표와 같은 효과를 볼 수
1 ?- Z=Z.
Z = _G213
Yes
2 ?- write(Z).
_G236
Z = _G236
213
는 9593
는 특정 프롤로그 구현에 의해 유지 일부 내부 카운터의 단지 반영이다. 선두의 언더 스코어는 대개 그것이 일회용 변수라는 신호입니다.
미안하지만, 나는 정말로 임무보다는 통일이라는 것을 의미했다. – Templar