到目前为止,我有以下工作:
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()在语法上是不正确的。很高兴知道这是否可行,以及如何。
答案 0 :(得分:0)
call/N这就是你所需要的(这里N == 2):
ask([X,Y]) :- call(Y,X).
您也可以使用与add_rule/1
中已经使用的内容非常相似的内容:
ask([X,Y]) :- C =.. [Y,X], call(C).
第一种形式它更有效率,也是标准化的。