使用Prolog从语言规则中获取数据模型路径?

时间:2012-04-06 18:18:39

标签: prolog artificial-intelligence dcg

我想为数据仓库构建一个半自然的语言界面。一个简单的数据模型就像这样的例子:

Company
- attribute 'name'
- reference to 'Departments'

Department
- attribute 'type'
- reference to 'Employees'

Employee
- attribute 'age'
- attribute 'salary'

我想提出这样的问题:

ACME employeesBugs Bunny salaryACME department types

对于不在语法中的输入,我会调用数据库并将ACME解析为Company

...并将查询转换为我的数据库语言将理解的路径:

[Company].departments.employees[Employee].salary[Company].departments.type

我记得在解析英语句子的时候使用SWI-Prolog方式,并说出它们是否正确。在这种情况下Prolog仍然是可行的方法吗?

由于

3 个答案:

答案 0 :(得分:2)

甚至,更好的是,我现在使用DCG和嵌入式Prolog规则。

因此,对于具有这样的类和属性的模型:

c(company, class(company)) --> [company].
a(company, attribute(name)) --> [name].

我可以要求类的属性:

q(q(A,C1,C2)) --> a(T1,A), [of], c(T1,C1)
    ,[of], c(T2,C2), {is_child(T1, T2)}.

然后把树拿回来作为答案。

答案 1 :(得分:1)

在SWI-Prolog中,有Chat80准备安装。我认为可能与你所追求的非常相似,经过必要的修正后。

只是来自会话日志的一个示例查询(注意:我自己的聊天80到SWI-Prolog的旧端口,该包可能更具功能性,但我还没有尝试过运行):

what rivers are there ? 

Parse: 0.0168457sec.
whq
   $VAR
      1
   s
      np
         3+plu
         np_head
            int_det(B)
            []
            river
         []
      verb(be,active,pres+fin,[],pos)
      void
      []



Semantics: 0.0170898sec.
answer([B]) :-
   river(B)
 & exists B 
     true

Planning: 0.0sec.
answer([B]) :-
   river(B)
 & exists B 
     true
amazon, amu_darya, amur, brahmaputra, colorado, congo_river, cubango, danube, don, elbe, euphrates, ganges, hwang_ho, indus, irrawaddy, lena, limpopo, mackenzie, mekong, mississippi, murray, niger_river, nile, ob, oder, orange, orinoco, parana, rhine, rhone, rio_grande, salween, senegal_river, tagus, vistula, volga, volta, yangtze, yenisei, yukon and zambesi.

Reply: 0.166992sec.

话语回答查询所需的逻辑形式是系统的中心点。从地面开始制作并不容易!

我读过Prolog and Natural Language Analysis,F.Pereira,S.Shieber,1987  (意大利语翻译),仍然是我的首选!英文原版免费提供here

答案 2 :(得分:0)

最后这个例子翻译了一个句子'进入模型中的路径:

% root classes
class(ceo).

% model relations
attribute_of(age, ceo).
attribute_of(salary, ceo).

% grammar of relations
attribute('age', age).
attribute('salary', salary).
attribute('money', salary).

% answer format
answer([Class, Attribute], Class, Attribute).

% language rules
% query(Attribute,'of',Object, Answer).
query(AttributeQ, 'of', ClassQ, Answer) :-
    db(ClassQ, Class), attribute(AttributeQ, Attribute), attribute_of(Attribute, Class), answer(Answer, Class, Attribute).

% database
db('Bugs Bunny', ceo).

例如,以下查询:

?- query('age','of','Bugs Bunny', Answer).

...给我:

Answer = [ceo, age].