3

Prolog と dcg の基本的な構文を理解しようとしていますが、本当に基本的なものに関する適切な情報を入手するのは非常に困難です。以下のコードを見てください。基本的には、次のようなことを達成したいだけです。

Output = te(a, st).

Code: 
    test(te(X,Y)) --> [X], test2(Y).
    test2(st(_X)) --> [bonk]. 

    ?- test(Output, [a, bonk],[]).
    Output = te(a, st(_G6369)). 

私がやりたいことは、最後に「st」という単語を追加することです。私が管理した最も近い方法は、これを行うことですが、残念ながら st には多くのナンセンスが続き_Xます。私は単に次のOutputように含めたいだけです:te(a, st).

4

2 に答える 2

2

フォームの入力を受け入れ[Term, bonk]て取得したい場合は、bonk a return を受け入れるようにte(Term,st)変更する必要があります。test/2st

test(te(X,Y)) --> [X], test2(Y).
test2(st) --> [bonk].


?-  test(Output, [a, bonk],[]).
Output = te(a, st).
于 2012-12-19T16:57:59.737 に答える
1

あなたが言ったように、stの後には「ナンセンスの束」が続きます_X(基本的に、_G6369は変数の内部「名前」であり、変数はインスタンス化されていないままであるため、プロローグはそれを表示します;試してくださいprint(X), X=3, print(X).

(_X)とにかく、引数として必要なものを何でも持つことができるので、単純に削除できます。

test(te(X,Y)) --> [X], test2(Y).
test2(st) --> [bonk]. 

もちろん、実際にはbonk入力に 's がなく、単に最後に 's を追加したいst場合は、さらに単純化できます。

test(te(X,st)) --> [X].

または、次の場合bonk:

test(te(X,st)) --> [X,bonk].

最後に、手動で引数を追加する代わりに、 phrase /3またはphrase/2を使用することをお勧めします。

于 2012-12-19T16:58:09.953 に答える