【问题标题】:Calculate Area Tangent Circumferences - Prolog计算面积切线周长 - Prolog
【发布时间】:2018-04-07 00:21:18
【问题描述】:

我有以下计算面积的函数。

它接收三个参数,第一个是n代表案例数,第二个代表圆周率,第三个是l给我返回结果。

我遇到的问题是,当第一个输入大于 1 时它不起作用。

这是我的代码:

as(1, [X], A) :-
   A is (sqrt(3.0) * (X*X)) - (3.14 * (X*X))/2.
as(N, [H|_T], A) :-
   A is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2,
   N1 is N-1,
   as(N1-1, T, A).     

它应该如何工作的一个例子是:

?- as(4, [1,1,1,1], R).
R = 0.162050807568877130000 ;
R = 0.162050807568877130000 ;
R = 0.162050807568877130000 ;
R = 0.162050807568877130000.

如果你能帮助我,我将不胜感激......

【问题讨论】:

  • 谓词应该以小写开头。
  • 您可能希望递归调用为as(N1, T, A) 而不是as(N1-1, T, A)as/3 的第一个参数的目的是什么?似乎您可以只处理列表直到它为空。我认为在这种情况下您可以删除整个第一个子句,因为一旦列表为空,它将不匹配任何内容。
  • 第二个参数列表的长度不是数字冗余信息吗?
  • 通过在 Stack Exchange (SE) 网络上发帖,您已根据 CC BY-SA 3.0 license 授予 SE 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 SE 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。请不要通过破坏您的帖子来为人们做更多的工作。如果您想取消此帖子与您的帐户的关联,请参阅What is the proper route for a disassociation request?

标签: list prolog area


【解决方案1】:

此版本无法满足您的需求是否有原因?

as([H|_], A):- 
  A is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2.
as([_|T], A) :- as(T, A).

或者这个?

area(H, Area) :- 
  Area is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2.
as(List, Area) :- member(Ratio, List), area(Ratio, Area).
  1. 我完全不明白你为什么要担心N
  2. 同时匹配N[X] 会导致冗余。您不必重复您的公式。
  3. 你有很多单例错误:_T 在头部,然后T 在正文中,这将不起作用。
  4. 您正在将N1-1 传递给递归调用,这不会导致它被评估——但您已经在前面的表达式中评估了N-1,所以只需在此处传递N1。再说一次,我根本看不出这有什么意义。
  5. 我认为使用succ(N1, N) 而不是加减一个是个好主意,因为它可以双向工作(当然,这里不相关)。
  6. 对我来说,将列表遍历与计算结合起来感觉有点恶心。我通常会将事情分解,以便计算与数据结构分开,只要可以做到这一点。这是编程的普遍准则。

【讨论】:

    【解决方案2】:

    既然您无论如何都想计算每次测量的面积,那么获取与无线电测量列表相对应的区域列表不是合适的吗?您的谓词 as/3 的结构似乎表明您正在按照这些思路进行思考。您可以使用 maplist/3 轻松实现:

    :- use_module(library(apply)).   % needed for maplist
    
    % a single measurement and the corresponding area
    area(X, A) :-
       A is (sqrt(3.0) * (X*X)) - (3.14 * (X*X))/2.
    
    areas(Xs,As) :-
       maplist(area,Xs,As).          % area/2 mapped to Xs results in As 
    

    查询此谓词会产生所需的结果,但会出现在列表中:

    ?- areas([1,1,5,3],As).
    As = [0.16205080756887713, 0.16205080756887713, 4.051270189221931, 1.4584572681198935].
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 2022-12-17
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2021-04-18
      相关资源
      最近更新 更多