首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog的DCG问题

Prolog的DCG问题
EN

Stack Overflow用户
提问于 2011-01-28 18:49:51
回答 1查看 400关注 0票数 6

该项目是关于将半自然语言转换为SQL表。代码:

代码语言:javascript
复制
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), ".".

下面是它的工作原理:

代码语言:javascript
复制
?- 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".

但它在这里不起作用:

代码语言:javascript
复制
?- table(T).
T = [115, 116, 117, 100, 101, 110, 116]. % "student"

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

显然,它不承认table("student")是真的。如上图所示,它将“学生”识别为标签。怎么回事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-28 22:44:35

我不能重现这个错误,但我怀疑它可能在您的label/3规则中。当我使用此规则的以下定义时:

代码语言:javascript
复制
label([C|S]) -->
    [C], {[Sp|_] = " ", C \= Sp, [Dot|_] = ".", C \= Dot}, !,
    label(S).
label([],X,X).

我得到了正确的结果:

代码语言:javascript
复制
?- 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操作之前将字符串标记为原子列表。这样一来,由于Prolog的字符串输出比较笨拙,调试起来就容易多了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4827365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档