0

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

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)。

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

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

4

1 回答 1

0

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

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

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

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

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

于 2012-06-27T05:51:47.077 回答