나는 이런 일이 발생하지 않았으며 방금 좀 더 자세히 살펴 보았습니다.
기본적으로이 기능을 구현하지 않는 이유가 있습니다. 패턴 일치 전에 입력의 모든 조합을 생성해야하며 그렇지 않으면 일치 항목의 전체 제품 간 가치를 생성해야합니다.
일반적인 구현 방법은 두 패턴 (이진 경우)을 쓰는 것, 즉 C or $X
과 $X or C
의 패턴을 모두 작성하는 것입니다.
데이터의 기본 구성 (일반적으로 튜플 임)에 따라이 패턴 일치는 튜플 요소의 순서를 재정렬하는 것을 포함합니다. 특히 터프한 환경에서 그렇습니다. 그 대신에 목록이라면, 당신은 심지어 더 흔들리는 땅에 있습니다. 덧붙여
, 난 당신이 근본적으로 원하는 작업이 세트에 연결되지 않은 노조 패턴이라고 생각 예 :
foo (Or ({C} disjointUnion {X})) = ...
모든 세부 사항 세트를 다루는 내가 본 유일한 프로그래밍 환경이 될 것이다 이자벨/HOL , 그리고 나는 여전히 당신이 그들과 패턴 매치를 만들 수 있는지 확신하지 못한다.
편집 : 그것은 당신이 일관되게 사용된다는 것을 증명해야 다음을 제외하고, 복잡한 비 생성자 패턴을 정의 할 것이다 (오히려 fun
이상) 이사벨의 function
기능과 같은, 당신은 더 이상 코드 생성기를 사용할 수 없습니다.
편집 2 : 쿼리와 일치하는 것이 허용되었다 $X
형태 B | C | $X
,의 동안
내 용어, 양식 A | B | C | D
의했다 : 나는 n
교환 법칙, 결합 및 전이 사업자를 통해 비슷한 기능을 구현하는 방법이이었다 0 개 이상. 나는 lexographic 순서를 사용하여 이들을 미리 정렬 했으므로 변수는 항상 마지막 위치에서 발생했습니다.
먼저 모든 쌍방향 일치를 구성하고 지금은 변수를 무시하고 규칙에 따라 일치하는 것을 기록합니다.이은으로 된 그래프로 처리하는 경우
{ (B,B), (C,C) }
, 당신은 본질적으로 perfect marriage 문제를하고 있습니다. 이를 찾는 빠른 알고리즘이 있습니다.
다음 (예, A
및 D
에서) 관계의 왼쪽에 나타나지 않는 모든 것을 수집하고 변수 $X
로 물건, 당신의 이상형, 당신이 하나를 찾을 가정 완전한. 분명히 여기서 모든 단계에서 실패 할 수 있지만, RHS에 변수가 없거나 LHS에 일치하는 (전혀 일치하지 않는) 생성자가있는 경우 대부분 발생합니다.
조금 혼란 스럽다면 죄송합니다. 이 코드를 작성한 지 오래되었지만이 코드가 도움이되기를 바랍니다.
레코드의 경우이 은 일 수 있습니다. 모든 경우에 좋은 방법은 아닙니다. 나는 서브 테임 (즉, 단순한 평등이 아니라)에 '매치'라는 매우 복잡한 개념을 가지고 있었기 때문에 세트 나 아무것도 제작하지 않았을 것입니다. 어쩌면 그것은 당신의 경우에 작동 할 것이고 분리 된 노동 조합을 직접 계산할 수 있습니다.
은 내가 ML 패턴 매칭 대 프롤로그 패턴 매칭의 당신의 융합에 동의 모르겠어요. ML 패턴 일치는 순전히 통사론이며, Prolog에서는 이것이 사실이라고 생각하지 않습니다. – Gian
나는 그것들이 똑같은 것을 말하는 것이 아니라, 그들이 엄격한 순서로 요소들의 비교를 공통적으로 갖는다는 것을 말하고있다. – rwallace
나는 오터 (Otter)와 같은 소프트웨어를 증명하는 헌신적 인 이론은 이미 논리적 공식을 일반 형식으로 배치하고 절을 작성 및 검증을위한 O (n log n) 시간의 비용을 요하는 집합 데이터 구조로 취급한다고 가정합니다. 사실, 나는 그들이 associativity 및 commutativity 같은 속성에 대한 작업에 대한 최적화를 미리 프로그래밍했다고 가정합니다. –