【问题标题】:prolog: parsing a sentence and generating a response in a simple language parserprolog:用简单的语言解析器解析句子并生成响应
【发布时间】:2012-06-28 08:25:49
【问题描述】:

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

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

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

2 ?- computing_course(comp456).
true.

然后是“什么是计算机课程”之类的问题:

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

我考虑过使用assertz,但是我仍然不知道一旦构造了谓词如何调用它。我很难找到需要采取哪些步骤来实现这一目标。 (使用 swi-prolog)。

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

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() 在语法上似乎并不正确。很高兴知道这是否可能以及如何实现。

【问题讨论】:

    标签: parsing syntax prolog


    【解决方案1】:

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

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

    您也可以使用与您在add_rule/1 中已经使用的非常相似的东西:

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

    第一种形式更高效,也更标准化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2015-01-29
      • 1970-01-01
      相关资源
      最近更新 更多