prolog:解析一个句子并在一个简单的语言解析器中生成一个响应

时间:2012-06-26 23:04:48

标签: parsing syntax prolog

到目前为止,我有以下工作:

gen_phrase(S1,S3,Cr) :- noun_phrase(S1,S2,Cr1), verb_phrase(S2,S3,Cr2),
                        append([Cr1],[Cr2],Cr),add_rule(Cr).

question_phrase(S1,S5,Cr) :- ist(S1,S2),noun_phrase(S2,S3,Cr1),
                             noun_phrase(S3,S4,Cr2),
                             append([Cr1],[Cr2],Cr).

add_rule([X,Y]) :-
    Fact =.. [Y, X],
    assertz(Fact).

鉴于测试运行,代码生成以下内容:

1 ?- gen_phrase([the,comp456,is,a,computing,course],S3,Cr).
S3 = []
Cr = [comp456, computing_course].

add_rule(Cr)断言谓词computing_course(comp456)的存在。 现在我想做的是问一个问题:

4 ?- question_phrase([is,the,comp456,a,computing,course],X,Cr).
Cr = [comp456, computing_course] .

我需要做的是提取我可以做的compute_course和comp456,然后将其转换为prolog接受的形式。这应该看起来像Y(X),其中Y = computing_course是谓词,X = comp456是atom。结果应该类似于:

2 ?- computing_course(comp456).
true.

稍后会出现“什么是计算机课程”这样的问题:

3 ?- computing_course(X).
X = comp456.

我想过使用assertz,但是我仍然不知道如何构造谓词。我很难找到需要采取哪些措施来实现这一目标。 (使用swi-prolog)。

编辑:我意识到有一个谓词调用()。但是我想构建这样的东西:

ask([X,Y]) :- call(Y(X)).

2 ?- gen_phrase([a,comp456,is,a,computing,course],S3,Cr).
S3 = [],
Cr = [comp456, computing_course] 

4 ?- question_phrase([is,the,comp456,a,computing,course],X,Cr),ask(Cr).
ERROR: toplevel: Undefined procedure: ask/1 (DWIM could not correct goal)

看起来这样的call()在语法上是不正确的。很高兴知道这是否可行,以及如何。

1 个答案:

答案 0 :(得分:0)

call/N这就是你所需要的(这里N == 2):

ask([X,Y]) :- call(Y,X).

您也可以使用与add_rule/1中已经使用的内容非常相似的内容:

ask([X,Y]) :- C =.. [Y,X], call(C).

第一种形式它更有效率,也是标准化的。