2011-01-28 20 views
7

के साथ समस्याएं परियोजना अर्ध-प्राकृतिक भाषा को SQL तालिकाओं में अनुवाद करने के बारे में है। कोड:प्रोलॉग के डीसीजी

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

यहाँ कैसे यह ठीक काम करता है:

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

लेकिन यह यहाँ काम नहीं करता:

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

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

जाहिर है यह table("student") सच के रूप में मान्यता नहीं देता। यह ऊपर वर्णित लेबल के रूप में "छात्र" को पहचानता है। क्या देता है?

+1

क्या आप 'लेबल/3' के लिए कोड पोस्ट कर सकते हैं? –

उत्तर

3

मैं त्रुटि को पुन: उत्पन्न नहीं कर सकता, लेकिन मुझे संदेह है कि यह आपके label/3 नियम में हो सकता है। जब मैं इस नियम के निम्नलिखित परिभाषा का प्रयोग किया:

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

सामान्य तौर पर, मैं DCG हेरफेर करने से पहले परमाणुओं की सूचियों में तार tokenizing की सलाह देते हैं:

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

मैं सही परिणाम प्राप्त। इस तरह, प्रोलॉग के अजीब स्ट्रिंग आउटपुट के कारण डीबग करना बहुत आसान है।

+0

"प्रोलॉग अजीब स्ट्रिंग आउटपुट": इसे ['set_prolog_flag (double_quotes, chars)'] (http://stackoverflow.com/a/8269897/772868) का उपयोग करके महत्वपूर्ण रूप से सुधार किया जा सकता है। – false

संबंधित मुद्दे