2013-05-08 4 views
0

a가 1 인 회중 색인을 정의하려고합니다. b보다 적습니다. 잉여 'b는'머물 수있는 곳 : 나는a의 숫자가 b의 숫자보다 하나가되도록 두 기호 a와 b의 알파벳 {a, b}에 대한 문장 부호에 대한 dcg를 정의합니다.

please-->palindromes. 
    palindromes-->[]. 
    palindromes-->[a]. 
    palindromes-->[b]. 
    palindromes--> [b],palindromes,[b]. 
+1

입니다. 그보다 더 열심히 노력할 수 있다고 생각합니다. –

+0

두 번째 및 세 번째 기본 사례가 귀하의 규칙을 따르지 않습니다. 그들은 'a'의 숫자가 'b'의 수인 – joneshf

답변

0

이것에 대해 생각 제대로 작성하는 방법을 알아낼 질수? 회문에서는 그러한 장소가 하나뿐입니다. 그럼 당신은 올바른 궤도에있어

S :: P 
P :: a P a | b P b | {epsilon} 
+0

보다 1 작은 palindromes가 아닙니다. 잉여 b는 중간에 머무를 수 있지만 b a b는 유효한 회문입니다 – user1850254

+0

예, 중간에 있습니다. 하지만 abab은 회문이 아니며 abba 여야합니다. – CapelliC

+0

미안하지만 오타입니다. 나는 b a b를 의미했습니다. – user1850254

0

을 읽을 것 BNF에 (DCG로 번역 당신이 이미 알고있는) 것을, 대칭 정의를 변경, 당신은 카운트의 차이를 다루는 방법이 필요합니다. 문법 용어 인 palindromes에 숫자 인자를 추가하여이를 수행 할 수 있습니다.

우선은 "B가 두 개 더 A보다"구현하는 일반 프롤로그 규칙을 정의 할 것이다 : 어떤 회문는 주어진 알파벳에 우리가 palindromes(Diff)을 말할 것이다 그리고

plus2(A,B) :- number(A), !, B is A+2. 
plus2(A,B) :- number(B), !, A is B-2. 
plus2(A,B) :- var(A), var(B), throw(error(instantiation_error,plus2/2)). 

을 의미 곳 b 문자 마이너스의 수 a 글자의 수는 Diff입니다. 기본 케이스를 들어, Diff 정확히 알고 재귀 문법 규칙에 대한

palindromes(0) --> []. 
palindromes(-1) --> [a]. 
palindromes(1) --> [b]. 

, 우리는 plus2 조건 확인 { 중괄호 }에 코드 블록을 사용할 수 있습니다

palindromes(DiffOuter) --> [b], palindromes(DiffInner), [b], 
    { plus2(DiffInner, DiffOuter) }. 
palindromes(DiffOuter) --> [a], palindromes(DiffInner), [a], 
    { plus2(DiffOuter, DiffInner) }. 

을 마무리하기를, 최상위 문법 규칙은 단순히