Prolog 我需要乘以和一个列表,输出应该是这样的

Prolog 我需要乘以和一个列表,输出应该是这样的,prolog,Prolog,我需要对一个列表进行乘法和求和,输出如下: ?- tp4([1,7,0,1,2,3,5], L). L = [210,19,1,7,0,1,2,3,5] multiply( [] , 0 ) . multiply( [N|Ns] , P ) :- multiply(Ns,N,P). multiply( [] , P , P ) . multiply( [N|Ns] , T , P ) :- T1 is T * N , multiply( Ns, T1, P ) .

我需要对一个列表进行乘法和求和,输出如下:

?- tp4([1,7,0,1,2,3,5], L).
L = [210,19,1,7,0,1,2,3,5]
multiply( []     , 0 ) .
multiply( [N|Ns] , P ) :- multiply(Ns,N,P).

multiply( []     , P , P ) .
multiply( [N|Ns] , T , P ) :-
  T1 is T * N ,
  multiply( Ns, T1, P )
  .

首先是复数,然后是和,最后是其余的数字。

这里是对你的问题的完整答案,因为你似乎有一个从哪里开始的问题。自学是很重要的,因此你可以通过使用和得出正确的答案。但是这些都是高级谓词,所以让我们从头开始,实现基本功能

第一:如何将元素附加到列表中。您可以将某些内容作为列表的头[head | list],也可以使用内置的谓词append/2,但您可以自己轻松实现它。请注意,变量以大写字母开头

?- List=[1,2,3,4], Head = 0, Out=[Head|List].
Head = 0,
List = [1, 2, 3, 4],
Out = [0, 1, 2, 3, 4].

?- List2=[1,2,3,4], List1 = [0], append(List1,List2,Out).
List1 = [0],
List2 = [1, 2, 3, 4],
Out = [0, 1, 2, 3, 4].
您可以将元素添加到列表中

如果您想实现自己的谓词(它在列表上工作),您可以使用内置谓词,也可以自己实现。我们将做第二个减法的例子,从最后一个元素中减去所有元素

我们的谓词减法/2需要两个属性:一个列表输入和一个返回值输出

如果列表只有一个元素[H],则返回该元素。否则,将列表拆分为Head元素和Rest列表[Head | Rest],计算列表Rest Tmp的减法值并从中减去Head:

测试:


工作,不完美,但工作。现在您知道了如何将元素添加到列表中,并有了一个示例,说明了如何构建对列表进行操作并使用算术函数的谓词。现在,您可以构建所需的函数了。

这里是对您的问题的完整答案,因为您似乎有一个从何处开始的问题。自学是很重要的,因此你可以通过使用和得出正确的答案。但是这些都是高级谓词,所以让我们从头开始,实现基本功能

第一:如何将元素附加到列表中。您可以将某些内容作为列表的头[head | list],也可以使用内置的谓词append/2,但您可以自己轻松实现它。请注意,变量以大写字母开头

?- List=[1,2,3,4], Head = 0, Out=[Head|List].
Head = 0,
List = [1, 2, 3, 4],
Out = [0, 1, 2, 3, 4].

?- List2=[1,2,3,4], List1 = [0], append(List1,List2,Out).
List1 = [0],
List2 = [1, 2, 3, 4],
Out = [0, 1, 2, 3, 4].
您可以将元素添加到列表中

如果您想实现自己的谓词(它在列表上工作),您可以使用内置谓词,也可以自己实现。我们将做第二个减法的例子,从最后一个元素中减去所有元素

我们的谓词减法/2需要两个属性:一个列表输入和一个返回值输出

如果列表只有一个元素[H],则返回该元素。否则,将列表拆分为Head元素和Rest列表[Head | Rest],计算列表Rest Tmp的减法值并从中减去Head:

测试:


工作,不完美,但工作。现在您知道了如何将元素添加到列表中,并有了一个示例,说明了如何构建对列表进行操作并使用算术函数的谓词。现在,您可以构建所需的函数。

您需要遍历列表,并在元素之间计算乘积和总和。给定乘积和和和的中性元素分别为1和0:

请注意,我们要求列表至少有一个元素。辅助积和列表/6执行积和和的实际计算:

product_sum_list([], Last, Product0, Product, Sum0, Sum) :-
    Product is Product0 * Last,
    Sum is Sum0 + Last.
product_sum_list([Next| Tail], Current, Product0, Product, Sum0, Sum) :-
    Product1 is Product0 * Current,
    Sum1 is Sum0 + Current,
    product_sum_list(Tail, Next, Product1, Product, Sum1, Sum).
通过在列表的首尾之间拆分列表,将尾部移动到辅助谓词的第一个参数,我们利用了Prolog系统的通用性提供的第一个参数索引,以避免创建虚假的选择点

电话示例:

| ?- product_sum_list([1,7,0,1,2,3,5], L). 

L = [0,19,1,7,0,1,2,3,5]

yes

正如David所建议的,使用映射和折叠列表的元谓词可以获得相同的结果。但是,考虑到我们需要同时计算乘积和求和,直截了当的解决方案更简单、更有效。

您需要遍历列表,并在元素之间计算乘积和求和。给定乘积和和和的中性元素分别为1和0:

请注意,我们要求列表至少有一个元素。辅助积和列表/6执行积和和的实际计算:

product_sum_list([], Last, Product0, Product, Sum0, Sum) :-
    Product is Product0 * Last,
    Sum is Sum0 + Last.
product_sum_list([Next| Tail], Current, Product0, Product, Sum0, Sum) :-
    Product1 is Product0 * Current,
    Sum1 is Sum0 + Current,
    product_sum_list(Tail, Next, Product1, Product, Sum1, Sum).
通过在列表的首尾之间拆分列表,将尾部移动到辅助谓词的第一个参数,我们利用了Prolog系统的通用性提供的第一个参数索引,以避免创建虚假的选择点

电话示例:

| ?- product_sum_list([1,7,0,1,2,3,5], L). 

L = [0,19,1,7,0,1,2,3,5]

yes

正如David所建议的,使用映射和折叠列表的元谓词可以获得相同的结果。但是,考虑到我们需要同时计算乘积和求和,直接的解决方案更简单、更有效。

一个常见的Prolog习惯用法是使用helper谓词,它需要额外的参数来维护状态。这些还可以帮助您获得尾部递归,从而不消耗堆栈

将列表相乘的简单方法可能是:

multiply( []     , 0 ) .  % The empty list has a product of zero.
multiply( [P]    , P ) .  % A list of length 1 is the value of the singleton element.
multiply( [N|Ns] , P ) :- % To compute the product of a list of length > 1...
  multiply(Ns,T),         % - recursively multiply the tail of the list, then 
  P is N * T              % - multiply the head by the product of the tail
  .                       % Easy!
求和会很好 除了所涉及的操作外,其他操作几乎完全相同

[注意:如果列表足够长,由于堆栈溢出,此操作最终将失败。]

使用辅助谓词1使其尾部递归,这意味着它不会在一个长的列表中爆炸和消亡,而2将促进求和和和乘法的结合。“helper”实现如下所示:

?- tp4([1,7,0,1,2,3,5], L).
L = [210,19,1,7,0,1,2,3,5]
multiply( []     , 0 ) .
multiply( [N|Ns] , P ) :- multiply(Ns,N,P).

multiply( []     , P , P ) .
multiply( [N|Ns] , T , P ) :-
  T1 is T * N ,
  multiply( Ns, T1, P )
  .
求和,再一次,几乎是一样的

现在,我们可以将它们结合起来,以获得您想要的:

multiply_and_sum( []     , [0,0]    ) .
multiply_and_sum( [N|Ns] , [P,S|Ns] ) :-
  multiply_and_sum( Ns, N, N, P, S )
  .

multiply_and_sum( []     , P, S, P, S ) .
multiply_and_sum( [N|Ns] , X, Y, P, S ) :-
  X1 is X * N,
  Y1 is Y + N,
  multiply_and_sum( Ns, X1, Y1, P , S )
  .

一个常见的Prolog习惯用法是使用helper谓词,它接受额外的参数来维护状态。这些还可以帮助您获得尾部递归,从而不消耗堆栈

将列表相乘的简单方法可能是:

multiply( []     , 0 ) .  % The empty list has a product of zero.
multiply( [P]    , P ) .  % A list of length 1 is the value of the singleton element.
multiply( [N|Ns] , P ) :- % To compute the product of a list of length > 1...
  multiply(Ns,T),         % - recursively multiply the tail of the list, then 
  P is N * T              % - multiply the head by the product of the tail
  .                       % Easy!
除了所涉及的运算外,求和几乎是一样的

[注意:如果列表足够长,由于堆栈溢出,此操作最终将失败。]

使用辅助谓词1使其尾部递归,这意味着它不会在一个长的列表中爆炸和消亡,而2将促进求和和和乘法的结合。“helper”实现如下所示:

?- tp4([1,7,0,1,2,3,5], L).
L = [210,19,1,7,0,1,2,3,5]
multiply( []     , 0 ) .
multiply( [N|Ns] , P ) :- multiply(Ns,N,P).

multiply( []     , P , P ) .
multiply( [N|Ns] , T , P ) :-
  T1 is T * N ,
  multiply( Ns, T1, P )
  .
求和,再一次,几乎是一样的

现在,我们可以将它们结合起来,以获得您想要的:

multiply_and_sum( []     , [0,0]    ) .
multiply_and_sum( [N|Ns] , [P,S|Ns] ) :-
  multiply_and_sum( Ns, N, N, P, S )
  .

multiply_and_sum( []     , P, S, P, S ) .
multiply_and_sum( [N|Ns] , X, Y, P, S ) :-
  X1 is X * N,
  Y1 is Y + N,
  multiply_and_sum( Ns, X1, Y1, P , S )
  .

看看maplist/2和foldl/4。我对prolog不太熟悉maplist/2和foldI/4是什么意思?如果prolog中有foldl/4,它们实际上就是你需要的元谓词。检查一下:这似乎是一个关于正确构造列表参数的练习。您是否已经有列表汇总/2和列表汇总/2?然后在tp4/2的头部提供这些结果,结果不是应该是[0,19,1,7,0,1,2,3,5]吗?在列表中间有一个零…看看MaPLIST/2和FordL/4.IM在Prolog上的新意思,你是指Maulist/ 2和FoLDI/4?它们是元谓词,如果Prolog有,你只需要FLDL/4。检查一下:这似乎是一个关于正确构造列表参数的练习。您是否已经有列表汇总/2和列表汇总/2?然后在tp4/2的头部提供这些结果,结果不是应该是[0,19,1,7,0,1,2,3,5]吗?在列表的中间有一个零……Eu Simulo Qua- Na乘法器,O 0 Mo o 0 Mo o Po So So PrO Pr O Pr Ximo N.Melo,PARA OrdReTADO n席o SR 0。O código que eu tenho atéaquiéO seguinte:soma[],0。体细胞[H | T],L:-体细胞,X,L是X+H。倍数[],1。乘法[H | T],L:-H=\=0,乘法,X,L是X*H。乘法[H | T],L:-H==0,乘法,X,L是X。tp4[H | T],[multiple,soma,H | T]:-tp4 eu queria meter agora tudo numa lista,o resultatado da multipliaço,a soma e lista。我是não sei como o fazer@Paulo Moura在评论中用你的代码编辑这个问题。欧盟对número 0的多重性要求是通过Púximo número,对núser0的决议。O código que eu tenho atéaquiéO seguinte:soma[],0。体细胞[H | T],L:-体细胞,X,L是X+H。倍数[],1。乘法[H | T],L:-H=\=0,乘法,X,L是X*H。乘法[H | T],L:-H==0,乘法,X,L是X。tp4[H | T],[multiple,soma,H | T]:-tp4 eu queria meter agora tudo numa lista,o resultatado da multipliaço,a soma e lista。我是não sei como o fazer@Paulo Moura在评论中用你的代码编辑问题。