1

Prolog でのリストの再帰と変更を理解するのに少し苦労しています。リストのリストを取得しようとしています。次に、各リストで、リスト内の各要素に最後の要素を掛けます。

これが私のコードのスニペットです:

    /*Find the last element of a list*/
    lastelement(X,[X]).
    lastelement(X,[_|L]) :- lastelement(X,L).

    /*Multiply two lists together*/
    multiplication(M1,M2,M1*M2).

    /*Take a list, find the last element and multiply every part of that list by that  element*/
    /*Attach modified list to X*/
    modifyL([],X) :- X is [].
    modifyL([First|Tset],X) :- lastelement(Y,First),
    multiplication(Y,First,MFirst),
    modifyL([Tset],X),
    append(X,MFirst,X).

ただし、リストのリストを試してみると、得られるのはすべて偽です。この問題をさらに理解するのに役立つ可能性のあるリストの再帰に関する指針を誰かに教えてもらえますか?

4

1 に答える 1

1
modifyL([],X) :- X is [].

これはあなたが思っていることをするではなく、算術評価の結果を得るために使われます。

あなたは書ける

 modifyL([],X) :- X = [].

または単に

 modifyL([],[]).

リストを操作し、このリストの各要素に対して同じプロセスを繰り返す場合、まさにそのために設計された maplist を使用できます。テンプレートは maplist(Goal, L1 L2) です。

modify(L1, L2) :-
  maplist(multiply_one_list,L1, L2).

Multiply_one_list はリストで動作します。次のように記述できます。

multiply_one_list(L_in, L_out) :-
  % getting last argument
  reverse(L_in, [Last | _]),
  % multiply each element of the list by
  % the last element, one more maplist !
  maplist(multiply_one_element(Last), L_in, L_out).

multiply_one_element(Last, In, Out) :-
  Out is In * Last.
于 2013-02-10T21:34:30.373 に答える