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を使用)。

編集:述語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()は構文的に正しいようには見えません。これが可能かどうか、そしてその方法を知っておくとよいでしょう。

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 に答える