-4

mergealt(X,Y,Z)リストZがリストXとYの代替要素のマージである場合に成功するProlog述語を作成する必要があります。

入力と出力は次のようになります。

?- mergealt([1,2,3,4],[6,7,8],Z).
Z = [1, 7, 3] .
?- mergealt([1,2,3,4],[6,7,8,9],Z).
Z = [1, 7, 3, 9] .
?- mergealt([1,2,3,4],[6,7,8,9,10],Z).
Z = [1, 7, 3, 9] .

再帰はよくわかりません。この問題を開始するにはどうすればよいですか?

4

2 に答える 2

5

Prologは、宣言型言語の「旗手」と見なすことができます。したがって、問題をトップダウンで説明してみてください。

mergealt(X, Y, Z) :-
  'take first element from X and put it in Z',
  'discard first element from Y',
  'mergealt rest-of-X and rest-of-Y, but exchange them'.

Xに要素がない場合、最初のステップを実行することはできません。この事実は、再帰終了のケースを浮き彫りにします。もともと、Prologは使用されていませんでしたがif then else、代わりに代替案が異なるルールとして示されています。

mergealt([], _Y, []).

ここではpattern matching、最初の引数で選択肢を区別することが重要であり、コンテキスト上、Zは空のリストにバインドされていることがわかります。Yは未使用であるため、警告を避けるために、匿名プレースホルダーとしてマークされています。

次に、この単純なケースは、パターンマッチングを使用して、これらの詳細な説明を実行する必要があることを示しています。次のガイドラインを使用して手順を完了できるかどうかを確認してください。

mergealt([X|Xs], Y, [X|Zs]) :-
  % take first element from X and put it in Z : done in the head
  % discard first element from Y : see below
  % mergealt rest-of-X and rest-of-Y, but exchange them'. : make your recursive call

discard_first_element([_|Rest], Rest).
% why is this necessary? do you see where it fails if we don't specify this case?
discard_first_element([], []).
于 2012-05-21T08:54:50.050 に答える
2
  • 結果は常に最初のリストの最初の要素から始まることに注意してください。
  • これは、最初のリストが空の場合、すぐに答えがわかることを意味します。
  • また、空でない場合は、結果の最初の項目がすでにわかっているため、mergealtを使用して残りを計算する必要があることにも注意してください。ただし、「残り」には、結果の最初の項目として2番目のリストの2番目の項目が含まれます。つまり、前述のように、mergealtを呼び出して計算するには、それが最初の項目の最初の項目である必要があります。リスト(ええ、これはトリッキーな部分です)。
于 2012-05-21T00:02:23.827 に答える