Problems with Prolog DCG

A project to translate a semi-natural language into SQL tables. The code:

label(S) --> label_h(C), {atom_codes(A, C), string_to_atom(S, A)}, !. label_h([C|D]) --> letter(C), letters_or_digits(D), !. letters_or_digits([C|D]) --> letter_or_digit(C), letters_or_digits(D), !. letters_or_digits([C]) --> letter_or_digit(C), !. letters_or_digits([]) --> "", !. letter(C) --> [C], {"a"=<C, C=<"z"}, !. letter(C) --> [C], {"A"=<C, C=<"Z"}, !. letter_or_digit(C) --> [C], {"a"=<C, C=<"z"}, !. letter_or_digit(C) --> [C], {"A"=<C, C=<"Z"}, !. letter_or_digit(C) --> [C], {"0"=<C, C=<"9"}, !. table("student"). sbvr2sql --> label(Name), " is an integer.", {assert(fields(Name, "INT"))}. sbvr2sql --> label(Name), " is a string.", {assert(fields(Name, "VARCHAR(64)"))}. sbvr2sql(Table, Property) --> label(Table), " has ", label(Property), ".". 

Here's how it works:

 ?- sbvr2sql("age is an integer.", []). true ?- sbvr2sql("firstName is a string.", []). true. ?- sbvr2sql(T, P, "student has firstName.", []). T = "student", P = "firstName". ?- fields(F, T). F = "age", T = [73, 78, 84] n F = "firstName", T = [86, 65, 82, 67, 72, 65, 82, 40, 54|...]. ?- sbvr2sql(T, P, "student has firstName.", []), fields(P, _). T = "student", P = "firstName". 

But this does not work here:

 ?- table(T). T = [115, 116, 117, 100, 101, 110, 116]. % "student" ?- sbvr2sql(T, P, "student has firstName.", []), table(T). false. 

It does not seem to recognize table("student") as true. He recognizes the β€œstudent” as a label, as shown above. What gives?

+7
source share
1 answer

I cannot reproduce the error, but I suspect it might be in your label/3 rule. When I used the following definition of this rule:

 label([C|S]) --> [C], {[Sp|_] = " ", C \= Sp, [Dot|_] = ".", C \= Dot}, !, label(S). label([],X,X). 

I get the correct results:

 ?- sbvr2sql(TS, PS, "student has firstName.", []), table(TS), atom_codes(P,PS), atom_codes(T,TS). TS = [115, 116, 117, 100, 101, 110, 116], PS = [102, 105, 114, 115, 116, 78, 97, 109, 101], P = firstName, T = student. 

In general, I recommend tokenizing strings into atom lists before doing DCG manipulations. Thus, it is much easier to debug due to the uncontrolled output of the Prolog line.

+3
source

All Articles