0

私はプロローグに不慣れで、if/elseステートメントと再帰をどのように使用できるかを理解しようとしています。説明のために、私は簡単なプロローグプログラムを書きました。プログラムは役に立たない(その機能は役に立たないという点で)が、それは私の問題を説明するのに役立つ。プログラムはリストを取得し、リストの先頭を調べて、それが最後の要素であるかどうかを確認します。そうでない場合は、一時リスト変数にヘッドを追加し、リストのテールを使用してプログラムを再帰的に実行します。最後にリストを出力する必要があります。プログラム:

 gothrough([H|T], B, C):-
      append(B,H,B),
      (  (T == [])
      -> C=B
      ;  gothrough(T, B, C)
      ).

呼び出し:gothrough([sample, phrase, here], [], C).

期待される出力:C = [sample, phrase, here]

現在の出力:no

私が間違っていることについて何か助けはありますか?

ありがとう!

4

4 に答える 4

4

あなたのコメントから、あなたがappend(そして一般的にPrologが)どのように機能するかを誤解していることを理解しています。

これはまったく当てはまりません。「B=[昨日]およびH=[今日]の場合、append(B、H、B)= [昨日、今日]」。

append(B, H, B)「HをBに追加するとBが再び生成される」という意味です。これは、Hが空のリストである場合にのみ可能です。

理解しておくべき重要なことは、の両方のBappend(B, H, B)が同じであり、同じ値でなければならないということです。これは代数の変数のようなものです。方程式のすべてのXは同じ値を意味します。

出力変数には、append(B, H, Bnew)-のように別の名前を使用する必要があります。そうすれば、より意味があります。

于 2013-02-19T00:01:23.107 に答える
1

最初の問題はappend(B, H, B)、ほとんどの入力で意味がないことです。

2番目の問題は、if-then-elseの結果と代替、つまり、後->と後の部分;が両方ともPrologの目標(ステートメント)でなければならないということです。C目標ではありません。C=Bあなたのプログラムが何をしているのか理解するのが難しいのでわかりにくいですが、あなたは意味しているかもしれません。

于 2013-02-18T23:22:27.450 に答える
1

Hが[]でない限り、append(B、H、B)は失敗するため、noが表示されます。これらは節であり、割り当てではないことを忘れないでください。また、Cに何もバインドしないため、ステートメントが証明された場合、Cに値が含まれることはありません。

これでタスクが完了します。

gothrough([],L,L).
gothrough([H|T], B, C) :- gothrough(T,B,Cx), append([H],Cx,C).
于 2013-02-18T23:24:53.373 に答える
0

これはさらに簡単に行うことができます。

gothrough([], []).
gothrough([H|T], [H|X]) :-
    gothrough(T, X).

最初のルールは空のリスト条件に一致します。これにより、再帰の終了/リストが強制的に作成されます。

2番目のルールは、空のリスト以外のすべてに一致します。この場合、ヘッドHがXに追加されます。ここで、Xは、テールを繰り返して取得したリストの結果です。すなわち。追加述語を使用する必要はありません-リスト追加はプロローグに組み込まれています。

?- gothrough([simple, phrase, here], X).
X = [simple, phrase, here].

このソリューションでも、使用する変数が1つ少なくなります。

于 2013-02-21T18:23:31.803 に答える