PROLOG Turing이 완성되는 이유는 무엇입니까?


15

다음과 같이 튜링 머신을 시뮬레이트하는 프로그램을 구성하여 PROLOG가 튜링 완료된 것으로 입증 될 수 있음을 알고 있습니다.

turing(Tape0, Tape) :-
    perform(q0, [], Ls, Tape0, Rs),
    reverse(Ls, Ls1),
    append(Ls1, Rs, Tape).

perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
    symbol(Rs0, Sym, RsRest),
    once(rule(Q0, Sym, Q1, NewSym, Action)),
    action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
    perform(Q1, Ls1, Ls, Rs1, Rs).

symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).

action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).

left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).

출처

그러나 PROLOG 언어의 어느 부분이 Turing 완전성을 잃지 않고 제거 할 수 있는지 궁금합니다 (기능 기호, 절 오버로드, 재귀, 통일). 기능 기호 자체가 튜링 완료 되었습니까?


4
코드 스 니펫에 사용 된 프롤로그의 기능 만 필요합니다.
Yuval Filmus

1
이 질문을 보셨습니까 ?
Raphael

2
@YuvalFilmus : PROLOG에서 튜링 머신을 프로그래밍하는 다른 방법이있을 수 있습니다.
Lenar Hoyt

답변:


18

Turing-completeness는 무제한 "크기"의 응답 또는 중간 값을 구성하는 기능과 무제한 횟수를 반복하거나 재귀하는 기능에 의존한다는 것은 상당히 신뢰할만한 경험 법칙입니다. 이 두 가지가 있다면 Turing-completeness 일 것입니다. (더 구체적으로 Peano 산술을 구성 할 수 있다면 분명히 Turing-completeness가 있습니다!)

이미 산술을 제거했다고 가정 해 봅시다. 우리는 또한 같은 비 논리적 기능이없는 것으로 가정합니다 atom_chars, assert일반적으로 헛소리를 활성화하고 등등을.

함수 기호를 제거하면 무제한 크기의 응답이나 중간체를 구성 할 수 없습니다. 프로그램과 쿼리에 나타나는 원자 만 사용할 수 있습니다. 결과적으로 모든 쿼리에 가능한 모든 솔루션 세트는 유한 하므로 프로그램 / 쿼리의 최소 고정 지점을 사용하면 항상 종료됩니다. 데이터 로그 (Prolog 기반의 관계형 데이터베이스 쿼리 언어)는이 원칙에 따라 작동합니다.

마찬가지로 프롤로그를 기본 재귀로만 제한 한 경우 (회귀하지 않는 재귀 포함) 수행 할 수있는 재귀의 양은 쿼리 크기에 의해 제한되므로 모든 계산이 종료됩니다. 따라서 Turing-completeness에 대한 일반적인 재귀가 필요합니다.

물론 일반적인 재귀가있는 경우 일반 통일 (구성 및 최상위 패턴 일치로 충분), 부정 및 컷을 포함하여 전체 기능을 잘라 내고 튜링 완성도를 유지할 수 있습니다.



아주 좋은 지적입니다. 나는 정량화에 대해 생각하지 않았지만 실제로는 또 다른 접근법입니다.
가명

0

@Pseudonym의 탁월한 답변을 완성하고 마지막 질문 "기능 기호 자체가 Turing complete?"를 참조하십시오.

당신은 아마 의미 할 것입니다 : 함수 심볼로만 만들어진 언어가 Turing-Complete이 될 수 있습니까?

대답은 그렇습니다. ML 및 Haskell과 같은 기능적 프로그래밍 언어를 생각해보십시오.

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