2013-02-21 2 views
2

아래 코드를 이해하는 데 문제가 있습니다.따르는 프롤로그 코드는 무엇을합니까?

append([1,2,3], Lst). 

사실, 돈, t는 결과 목록 Lst에를 추가하는 방법 1, 2 얻을 : 나는 다음과 입력이있는 경우
사람은 무슨 일이 일어나고 있는지 단계별로 설명 할 수있다.

append([_], []).  
append([H|T], [H|N]) :- append(T,N). 

답변

6

Prolog를 처음 사용하는 것 같습니다. 그렇다면 환영합니다! 이것을 분석합시다.

이 불행히도 이름이 지정된 함수에는 두 개의 절이 있습니다. 프롤로그는 적용 할 항목을보기 위해 절을 봅니다. 일치하는 것을 찾으면 그것을 수행하려고 시도합니다. 수행 중 어딘가에서 오류가 발생하면 백업하여 다음 옵션을 시도합니다. 정확히 선택 지점 인은 프로그램에 따라 다릅니다. 이 프로그램에서는 단 하나의 조항 만 사용하여 어떤 규칙을 사용할 것인지 결정합니다.

첫 번째 규칙을 보는 한 가지 방법은 "하나의 요소가있는 요소에 관계없이 요소가 무엇인지에 관계없이 빈 목록과 관련이 있습니다."라는 것입니다. append([_], [])을 보면 과 Y = []이있는 경우 [foo]은 하나의 항목 목록이고 []은 빈 목록이므로 보유하게됩니다. 이 규칙은 인스턴스 생성에 상관없이 작동하기 때문에 좋은 프롤로그 스타일입니다. 왼쪽 또는 오른쪽을 제공 할 수도 있고 그렇지 않을 수도 있습니다. 중요하지 않습니다.

두 번째 절도 매우 간단합니다. 왼쪽 인수와 오른쪽 인수는 둘 다 동일한 항목으로 시작하고 나머지 목록도이 동일한 술어와 관련되어 있으면 관련이 있다고합니다. 즉, XY의 목록이 있는데 append(X, Y)이 참이면 append([H|X], [H|Y])도 마찬가지입니다. append/2에 의해 암시되는 한을 제외하고는 H가 무엇이고 X와 Y가 무엇인지는 중요하지 않습니다.

논리적으로 생각하면 하나의 항목 목록이 빈 목록과 관련되어 있고 어떤 목록이 동일한 항목으로 시작하고 다른 항목이 동일한 목록과 관련되어 있다면 그 목록의 유일한 종류는 왼쪽 목록에는 끝에 오른쪽에없는 항목이 하나 더 있다는 점을 제외하면 모든 항목이 같은 목록입니다. 따라서 [1,2,3,4]는 [1,2,3]와 관련이 있지만 [1,2,3, foo]와 [1,2,3]도 마찬가지입니다.

절차 상,의는이 술어는 인수의 세트로 처리 될 때 어떻게되는지 살펴 보자 :

append([1,2,3], X). 

첫 번째 규칙은 [1,2,3]에 일치하지 않습니다.그래서 우리는 두 번째 규칙을보고해야합니다

append([1|[2,3]], [1|X]) :- append([2,3], X). 

우리는 반복 할 수 있습니다 :

이제 첫 번째 규칙 일치하지
append([2|[3]], [2|Y]) :- append([3], Y). 

:

: 그래서

append([3], []). 

이 모두 함께 넣어

append([1,2,3], [1|X]) implies 
    append([2,3], X=[2|Y]) implies 
    append([3], Y=[]) 
    so Y = [] 
so X = [2] 
so the right side is [1,2]. 
?- trace, append([1,2,3], X). 
    Call: (7) append([1, 2, 3], _G1633) ? creep 
    Call: (8) append([2, 3], _G1752) ? creep 
    Call: (9) append([3], _G1755) ? creep 
    Exit: (9) append([3], []) ? creep 
    Exit: (8) append([2, 3], [2]) ? creep 
    Exit: (7) append([1, 2, 3], [1, 2]) ? creep 

혼란이 프롤로그 코드를 만드는 당신은 아무것도 할 방법 프롤로그 말 했어요 것처럼 보이지 않는다는 것입니다 무엇 : 414,프롤로그 추적은 기본적으로 당신에게 동일한 정보를 표시합니다. 그리고 그것은 사실입니다. 그렇지만 논리적으로 사실 인 것을 지정함으로써 Prolog는 그 자체로 그것을 알아낼 수 있습니다. 이것은 꽤 영리한 코드입니다. 이것이 하스켈 인 경우 우리는 내장 함수 인 init에 대해 이야기 할 것입니다.이 함수는 모든 목록이 아니라 마지막 항목을 반환합니다.

희망이 도움이됩니다.

+0

감사합니다. 그것은 매우 도움이됩니다. – Chaos