Моя длинная грамматика SWI-Prolog не работает - PullRequest
0 голосов
/ 28 сентября 2018

Моя длинная грамматика продолжает терпеть неудачу.

Он распознает текст в форме a.\n a. и должен возвращать список предложений, пробелов и возвратов.

test//1 - это основная грамматика, которая вызывает другие правила и компилирует вывод.

sentence32//1 и sentence33//1 распознает буквы и т. Д. В предложении.

spaces//1 и returns//1 распознают пробел и возвращают соответственно.

sentenceendpunctuation//1 анализирует пунктуацию конца предложения.

Вот оно:

use_module(library(dcg/basics)).

test([]) --> [].  
test(AAs) --> 
  spaces(Y), 
  {
    string_length(Y,YLen),
    (
      YLen>0->Start = [[s,YLen]]
    ;
      Start=[]
    )
  }, 
  sentence32(X),
  returns(Z),
  {
    [XS] = X,
    string_length(XS,XLen),
    (
      XLen>0->append(Start,[X],Next)
    ;
      Next=Start
    ), 
    string_length(Z,ZLen),
    (
      ZLen>0->append(Next,[[r,ZLen]],Last)
    ;
      Last=Next
    )
  },
  test(As),
  {
    append(Last,As,AAs)
  },
  !. 

test(Last) --> 
  spaces(Y), 
  {
    string_length(Y,YLen),
    (
      YLen>0->Start = [[s,YLen]]
    ;
      Start=[])
  }, 
  sentence32(X),
  returns(Z),
  {
    [XS] = X,
    string_length(XS,XLen),
    (
      XLen>0->append(Start,[X],Next)
    ;
      Next=Start
    ),
    string_length(Z,ZLen),
    (
      ZLen>0->append(Next,[[r,ZLen]],Last)
    ;
      Last=Next)
    },
    !.

spaces(XXs) --> 
  [X], 
  {
    X=32
  },
  spaces(Xs),
  {
    char_code(Ch,X),
    atom_string(CA,Ch),
    atom_concat(CA,Xs,XXs)
  },
  !.
spaces('') --> [].

returns(XXs) --> 
  [X], 
  {
    X=10
  }, 
  returns(Xs),
  {
    char_code(Ch,X),
    atom_string(CA,Ch),
    atom_concat(CA,Xs,XXs)
  },
  !.
returns('') --> [].

sentence32([XsZ]) -->
  sentence33(Xs), 
  sentenceendpunctuation(Z),
  {
    atom_string(CA,Xs),
    atom_concat(CA,Z,XsZ)
  }, 
  !.
sentence32('') --> [].

sentence33(CXs) --> 
  [X],
  {
    (
      (
        char_type(X,alnum)
      ;
        char_type(X,white)
      )
    ;
      char_type(X,punct)
    ),
    not(X=93),
    char_code(C,X),
    not(X=91),
    not(X=46),
    not(X=33),
    not(X=63),
    not(X=10)
  },
  sentence33(Xs),
  {
    atom_string(CA,C),
    atom_concat(CA,Xs,CXs)
  },
  !. 
sentence33('') --> [].

sentenceendpunctuation(Z) --> 
  [Z1],
  {
    char_code(Z,Z1),
    (
      Z='.'
    ;
      (
        Z='?'
      ;
        (
           Z='!'
        )
      )
    )
  },
  !.

Когда я ввожу запрос для разбора моей строки

string_codes(" a. a.",Y),phrase(test(X),Y).

Я получаю false.

1 Ответ

0 голосов
/ 28 сентября 2018

решено: моя длинная грамматика продолжает давать сбой

Я только что закомментировал базовый случай !!!!

%% test([]) --> [].

Я получаю

?- string_codes(" a. a.",Y),phrase(test(X),Y).
Y = [32, 97, 46, 32, 97, 46],
X = [[s, 1], ['a.'], [s, 1], ['a.']].
...