2014-06-18 1 views
1

나는 확실한 문법 안에서 통일의 개념을 이해하려고 애쓰는 중입니다. 누군가가 다음 DCG에서 어떻게 대답 하는지를 단계별로 설명 할 수 있습니다.확실한 절 문법에서 답을 얻기 위해 통일을하는 방법을 설명 할 수 있습니까?

s --> symbols(Sem,a), symbols(Sem,b). 

symbols(s(end),S) --> [S]. 
symbols(s(Sem),S) --> [S], symbols(Sem,S). 

대답은 aaabbb을 생산,하지만 난 사람이 적어도 쇼 몇 단계에서 이것을 설명, 또는 할 수 있다면, 나는 영원히 감사 할 것입니다 당신이 답변을 얻을 방법을 시도하고 찾을 수 연령대에 웹을 검색 한 밖으로 운동, 그래서 무슨 일이 일어나고 있는지 볼 수 있습니다.

비슷한 예는 aaabbbccc을 제외하고는 DCG의 위키 백과 페이지에서 찾을 수 있습니다.

감사

+1

's (end)'는 일반적으로's (0)'으로 쓰여집니다. – false

+0

당신 말이 맞습니다. 고맙습니다. –

답변

1

symbols 목록에서 NS 걸리는 술어. 그러나 N은 "정상적인"숫자로 인코딩되지 않고 숫자 계산과 같은 숫자로 인코딩됩니다. end은 0 (보통 0 대신 끝에 사용)이고 s(N)N+1을 의미합니다.

절이

symbols(s(end),S) --> [S]. 

한 요소 S 걸린다. 우리는 s(end)을 숫자 1을 나타내는 용어로 해석 할 수 있습니다.

절이

symbols(s(Sem),S) --> [S], symbols(Sem,S). 

은 하나 개의 요소 S를 취하고 반복적으로 동일한 요소와 문자를 호출합니다. 다시 말하면 s(Sem)을 숫자로 해석합니다. 다음은 의미합니다. N+1 (s(Sem)) 요소 S을 가져 오려면 먼저 S을 가져 와서 재귀 적으로 N 요소 S을 가져옵니다.

술어 s은 단지 같은 수의 bs를 취합니다.

symbols(Sem,a)이 첫 번째 규칙과 일치하고 Sems(end)과 통합하기 때문에 첫 번째 해결 방법은 실제로 ab입니다. 그런 다음 symbols(s(end),b)이 호출되고 유일한 일치 규칙이 첫 번째 규칙입니다.

2

모든 가능한 문장에 대해 묻기 시작하십시오. 당신은, 예를 들어 가장 일반 쿼리 걸릴 수 있습니다 : 일반적으로

?- phrase(s,L). 
L = [a, b] ; 
L = [a, a, b, b] ; 
L = [a, a, a, b, b, b] ;  % this is your example 
L = [a, a, a, a, b, b, b, b] ... 

을, 그러나,이 방법은 답을 열거 할 수/불공정 한 방식으로 솔루션; 더 짧은 예제를 숨 깁니다. 길이에 따라 정렬 된 솔루션을 모두 찾으려면 다음을 수행하십시오.

?- length(L,N), phrase(s,L). 

이 경우에는 차이가 없습니다. 그러나 다른 규칙들 이후에 규칙 symbol(0,_) --> [].을 추가하는 것을 고려하십시오. L = []은 첫 번째 쿼리에 표시되지 않지만 "무한히 많은 솔루션에 의해 숨겨 짐"이지만 두 번째 솔루션의 첫 번째 솔루션으로 표시됩니다.

그래서 더 복잡한 예제를 이해하기 전에 가장 간단한 예제이므로 [a, b]을 고려하십시오.

?- phrase(symbols(Sem,a),L). 
Sem = s(0), 
L = [a] ; 
Sem = s(s(0)), 
L = [a, a] ; 
Sem = s(s(s(0))), 
L = [a, a, a] 

그래서이 부분 플러스 b와 같은 전체 문장을 설명

또 다른 방법은 쿼리 phrase(s, L)를 해부하고 성분의 각을 고려하는 것입니다.

+0

나는 내일 시험을 치르고 있는데, 이것은 내가 손을 잡으려고하는 마지막 구성 요소이다. 당신의 대답은 좋지만, 나는 아직도 그 개념을 모두 이해하려고 노력하고 있습니다. 이 문제를 논의하거나 도움이되는 사이트, 자습서, 논문에 대한 링크가 있습니까? –

+0

@ RHK-S8 : 오히려 : 문법은 일반적으로 문맥 자유 문법입니다. 그리고 나서 Prolog 절로의 번역. 'listing'으로 이것을 볼 수 있습니다. – false

+0

그래서 이것을 .pl 파일로 저장하고 인터프리터 ..에서로드하면 작업 할 수 있도록 입력하겠습니까? 그래서 목록을 사용할 수 있습니까? –

관련 문제