【问题标题】:Prolog: List recursion and modificationProlog:列表递归和修改
【发布时间】:2013-02-11 05:34:30
【问题描述】:

我在理解 Prolog 中的列表递归和修改时遇到了一些麻烦。我正在尝试获取列表列表,然后在每个列表中,将列表中的每个元素乘以最后一个元素。

这是我的代码的 sn-p:

    /*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).

但是,当我尝试任何列表时,我得到的都是错误的。有人可以给我任何指示吗 关于可以帮助进一步理解这个问题的列表递归?

【问题讨论】:

  • 您使用的是哪种实现方式?
  • 我目前使用的是 SWI Prolog 5.10 版

标签: list recursion prolog


【解决方案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.

【讨论】:

  • 非常感谢,这让我重回正轨。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2016-09-07
相关资源
最近更新 更多