我冗长的SWI-Prolog语法不断失败

时间:2018-09-28 16:24:15

标签: prolog swi-prolog dcg

我的长语法一直在失败。

它识别格式为a.\n a.的文本,并应返回句子,空格和返回值的列表。

test//1是调用其他规则并编译输出的主要语法。

sentence32//1sentence33//1识别句子中的字母等。

spaces//1returns//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 :(得分:1)

已解决:我的长语法一直失败

我只是注释掉了基本情况!!!

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

我明白了

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