2017-12-02 1 views
0

문장 목록을 반복하여보고 문법적으로 올바른지 확인하려고합니다. 문장은 단어 목록입니다. 그 모습은 다음과 같습니다 :DCG의 "임의 용어"chracter (_)가 예상대로 작동하지 않습니다.

verifySen([]). 
verifySen([H|T]) :- 
    sentence(H,[]), 
    verifySen(T). 

여기서 verifySen에는 목록이 제공됩니다. sentence(H,[])은 무언가가 유효한 문장인지 확인하려고 시도합니다. 문제가있는 곳입니다. 나의 현재 DCG는 다음과 같습니다

sentence --> subject_phrase, verb_phrase, {write('this IS a valid sentence'), nl}. 
    sentence --> anything, {write('this is NOT a valid sentence'),nl}. 
    anything --> [_], anything. 
    ... 

코드 뭔가 가 유효한 문장 경우에 대한을 작동하지만 실패하고 뭔가 잘못된 문장 때 오류가 발생합니다. 나는 stream '<stream>(000..random numbers...)' does not exist.

누구든지 조언을 제공 할 수 있습니까?

+0

'[you, run]'이 (가) 유효한 문장이라고 가정합니다. 그럼 당신에 따르면'[당신, 실행, xxxx]'는 유효한 문장이 아니지만 그래도 당신은 그것이 하나라는 것을 쓸 것입니다! 이 테스트를 한 레벨 위에 작성하면 이런 일이 발생하지 않습니다. 그리고 항상 문법에 대한 인터페이스로'phrase (sentence, H)'를 사용하십시오. – false

+0

\t'sentence -> subject_phrase, verb_phrase, {write ('this is a sentence'), nl}로 변경하십시오. \t 문장 -> [_],!, {쓰기 ('이것은 문장이 아닙니다.), nl}'입니다. 문제가 해결 되었습니까? Trace는 문장이 문장이 아니라는 것을 올바르게 발견했지만, 다시 말하지만 첫 단어가없는 문장을 보여줍니다. 이 작업은 [_]을 사용하거나 커팅을 사용하지 않는 것과 관련이 있습니까? – nhz

+1

'{}'을 문법 규칙에 넣지 마십시오! – false

답변

0

저는 여러분이 // 0의 기본 경우를 놓치고 있다고 생각합니다. 문장이 유효하지 않을 때 'end-of-stream'까지 실행 한 다음 실패합니다.

anything --> [_], anything. 
anything --> []. 
관련 문제