용어 재 작성과 패턴 일치의 차이점은 무엇입니까?


25

Lambda the Ultimate에 대한 응답없었기 때문에 여기서 다시 시도합니다. 예를 들어 용어 재 작성 시스템 은 자동 계산에서 상징적 계산을 입증하고 물론 공식 문법을 정의하는 데 사용됩니다. 다시 쓰기라는 용어를 기반으로 한 프로그래밍 언어가 있지만 개념을 더 잘 이해하는 한 패턴 일치라고 합니다. 패턴 일치는 기능적 언어에서 많이 사용됩니다. 배리 제이 (Barry Jay)는 패턴 미적분학 ( pattern calculus ) 이라는 전체 이론을 만들었지 만, 간단히 용어 재 작성에 대해서만 언급합니다. 나는 그것들이 모두 동일한 기본 아이디어를 의미한다고 생각합니다. 따라서 용어 재 작성패턴 일치를 동의어로 사용할 수 있습니까?

답변:


26

이 두 가지 개념을 보는 한 가지 방법은 패턴 일치가 생성자에 대한 차별을 결합하고 용어를 동시에 (단어 조각을 선택하고 로컬로 명명하는 한편) 안전하고 간결하며 효율적으로 만드는 프로그래밍 언어의 기능 이라고 말하는 것입니다 . 패턴 매칭에 대한 연구는 일반적으로 구현 효율성, 예를 들어 매칭 메커니즘이 수행해야하는 비교 횟수를 최소화하는 방법에 중점을 둡니다.

반대로, 용어 재 작성은 구문 표현의 하위 용어 (보다 정확하게는 일부 변수 집합에 대한 용어 대수 요소)를 다른 용어로 대체하는 광범위한 (잠재적으로 비 결정적) 방법을 조사 하는 일반적인 계산 모델입니다 . 용어 재 작성 시스템에 대한 연구는 일반적으로 합류, 결정론 및 종료와 같은 재 작성 시스템의 추상적 특성에 관한 것입니다.보다 구체적으로, 재 작성 시스템의 대수 연산에 의해 이러한 특성이 어떻게 보존되는지, 즉 이러한 특성이 어느 정도까지 구성되는지에 관한 것입니다.

분명히 둘 사이에 개념적 겹침이 있으며 구별은 기술적 인 것이 아니라 전통적인 정도입니다. 기술적 인 차이는 재기록 용어 (즉, 룰은 임의의 상황에 따라 일어날 것이다 를 유도는 재기록 C를 [ L σ ] C [ R의 σ ] 임의의 상황에 대한 C [ . ] 및 치환 σ(,아르 자형)기음[σ]기음[아르 자형σ]기음[.]σ), Haskell, OCaml 또는 Scala와 같은 현대 언어의 패턴 일치는 용어의 맨 위에 '쓰기'만 제공합니다. 제이의 패턴 미적분학에서도이 제한이 부과된다고 생각합니다. 이 제한의 의미를 설명하겠습니다. OCaml, Haskell, Scala sense에서 패턴 일치를 사용하면 다음과 같은 것을 말할 수 없습니다.

match M with
   | C[ x :: _ ]  -> printf "%i ...\n" x
   | C[ [] ] -> printf "[]"

C[.]여기 가 무엇입니까 ? 그것은 하나의 홀드 컨텍스트에 걸쳐있는 변수이어야합니다. 그러나 OCaml, Haskell 또는 Scala와 같은 언어는 프로그래머에게 임의 (단일 홀드) 컨텍스트 범위의 변수를 제공하지 않고 값 범위의 변수 만 제공합니다. 즉, 이러한 언어에서는 용어의 임의 위치에서 패턴 일치를 수행 할 수 없습니다. 패턴의 루트에서 관심있는 부분까지의 경로를 항상 지정해야합니다.이 제한을 적용한 주요 이유는 패턴 일치가 결정적이지 않기 때문입니다. 용어가 패턴과 일치 할 수 있기 때문입니다. 한 가지 이상의 방법. 예를 들어, 용어 (true, [9,7,4], "hello", 7)는 그러한 문맥에 대해 범위가 C[7]있다고 가정 할 때 두 가지 방식으로 패턴과 일치 C[.]합니다.


11

나는 그것들을 동의어로 부르는 것이 옳지 않다고 생각한다. 연구 및 구현 측면에서 약간의 중복이 있습니다. 저는 Jay의 작업에 전혀 익숙하지 않으며 용어 재 작성 시스템에 대해서는 어느 정도 익숙하기 때문에 무언가 빠져있을 수도 있습니다.

일반적으로 패턴 일치는 다음과 같은 문제를 해결합니다. 일부 구조 (트리 또는 목록 또는 다중 집합)가 있고 구조가 패턴 (또는 여러 패턴 중 하나)과 일치하는지 확인하려고합니다. 용어 재 작성 시스템에서 용어가 패턴과 일치한다는 사실은 용어가 다른 용어로 재 작성 될 수 있지만 동의어는 재 작성이 아니기 때문에이 질문은 용어 재 작성과 관련이 있습니다. (다시 쓰기로 패턴 일치에 대한 공식이있을 수 있습니다. "용어를 제공하면 패턴과 일치하도록 다시 작성할 수 있습니까?")

기능적 프로그래밍 언어에서의 패턴 매칭은 포커싱 측면에서 논리적으로 해석됩니다 (예 : Krishnaswami의 "패턴 매칭에 집중" 참조 ). 반면에 용어 재 작성 시스템은 대부분의 함수형 프로그래밍 언어 (ML 또는 Haskell의 다중 집합과 비교할 수 없음)에는없는 일부 수식 속성과 일치하는 모듈로를 수행합니다. 그러나 함수형 언어로 모듈로 방정식 속성을 일치시켜야하는 근본적인 이유는 없습니다.


1
답변 주셔서 감사합니다. 나는 일반적으로 패턴 일치용어 재 작성 과 동의어가 아니라 더 기본적 이라는 것에 동의합니다 . 그러나 누군가가 계산 능력을 가진 시스템이 패턴 매칭을 기반으로한다고 말하면 계산 능력이있는 시스템을 다시 쓰는 용어와의 차이점을 알 수 없습니다. "논리 해석이있다"와 "일부 방정식 속성"의 차이를 더 예시 할 수 있습니까?
Jakob

"계산 능력이있는 용어 재 작성 시스템과의 차이점을 볼 수 없습니다"-이것이 무엇을 의미하는지 잘 모르겠습니다. Martin이 말했듯이 용어 재 작성은 일반적인 계산 모델이며 패턴 일치는 계산 모델이 아닌 기능입니다.
Rob Simmons

"논리 해석이있다"와 "일부 방정식 속성"의 차이를 더 예시 할 수 있습니까? -얕은 차이는 없습니다. 속성, 사과, 오렌지 만 다릅니다. 이 두 가지 사이의 실제 관계는 매우 깊은 연구 질문으로 판명 될 수 있다고 생각합니다! 깊은 추론으로 펀칭-alessio.guglielmi.name/res/cos 참조 -아마도 의도 한 것.
Rob Simmons

1

(나는 이것을 주석으로 쓰고 싶지만 현재는 할 수 없습니다.)

내가 틀렸다면 정정하십시오. 그러나 내가 이해하는 한, Martin Berger가 그의 훌륭한 대답에서 말한 것 외에도 패턴 일치와 용어 다시 쓰기의 또 다른 차이점은 패턴 일치 규칙이 고정 된 순서로 제공된다는 것입니다 (예 : 용어 재 작성 규칙에서는 이것이 반드시 그런 것은 아닙니다. 예상대로이 기능은 규칙의 동작 (특히 종료)을 고려할 때 많은 차이를 만들 수 있습니다 (예 : "Hastell 소개, 버전 98"섹션 4.2 ). 예 : "하스켈 배우기" ).

이론을 재 작성의 지식이 사람은 마틴 버거에 동의한다는 점에서 공평 날 것으로 보인다, (예를 들어, 방법을 정확하게 적합 이러한 비교를 입력합니까?) 그에 대해 말하기를 더해야하지만 것 포함하는 것으로 볼 수 있습니다 재 작성 용어 패턴 일치 (적어도 Haskell과 같은 언어로 구현 됨), 둘 다 용어 관련 규칙 만 사용하는 장치로 (건조하게) 볼 수있는 정도.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.