2011-01-28 31 views
7

của dự án Prolog là về dịch ngôn ngữ bán tự nhiên sang các bảng SQL. Mã này:Các sự cố với DCG

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), ".". 

Sau đây là cách nó hoạt động tốt:

?- 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". 

Nhưng nó không hoạt động ở đây:

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

?- sbvr2sql(T, P, "student has firstName.", []), table(T). 
false. 

Rõ ràng nó không nhận ra table("student") là đúng. Nó nhận ra "sinh viên" như một nhãn như đã thấy ở trên. Đưa cái gì?

+1

Bạn có thể đăng mã cho 'label/3' không? –

Trả lời

3

Tôi không thể tạo lại lỗi, nhưng tôi nghi ngờ nó có thể nằm trong quy tắc label/3 của bạn. Khi tôi sử dụng định nghĩa sau đây của quy tắc này:

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

tôi nhận được kết quả chính xác:

?- 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. 

Nói chung, tôi khuyên bạn nên tokenizing chuỗi thành các danh sách của các nguyên tử trước khi thực hiện thao tác DCG. Bằng cách đó, nó dễ dàng hơn nhiều để gỡ lỗi vì đầu ra chuỗi khó xử của Prolog.

+0

"Đầu ra chuỗi khó xử của Prolog": Điều này có thể được cải thiện đáng kể bằng cách sử dụng ['set_prolog_flag (double_quotes, chars)'] (http://stackoverflow.com/a/8269897/772868). – false