문제

무엇을기 참조 투명성 의미합니까?내가 들었어요"라고 설명을 의미할 수 있습 교체 같음과 같음"그러나 이것은 같은 부적절한 설명이 있습니다.

도움이 되었습니까?

해결책

"참조 투명성"이라는 용어는 유래합니다 분석 철학, 논리 및 수학 방법에 기초하여 자연 언어 구성, 진술 및 주장을 분석하는 철학의 분야. 다시 말해, 그것은 우리가 부르는 것에 대한 컴퓨터 과학 밖에서 가장 가까운 주제입니다. 프로그래밍 언어 의미론. 철학자 Willard Quine 참조 투명성의 개념을 시작할 책임이 있었지만 Bertrand Russell과 Alfred Whitehead의 접근 방식에도 내재되어있었습니다.

핵심적으로 "참조 투명성"은 매우 간단하고 명확한 아이디어입니다. "참조"라는 용어는 분석 철학에 사용됩니다. 표현이 말하는 것. 언어 의미론을 프로그래밍하는 "의미"또는 "표시"가 의미하는 것과 거의 동일합니다. Andrew Birkett의 예제 사용 (블로그 게시물), "스코틀랜드의 수도"라는 용어는 에든버러시를 의미합니다. 그것은 "지시자"의 간단한 예입니다.

문장의 컨텍스트는 다른 용어로 해당 컨텍스트에서 용어를 대체하는 경우 "참조적으로 투명한"것입니다. 동일한 엔티티를 나타냅니다 의미를 변경하지 않습니다. 예를 들어

스코틀랜드 의회는 스코틀랜드 수도에서 만납니다.

동일한 것을 의미합니다

스코틀랜드 의회는 에든버러에서 만납니다.

따라서 "스코틀랜드 의회가 만나는 ..."라는 맥락은 참조적으로 투명한 맥락입니다. 우리는 "스코틀랜드의 수도"를 의미를 변경하지 않고 "에든버러"로 대체 할 수 있습니다. 다른 방법으로 말하면, 맥락은 용어가 언급하는 것과 다른 것이 무엇인지에 대해서만 관심이 있습니다. 그것이 문맥이 "참조적으로 투명하다"는 의미입니다.

반면에, 문장에서

에든버러는 1999 년부터 스코틀랜드의 수도였습니다.

우리는 그런 교체를 할 수 없습니다. 우리가 그렇게한다면, 우리는 "에든버러는 1999 년부터 에든버러였다"는 말을 할 것입니다. 이것은 말할 것입니다. 원래 문장과 같은 의미를 전달하지 않습니다. 따라서 "에딘버러가 ... 1999 년부터 ... 이래로 ..."라는 맥락은 참조적으로 불투명 한 것으로 보입니다 (참조적으로 투명한 반대). 그것은 분명히 걱정합니다 뭔가 더 용어가 언급하는 것보다. 무엇입니까?

"스코틀랜드의 수도"와 같은 것들이 명확한 용어 그리고 그들은 오랫동안 논리 학자와 철학자들에게 미친 양의 머리 통증을주지 않았습니다. Russell과 Quine은 그들이 실제로 "참조"가 아니라고 말하는 것을 분류했습니다. 즉, 위의 예가 엔티티를 참조하는 데 사용된다고 생각하는 것은 실수입니다. "에든버러는 1999 년부터 스코틀랜드의 수도"를 이해하는 올바른 방법은

스코틀랜드는 1999 년부터 수도를 보유하고 있으며 그 수도는 에든버러입니다.

이 문장은 영양가있는 문장으로 변환 될 수 없습니다. 문제 해결됨! Quine의 요점은 자연 언어가 실질적인 사용에 편리하게 만들어 졌기 때문에 지저분하거나 적어도 복잡하다고 말하는 것이었지만 철학자와 논리 학자는 올바른 방식으로 이해함으로써 명확성을 가져와야합니다. 참조 투명성은 그러한 것을 가져 오는 데 사용되는 도구입니다. 의미의 명확성.

이 모든 것이 프로그래밍과 어떤 관련이 있습니까? 실제로는별로 많지 않습니다. 우리가 말했듯이, 참조 투명성은 지정에서 언어를 이해하는 데 사용되는 도구입니다. 의미. 크리스토퍼 스트래치, 프로그래밍 언어 의미론 분야를 설립 한 사람은 그의 의미에 대한 연구에서 그것을 사용했습니다. 그의 기초 논문 "프로그래밍 언어의 기본 개념"웹에서 사용할 수 있습니다. 그것은 아름다운 종이이며 모두가 그것을 읽고 이해할 수 있습니다. 그래서 그렇게 해주세요. 당신은 많은 깨달을 것입니다. 그는이 단락에서"참조 투명성 "이라는 용어를 소개합니다.

표현의 가장 유용한 특성 중 하나는 quine 참조 투명성에 의해 호출되는 것입니다. 본질적으로 이것은 우리가 하위 표현을 포함하는 표현식의 가치를 찾으려면 하위 표현에 대해 알아야 할 유일한 것은 그 가치라는 것을 의미합니다. 내부 구조, 구성 요소의 숫자 및 특성, 평가 순서 또는 작성된 잉크 색상과 같은 하위 표현의 다른 특징은 메인의 가치와 관련이 없습니다. 표현.

"본질적"의 사용은 Strachey가 간단한 용어로 설명하기 위해 그것을 역설적으로 제시하고 있음을 시사합니다. 기능적 프로그래머는이 단락을 자신의 방식으로 이해하는 것 같습니다. 논문에는 9 개의 다른 "참조 투명성"이 있지만 다른 사람들은 다른 사람에 대해서는 신경 쓰지 않는 것 같습니다. 실제로 Strachey의 전체 논문은의 의미를 설명하는 데 전념합니다. 필수 프로그래밍 언어. 그러나 오늘날 기능 프로그래머는 필수 프로그래밍 언어가 ~ 아니다 참조적으로 투명합니다. Strachey는 그의 무덤을 돌릴 것입니다.

우리는 상황을 구제 할 수 있습니다. 우리는 자연 언어가 실질적인 용도로 편리하게 만들어 졌기 때문에 "지저분하거나 적어도 복잡하다"고 말했다. 프로그래밍 언어는 같은 방식입니다. 그들은 실제 용도로 편리하게 만들어 졌기 때문에 "지저분하거나 적어도 복잡합니다". 그렇다고해서 그들이 우리를 혼동해야한다는 의미는 아닙니다. 그들은 우리가 의미의 명확성을 갖도록 참조적으로 투명한 메타 언어를 사용하여 올바른 방법을 이해해야합니다. 내가 인용 한 논문에서 Strachey는 정확히 그렇게합니다. 그는 필수 프로그래밍 언어를 기본 개념으로 나누어서 명확한 프로그래밍 언어의 의미를 설명하며, 어느 곳에서나 명확성을 잃지 않습니다. 그의 분석의 중요한 부분은 프로그래밍 언어의 표현에 두 가지 종류의 "값"이 있음을 지적하는 것입니다. l- 값 그리고 r- 값. Strachey의 논문 이전에, 이것은 이해되지 않았으며 혼란은 최고를 지배했습니다. 오늘날 C의 정의는 일상적으로 언급하고 모든 C 프로그래머는 그 차이를 이해합니다. (다른 언어의 프로그래머가 그것을 똑같이 잘 이해하는지 여부는 말하기 어렵습니다.)

Quine과 Strachey는 어떤 형태의 상황에 의존하는 언어 구성의 의미에 관심이있었습니다. 예를 들어, 우리의 사례 "에딘버러는 1999 년 이래로 스코틀랜드의 수도"가 "스코틀랜드의 자본"이 고려되는 시간에 달려 있다는 사실을 나타냅니다. 이러한 맥락 의존성은 자연 언어와 프로그래밍 언어 모두에서 현실입니다. 기능 프로그래밍에서도 자유 및 바인딩 변수는 그들이 나타나는 컨텍스트와 관련하여 해석되어야합니다. 어떤 종류의 모든 종류의 참조 투명성의 컨텍스트 의존성은 어떤 식 으로든 참조 투명성을 다른 방식으로합니다. 그들이 의존하는 맥락에 관계없이 용어의 의미를 이해하려고하면 다시 혼란스러워집니다. Quine은 모달 논리의 의미에 관심이있었습니다. 그는 그것을 가졌다 모달 로직 참조적으로 불투명했으며 참조 투명한 프레임 워크 (예를 들어, 필요성에 대한 필요성)로 변환하여 정리해야합니다. 그는이 논쟁을 크게 잃었다. 논리 학자와 철학자 모두 Kripke의 가능한 세계 의미론이 완벽하게 적절하다는 것을 발견했습니다. 비슷한 상황도 필수 프로그래밍과 함께 통치합니다. Strachey와 상점 의존성에 의해 설명 된 국가 의존성은 Reynolds (Kripke의 가능한 세계 의미와 유사한 방식으로)가 완벽하게 적합합니다. 기능적 프로그래머는이 연구를 많이 알지 못합니다. 참조 투명성에 대한 그들의 아이디어는 큰 소금 한 알로 가져와야합니다.

추가 참고 : 위의 예는 "스코틀랜드의 자본"과 같은 간단한 문구가 여러 수준의 의미를 가지고 있음을 보여줍니다. 한 수준에서, 우리는 현재의 자본에 대해 이야기하고있을 것입니다. 다른 수준에서, 우리는 스코틀랜드가 시간이 지남에 따라 가질 수있는 모든 가능한 수도에 대해 이야기 할 수 있습니다. 우리는 특정 컨텍스트와 "축소"를 "축소"하여 정상적인 실습에서 모든 맥락을 쉽게 파악할 수 있습니다. 자연어의 효율성은 우리의 능력을 사용합니다. 필수 프로그래밍 언어는 매우 효율적입니다. 변수를 사용할 수 있습니다 엑스 과제의 오른쪽 ( r- 값) 특정 상태에서 그 가치에 대해 이야기합니다. 또는 우리는 그것에 대해 이야기 할 수 있습니다 l- 값 모든 주에 걸쳐 있습니다. 사람들은 그런 것들에 거의 혼란스러워하지 않습니다. 그러나, 그들은 언어 구성에 내재 된 모든 의미의 모든 계층을 정확하게 설명 할 수 있거나 없을 수 있습니다. 그러한 의미의 모든 층이 반드시 '명백한'것은 아니며, 과학을 제대로 연구하는 것은 과학의 문제입니다. 그러나 그러한 계층의 의미를 설명하는 평범한 사람들의 부적합성은 그들이 그들에 대해 혼란스러워한다는 것을 의미하지는 않습니다.

아래의 별도의 "PostScript"는이 논의를 기능적 및 명령적인 프로그래밍의 문제와 관련이 있습니다..

다른 팁

참조 투명성,일반적으로 사용되는 용어에서 프로그래밍,즉 주어진 함수는 입력 가치,당신은 항상 동일한 출력.는 말이 없이 외부 국가에 사용되는 기능입니다.

예를 들어 여기에 참조 투명한 기능:

int plusOne(int x)
{
  return x+1;
}

참조 투명한 기능은 지정된 입력 기능을,당신은 그것을 대체할 수 있으로 대신 값의 함수를 호출.그래서 대신 전화 plusOne 매개 변수의 5,우리 그냥 바꾸는 것 6.

또 다른 좋은 예입니다 수학에서 일반적입니다.수학에 주는 함수는 입력 가치,그것은 항상 지도 동일한 값을 출력합니다.f(x)=x+1 입니다.따라서 기능을 수학에서는 referentially 투명합니다.

이 개념은 중요한 연구는 것을 의미하기 때문에 있을 때 referentially 투명한 기능,그것은 자기 쉬운 자동적인 병렬화 및 캐싱이 가능합니다.

참조 투명도를 사용되는 항상에 기능적인 언어는 다음과 같이터베이스를 저장합니다.

--

에 대조의 개념이있 참조 불투명을 의미한다.이것은 반대입니다.함수를 호출하지 않을 수도 있습과 동일한 출력.

//global G
int G = 10;

int plusG(int x)
{//G can be modified externally returning different values.
  return x + G;
}

또 다른 예를 들어,회원이 기능에 있는 객체 지향 프로그래밍 언어입니다.회원 기능 일반적으로 운영하에 그것의 구성원 변수에 따라서는 것 참조 불투명합니다.회원 기능을 수 있지만 물론 referentially 투명합니다.

또 다른 예로 읽는 함수에서 텍스트 파일로 출력을 인쇄합니다.이 외부 텍스트 파일로 언제든지 변경 될 수 있습니다 그래서 기능을 것 referentially 불투명합니다.

참조적으로 투명한 기능은 입력에만 의존하는 기능입니다.

이것은 3 월 25 일부터 내 답변에 대한 포스트 스크립트입니다.

기능적 프로그래머의 참조 투명성에 대한 아이디어는 세 가지 방법으로 표준 개념과 다른 것으로 보입니다.

  • 철학자/논리 학자는 "참조", "표시", "DesignAtum"및 "와 같은 용어를 사용하는 반면베 데우 툰"(Frege의 독일어), 기능적 프로그래머는"값 "이라는 용어를 사용합니다. Landin과 Strachey가 도입 한 용어 단순화만으로도 순진한 방식으로 사용될 때 큰 차이를 만드는 것 같습니다.)

  • 기능적 프로그래머는 이러한 "값"이 외부가 아닌 프로그래밍 언어 내에 존재한다고 믿는 것 같습니다. 이렇게하면 철학자와 프로그래밍 언어 의미론자들과 다릅니다.

  • 그들은 이러한 "가치"가 평가에 의해 얻어야한다고 믿는 것 같습니다.

예를 들어, Wikipedia 기사의 기사입니다 참조 투명성 오늘 아침 :

표현은 프로그램의 동작을 변경하지 않고 값으로 대체 될 수 있다면 표현이 참조적이라고합니다 (즉, 동일한 효과와 동일한 입력에 대한 출력을 갖는 프로그램을 생성).

이것은 철학자/논리 학자의 말과 완전히 차이가 있습니다. 그들은 해당 컨텍스트의 표현이 다른 사람으로 대체 될 수 있다면 문맥이 참조적이거나 참조적으로 투명하다고 말합니다. 표현 그것은 같은 것을 말합니다 (a 핵심 표현). 이 철학자/논리 학자는 누구입니까? 여기에는 포함됩니다 FREGE, 러셀, 화이트 헤드, 카르 냅, Quine, 교회 그리고 수많은 다른 사람들. 그들 각각은 우뚝 솟은 인물입니다. 이 논리 학자들의 결합 된 지적 힘은 지구를 산산조각 내고 있습니다. 그들 모두는 공식 언어 외부에 존재하며 언어 내 표현이 말할 수 있다는 입장에서 만장일치입니다. ~에 대한 그들을. 따라서 언어 내에서 할 수있는 모든 것은 동일한 엔티티를 지칭하는 다른 표현으로 한 표현을 대체하는 것입니다. 참조/표정 자체 하지 마라 언어 안에 존재합니다. 기능적 프로그래머가 왜 잘 확립 된 전통에서 벗어나는가?

프로그래밍 언어 시맨틱 주의자들이 그들을 잘못 인도했을 수도 있다고 가정 할 수도 있습니다. 그러나 그들은하지 않았습니다.

랜딘:

(a) 각 발현에는 중첩 하위 표현 구조가 있습니다. (b) 각 서브 표현 무언가를 나타냅니다 (일반적으로 숫자, 진실 가치 또는 수치 함수), (c) 표현이 표시되는 것은, 즉, "값"을 나타내는 것은 다른 특성이 아니라 하위 표현의 값에만 의존한다. [추가 강조

스토이:

표현에 중요한 유일한 것은 그 값이며, 모든 하위 표현을 대체 할 수 있습니다. 다른 가치가 동등합니다 추가 강조]. 또한, 표현식의 값은 특정 한계 내에서 발생할 때마다 동일합니다. "

새와 웨더:

표현식의 값은 구성 표현의 값 (있는 경우)에만 의존하며 이러한 하위 표현은 자유롭게 대체 될 수 있습니다. 다른 사람들은 같은 가치를 가지고 있습니다 추가 강조].

따라서 돌이켜 보면, "value"로 "참조"/"표시"를 대체함으로써 랜딘과 스트라 치의 노력은 "값"으로 대체되어 부상을 당했을 것입니다. "가치"를 듣 자마자 평가 과정을 생각하는 유혹이 있습니다. 비록 그것이 나타나는 것이 아니라는 것이 분명 할 수도 있지만, 평가가 "값"으로 생성되는 것을 "가치"로 생각하는 것도 마찬가지로 유혹적입니다. 그것이 제가 기능 프로그래머의 눈에 "참조 투명성"이라는 개념에 일어난 일입니다. 그러나 초기 시맨틱 주의자들이 말한 "가치"는 ~ 아니다 평가 결과 또는 함수 또는 그러한 것의 출력. 그것은 용어의 표시입니다.

일단 우리가 복잡한 수학적/개념적 대상으로서 표현 ( "참조"또는 "표시"의 소위 "가치"를 이해하면 모든 종류의 가능성이 열립니다.

  • Strachey는 명령 프로그래밍 언어로 변수를 해석했습니다 l- 값, 3 월 25 일 답변에서 언급했듯이 프로그래밍 언어의 구문 내에서 직접적인 표현이없는 정교한 개념 대상입니다.
  • 그는 또한 구문 내에서 "값"이 아닌 복잡한 수학적 객체의 또 다른 인스턴스 인 상태 간 기능과 같은 언어로 명령을 해석했습니다.
  • C의 부작용 함수 호출조차도 상태 변압기로 잘 정의 된 "값"을 상태와 값의 상태와 값 (기능적 프로그래머의 용어에서 소위 "모나드")에 맵핑하는 상태 변압기를 갖습니다.

기능적 프로그래머가 그러한 언어를 "참조적으로 투명하게"부르는 것을 꺼려하는 것은 단지 그러한 복잡한 수학적/개념적 대상을 "값"으로 인정하는 것을 꺼려한다는 것을 의미합니다. 다른 한편으로, 그들은 스테이트 변압기를 자신이 좋아하는 구문에 넣고 "모나드"와 같은 버즈 단어로 차려 입을 때 상태 변압기를 "가치"라고 완벽하게 기꺼이 생각합니다. 나는 그들이 "참조 투명성"에 대한 그들의 아이디어가 약간의 일관성을 가지고 있다고 그들에게 부여하더라도 그들이 완전히 일관성이 없다고 말해야합니다.

약간의 역사는 이러한 혼란이 어떻게 생겼는지에 대해 약간의 빛을 발할 수 있습니다. 1962 년에서 1967 년 사이의 기간은 Christopher Strachey에게 매우 집중적 인시기였습니다. 1962-65 년 사이에 그는 Maurice Wilkes의 연구 조교로 파트 타임으로 일했습니다. CPL로 알려진 프로그래밍 언어를 설계하고 구현했습니다. 이것은 필수 프로그래밍 언어 였지만 강력한 기능 프로그래밍 언어 기능도 갖추기위한 것이었다. 컨설팅 회사에서 Strachey의 직원 인 Landin은 Strachey의 프로그래밍 언어에 대한 관점에 큰 영향을 미쳤습니다. 랜드 마크 1965 종이에서 "다음 700 개의 프로그래밍 언어", Landin은 기능적 프로그래밍 언어를 엄청나게 홍보합니다 ( 실적 언어) 및 필수 프로그래밍 언어를 "반대 기신"으로 묘사합니다. 다음 토론에서 우리는 Strachey가 Landin의 강력한 입장에 대한 의문을 제기하는 것을 발견했습니다.

... DLS는 모든 언어의 하위 집합을 형성합니다. 그것들은 흥미로운 서브 세트이지만 익숙하지 않으면 사용하기에 불편합니다. 우리는 그들을 필요로합니다 현재 우리는 명령과 점프를 포함한 언어로 증거를 구성하는 방법을 모릅니다. [추가 강조

1965 년 Strachey는 옥스포드에서 독자의 입장을 취했으며 본질적으로 명령과 점프 이론을 개발하는 데 풀 타임으로 일한 것으로 보입니다. 1967 년까지 그는 이론을 준비했으며, 그는 자신의 과정에서 가르쳤다.프로그래밍 언어의 기본 개념"코펜하겐 여름 학교에서. 강의 노트는 출판되었지만"불행히도 팽창 편집으로 인해 절차는 결코 실현되지 않았다. 그러나 옥스포드에서 Strachey의 많은 작업과 마찬가지로이 논문은 영향력있는 사적인 순환을 가졌습니다. "(마틴 캠벨 켈리)

Strachey의 저술을 얻는 데 어려움이 있었기 때문에 사람들은 2 차원과 청각에 의존하면서 혼란이 전파 될 수있었습니다. 그러나 이제 그건 "기본 개념"웹에서 쉽게 구할 수 있습니다. 추측 작업을 위해 의지 할 필요가 없습니다. 우리는 그것을 읽고 Strachey가 무엇을 의미하는지에 대한 우리 자신의 마음을 구성해야합니다. 특히 :

  • 섹션 3.2에서 그는 "R- 값 참조 투명성"에 대해 이야기하는 "표현"을 다룹니다.
  • 그의 섹션 3.3은 "l-value 참조 투명성"에 대해 이야기하는 "명령"을 다룹니다.
  • 섹션 3.4.5에서 그는 "기능과 루틴"에 대해 이야기하고 "R- 값 컨텍스트에서 R- 값 참조 투명성의 출발은 표현을 여러 명령과 간단한 표현으로 분해하여 제거해야한다고 선언합니다. 이것은 논평의 주제 인 어려운 것으로 판명되었습니다. "

명령적인 프로그래머의 개념적 우주를 채우는 L- 값, R 값 및 기타 복잡한 물체의 구별을 이해하지 못한 "참조 투명성"에 대한 이야기는 근본적으로 오해됩니다.

표현식은 알고리즘을 변경하지 않고도 값으로 대체 할 수있는 경우 참조적으로 투명합니다. 동일한 입력에 동일한 효과와 출력을 갖는 알고리즘을 산출합니다.

참조적으로 투명한 기능은 수학적 함수처럼 작용하는 기능입니다. 동일한 입력이 주어지면 항상 동일한 출력을 생성합니다. 통과 된 상태는 수정되지 않았으며 함수의 상태가 없음을 의미합니다.

어원에 관심이 있다면 (즉,이 개념이 왜이 특정 이름을 가지고 있습니까?) 블로그 게시물 주제에. 이 용어는 철학자/논리 학자 Quine에서 나옵니다.

간결한 설명이 필요한 사람들을 위해 나는 하나를 위험에 빠뜨릴 것입니다 (그러나 아래 공개를 읽으십시오).

프로그래밍 언어의 참조 투명성은 평등 한 추론을 촉진합니다. 참조 투명성이 높을수록 더 쉽게 추론 할 수 있습니다. 예 : (의사) 함수 정의와 함께,

fx = x + x,

이 감소를 수행 할 수있는 곳에 너무 많은 제약을받지 않고이 정의의 범위에서 F (FO)를 FOO + FOO로 대체 할 수있는 편의성은 프로그래밍 언어의 참조 투명성의 양을 잘 나타내는 것입니다. 가지다.

예를 들어 FOO가 C 프로그래밍 의미에서 x ++ 인 경우이 감소를 안전하게 수행 할 수 없었습니다 (즉,이 감소를 수행하려면 시작한 동일한 프로그램으로 끝나지 않을 것입니다).

실제 프로그래밍 언어에서는 완벽한 참조 투명성을 보지 못하지만 기능적 프로그래머는 대부분의 것보다 더 관심을 갖습니다 (CF Haskell, 핵심 목표입니다).

(전체 공개 : 나는 기능적 프로그래머이므로 최고 답변으로 소금 한 알로이 설명을 받아야합니다.)

  1. 표현 형성학은 지정할 수있는 도메인을 구축하여 모델링 언어를 기반으로합니다. 가치.
  2. 기능적 프로그래머는이 용어를 사용합니다 언어의 재 작성 규칙을 기반으로 계산의 수렴을 설명합니다. 운영 의미론.

1에는 문제의 두 언어가 명확 해집니다.

  • 모델이 모델링되는 객체 언어
  • 모델링 언어, 메타 언어

2에서는 물체와 금속 언어의 친밀감 덕분에 혼란 스러울 수 있습니다.

언어 구현 자로서, 나는이 차이점을 끊임없이 기억해야한다는 것을 알았습니다.

그래서 Reddy 교수는 당신을 그렇게 말할 수 있습니다 :-)

기능 프로그래밍 및 의미론의 맥락에서 용어 참조 투명성 참조적으로 투명하지 않습니다.

다음 답변은 논란의 여지가있는 1 차 및 세 번째 답변을 추가하고 자격을 갖추고 싶습니다.

표현이 일부 참조를 나타내거나 지칭하도록 허락합시다. 그러나 의문은 이러한 표현 자체의 일부로 표현의 일부로 동형으로 동형으로 인코딩 될 수 있는지 여부입니다. 예를 들어, 문자 번호 값은 산술 표현 세트의 하위 집합이며, 진실 값은 부울 표현식 세트의 하위 집합입니다. 아이디어는 그 값에 대한 표현을 평가하는 것입니다 (하나가있는 경우). 따라서 'value'라는 단어는 표현 세트의 유명한 요소를 나타낼 수 있습니다. 그러나 지시자와 가치 사이에 동형 (bijection)이 있다면 우리가 그것들이 같은 것이라고 말할 수 있습니다. (이것은 언급 한 의미의 분야에서 입증 된 바와 같이 참조와 동형을 정의하기 위해주의해야합니다. 3 번째 답변에 대해 언급 된 예를 대수 데이터 유형 정의로 표현합니다. data Nat = Zero | Suc Nat 자연수 세트에 예상대로 일치하지 않습니다.)

글을 쓰자 E[·] 구멍이있는 표현의 경우, 일부 분기에서도 '컨텍스트'로 알려져 있습니다. C- 유사 표현식에 대한 두 가지 컨텍스트 예는 다음과 같습니다 [·]+1 그리고[·]++.

글을 쓰자 [[·]] 표현을 취하고 (구멍이 없음) 의미를 제공하는 우주에서 그 의미 (참조, 표시 등)를 전달하는 함수. (나는 표현 시맨틱 분야에서 표기법을 빌리고 있습니다.)

다음과 같이 Quine의 정의를 다소 공식적으로 조정하겠습니다. E[·]두 가지 표현이 주어지면 참조적으로 투명하게 IFF입니다 E1 그리고 E2 (거기에 구멍이 없음) [[E1]] = [[E2]] (즉, 표현은 동일한 지시자를/참조하는 것입니다) 그러면 그렇습니다. [[E[E1]]] = [[E[E2]]] (즉, 구멍을 채우십시오 E1 또는 E2 동일한 지시자를 나타내는 표현이 있습니다).

Leibniz의 평등을 대체하는 규칙은 일반적으로 'if'로 표현됩니다.E1 = E2 그 다음에 E[E1] = E[E2]', 그것은 그렇게 말합니다 E[·] 기능입니다. 함수 (또는 그 문제에 대해 함수를 계산하는 프로그램)는 소스에서 대상으로의 매핑이므로 각 소스 요소에 최대 하나의 대상 요소가 있습니다. 비 결정적 기능은 잘못된 이름, 그들은 관계, 세트를 전달하는 기능 등입니다. Leibniz의 규칙에서 평등이있는 경우 = 그렇다면 이중 껍질은 단순히 당연한 것으로 간주되고 피해를 입습니다. 따라서 참조적으로 투명한 컨텍스트는 기능입니다. Leibniz의 규칙은 정식 추론의 주요 요소이므로, 정식 추론은 확실히 참조 투명성과 관련이 있습니다.

하지만 [[·]] 표현식에서 표정으로의 함수이며, 표현에서 '값'으로의 함수 일 수 있습니다. [[·]] 평가로 이해할 수 있습니다.

이제 E1 표현입니다 E2 표현, 가치 및 평가 측면에서 참조 투명성을 정의 할 때 대부분의 사람들이 생각하는 가치입니다. 그러나이 페이지의 첫 번째와 세 번째 답변에서 알 수 있듯이 이것은 부정확 한 정의입니다.

다음과 같은 상황의 문제 [·]++ 부작용은 아니지만 그 값은 그 의미에 동맥 적으로 정의되지 않습니다. 함수는 값이 아니며 (기능에 대한 포인터는) 기능 프로그래밍 언어에서는 그렇지 않습니다. Landin, Strachey 및 Ponotational Semantics의 개척자들은 기능 세계를 사용하여 의미를 제공하는 데 매우 영리했습니다.

명령형 C와 같은 언어의 경우 (대략적으로) 함수를 사용하여 표현에 의미론을 제공 할 수 있습니다. [[·]] : Expression -> (State -> State x Value).

Value 서브 세트입니다 Expression. State 쌍 (식별자, 값)을 포함합니다. 시맨틱 함수는 표현식을 취하고 업데이트 된 상태 및 값과 함께 현재 상태에서 쌍으로의 함수를 의미합니다. 예를 들어, [[x]] 현재 상태에서 첫 번째 구성 요소가 현재 상태이고 두 번째 구성 요소가 x의 값 인 쌍으로의 함수입니다. 대조적으로, [[x++]] 첫 번째 구성 요소가 X의 값이 증가하는 상태이고 두 번째 구성 요소는 그 값입니다. 이런 의미에서 맥락 [·]++ 참조적으로 투명한 iff 위에서 주어진 정의를 만족시킵니다.

기능적 프로그래머는 자연스럽게 회복한다는 의미에서 참조 투명성을 사용할 수 있다고 생각합니다. [[·]] 표현식에서 값으로의 함수로. 함수는 일류 값이며 상태는 또한 값이 아니라 가치가 될 수 있습니다. State Monad는 (부분적으로) 주를 통과 (또는 나사)하기위한 깨끗한 메커니즘입니다.

이 개념의"의미"뭔가가 일어나는 마음에서의 관찰자.따라서,동일한"참"에게 다른 것들을 의미할 수 있습니다.그래서 예를 들어 우리는 에든버러 disambiguation 페이지에 Wikipedia.

관련된 문제를 보여줄 수 있는 최대의 컨텍스트에서 프로그래밍 수 있습 다형성이다.

아마도 우리는 이름이 있어야한의 특별한 경우 다형성(또는 아마도 주조)에 대한 우리의 목적은 각기 다른 다형 경우에는 같은 의미입니다(로 반대되고 비슷합니다.예를 들어,1--될 수있는 표현을 사용하여 정수 유형,또는 복잡한 형식 또는 다른 다양한 유형--치료할 수 있습 다형적으로).

나는 정의를 찾았다 참조 투명성 책에서 "컴퓨터 프로그램의 구조 및 구현"(마법사 책)는 방법에 대한 설명에 의해 보완되기 때문에 유용합니다. 참조 투명성 소개하여 위반됩니다 할당 작업. 제목에 대해 만든 다음 슬라이드 데크를 확인하십시오. https://www.slideshare.net/pjschwarz/introducting-assignment-invalidates-the-substitution-model-of-evaluation-biolates- referential-transponce-as-wizard-book

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top