데이터 병렬 연산자와 함께 전체 기능 언어를 사용하여 표현할 수있는 알고리즘은 무엇입니까?


11

데이터 유형 만 숫자 형 스칼라와 임의의 배열 배열 인 함수형 프로그래밍 언어를 상상해보십시오. 이 언어에는 무제한 반복 수단이 없으므로 다음은 허용되지 않습니다.

  • 명시 적 루프 (어쨌든 부작용없이 많이 사용하지 않음)
  • 재귀
  • 임의의 일류 함수 (y-combinator 없음)

그러나이 언어에는 다음이 있습니다.

  • 최상위 기능
  • 어휘 범위가 지정된 let 바인딩
  • 분기 제어 흐름
  • 일반적인 스칼라 수학 및 논리 함수
  • fill (n, x)와 같은 간단한 배열 생성자는 동일한 값 x로 n 요소 배열을 만듭니다.
  • 가장 중요한 것은 병렬 구조화 된 반복 (예 : 맵, 축소, 스캔, 모든 쌍)을 수행하는 제한된 상위 연산자 세트입니다.

데이터 병렬 연산자에 대해보다 구체적으로 설명하려면 다음을 수행하십시오.

  • y =지도 (f, x) => y [i] = f [i]
  • 일부 순열에 대해 y = 감소 (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ...)))
  • y = 스캔 (f, a, x) => y [i] = 감소 (f, a, y [0 ... i-1])
  • y = allpairs (f, x, y) => y [i, j] = f (x [i], y [j])

우리는 다른 연산자도 가질 수 있지만, 다항식 실행 시간을 가져야하고, 합리적인 데이터 병렬 계산 모델 하에서 구현 가능해야하며, 대부분 다항식 공간에서 사용해야합니다.

이 언어로 표현할 수없는 구조는 다음과 같습니다.

while f(x) > tol:
    x <- update(x)   

이 시스템에서 무엇을 표현할 수 있습니까? FP의 검색 문제로만 제한됩니까? 모든 다항식 시간 알고리즘을 캡처 할 수 있습니까? 또한이 클래스에 대한 최소한의 연산자 세트가 있습니까?

답변:


7

이러한 아이디어를 진지하게 받아 들인 구 프로그래밍 언어 NESL 을보고 싶을 것 입니다. 이 언어는 컬렉션, 본질적으로 목록 및 목록 목록 등의 작업을 기반으로하지만 트리 및 그래프도 까다로운 인코딩을 통해 고려되었다고 생각합니다. 이 프로젝트에서 수행 된 일부 연구 (1990 년대 중반)는 귀하의 질문에 대한 답변을 제공 할 수 있습니다. 박사 학위 논문 (책으로 이용 가능) Guy E. Blelloch. 데이터 병렬 컴퓨팅을위한 벡터 모델. MIT Press, 1990은 몇 가지 해답을 제공 할 수 있습니다. 내가 본 이래 얼마 전에였습니다.

에 대한 작업 조류 Meertens 형식주의 언어처럼 (BMF)는도이 범주에 속하는 자선을 . Charity Wikipedia 페이지에서 언어는 Turing complete가 아니라 Ackermann의 기능을 표현할 수 있다고 말하는데, 이는 기본 재귀 이상의 기능을 의미합니다. BMF와 Charity는 모두 접기 및 스캔 (catamorphisms, anamorphisms 등)과 같은 연산자를 포함하며 Category Theory에 뿌리를두고 있습니다.

짧게, 부정확 한 대답은 당신이 꽤 많이 표현할 수 있다는 것입니다.


1
NESL은 완전한 언어가 아닙니다.
당 Vognsen

나는 NESL을 한동안 피상적으로 알고 있었지만 Blelloch의 논문 중 하나를 처음으로 자세히 읽었습니다. 팁 고마워. NESL은 Per Vognsen에서 알 수 있듯이 재귀를 허용한다는 점을 제외하고 위에서 설명한 언어와 매우 유사합니다.
Alex Rubinsteyn

또한 Blelloch의 기본 연산자 선택에 관심이 있습니다 : map, dist (나는 'fill'이라고 부르는 것과 동일하다고 생각합니다), 길이, 배열 읽기, 배열 쓰기, 스캔, 파티션, 평탄화. NESL의 프리미티브가 "완료"입니까, 아니면 데이터 병렬 구현을 사용하여 효율적으로 표현할 수없는 다른 작업이 있습니까?
Alex Rubinsteyn 5

2
재귀를 제거하면 특히 주름 등을 ​​고려할 때 꽤 표현력있는 언어가됩니다. 그렇다면 BMF와 그 이후의 작업을 살펴보면 더 흥미로울 것입니다. 죄송하지만이 지역의 최신 정보는 아닙니다.
Dave Clarke

7

내 다른 대답은 언어의 결함을 지적했습니다. 이 답변에서 나는 접는 언어와 접힌 언어의 공존 문제에 대해 더 자세하게 설명 할 것입니다. 그런 다음 해결책을 제안하고 P의 모든 문제 (실제로 더 많은 것)가이 확장 된 언어로 해결 될 수 있음을 보여줄 것입니다.

전체 언어로 접는 것은 목록을 소비합니다.

fold :: (a -> b -> b) -> b -> List a -> b

전체 언어로 펼치면 스트림이 생성되며 이는 잠재적으로 제한이 없습니다.

unfold :: (b -> Maybe (a, b)) -> b -> Stream a

불행히도 목록과 스트림은 다른 세계에 존재하므로 이러한 연산자를 구성 할 수 없습니다. 부분적으로 일치해야합니다.

stream :: List a -> Stream a
list :: Int -> Stream a -> List a

스트림 연산자는 목록을 제한된 스트림에 포함시킵니다. list 함수는 처음 n 개 요소 (또는 스트림이 더 일찍 종료되는 경우 더 적은 수)를 목록으로 추출합니다. 따라서 다음 방정식이 있습니다.

for all xs :: List a, xs == list (length xs) (stream xs)

효율성 최적화로서 스트림을 중간 데이터 구조로 완전히 잘라낼 수 있습니다.

unfoldList :: Int -> (b -> Maybe (a, b)) -> b -> List a

이제 다른 연산자가 원래 질문에 이미 암시되어 다항식 시간 알고리즘을 시뮬레이션 할 수 있다는 증거를 스케치하겠습니다.

정의에 따라 튜링 머신 M과 다항식 p가있을 때 언어 L은 P에 있습니다. 따라서 L에서 x의 멤버 자격은 M을 최대 p (n) 반복 (n = | x |)으로 실행하여 결정할 수 있습니다. 표준 인수에 의해, 반복 테이프 (k)에서 머신의 테이프 상태는 머신의 테이프가 무한하더라도 최대 2k + 1의 길이리스트로 인코딩 될 수있다.

이제 아이디어는 M의 전환을 목록에서 목록으로의 함수로 표현하는 것입니다. 전환 기능으로 초기 상태를 펼치면 기계가 실행됩니다. 이것은 일련의 목록을 생성합니다. L이 P에 있다고 가정하면 스트림에 p (n) 요소를 더 이상 보지 않아도됩니다. 따라서 우리는 함께 전개를 구성 할 수 있습니다list p(n) 유한 목록을 얻기 위해 . 마지막으로 결정 문제에 대한 답이 예인지 아닌지 확인하기 위해 그것을 접습니다.

보다 일반적으로 이것은 종료 시간이 언어로 계산 가능한 함수에 의해 제한 될 수있는 알고리즘이있을 때마다 시뮬레이션 할 수 있음을 보여줍니다. 이것은 또한 Ackermann의 기능과 같은 것을 시뮬레이션 할 수없는 이유를 시사합니다 : 그것은 자기 자신의 한계이기 때문에 닭고기와 계란 문제가 있습니다.


4

매우 짐작 된 언어입니다. 계승 함수를 프로그래밍하십시오.

fact 0 = 1
fact n = n * fact (n-1)

문제는 당신의 언어가 접히지 않고 전개되지 않는다는 것입니다. 계승을 표현하는 자연적인 방법은 n을 펼칠 때 목록 [1, 2, ..., n]에 펼치기를 구성하는 것입니다.

이 특정 언어 나 전체 기능 프로그래밍에 관심이 있습니까? 귀하의 언어는 다항식 알고리즘을 최대한 표현할 수 있습니다. 시스템 F (다형성 람다 미적분학)는 Ackermann의 기능과 같은 괴물을 쉽게 표현할 수 있습니다. 다항식 시간 알고리즘에 관심이 있어도 자연스럽게 표현하려면 수퍼 다항식 팔꿈치 공간이 자주 필요합니다.

편집 : Dave가 지적한 것처럼 NESL은 기능적인 데이터 병렬 프로그래밍 언어 중 하나이지만 전체와는 거리가 멀습니다 (시도하지 않음). APL 제품군은 진화의 병렬 트랙을 가지고 있으며 전체 대수 하위 집합 (고정 소수점 연산자는 제외)을 가지고 있습니다. 귀하의 질문의 초점이 완전 성인 경우 David Turner는 데이터 병렬 프로그래밍에 대해서는 특별히 언급하지 않았지만이 분야에서 좋은 논문을 작성했습니다.


죄송합니다. 펼치기 연산자가 없다는 것은 내 부분에 대한 감독입니다 ... 하나를 추가하려고했지만 게시물에 올리는 것을 잊었습니다. 필자는이 특정 언어에 관심이 없지만 데이터 병렬 계산의 표현력과 한계에 관심이 있습니다.
Alex Rubinsteyn

펼치기는 배열 값이 아닌 스트림 값이 자연 스럽습니다. 이는 엄격한 전체 언어의 핵심 curcuring의 기본 문제입니다.
당 Vognsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.