List 计算面积切线周长-序言

List 计算面积切线周长-序言,list,prolog,area,List,Prolog,Area,我有以下计算面积的函数 它接收三个参数,第一个是表示案例数量的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)

我有以下计算面积的函数

它接收三个参数,第一个是表示案例数量的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([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).
  • 我不明白你为什么要担心
    N
  • 同时匹配
    N
    [X]
    会导致冗余。你不应该重复你的公式
  • 你有很多单例错误:
    \u T
    在头部,然后
    T
    在身体,这将不起作用
  • 您正在将
    N1-1
    传递给递归调用,这不会导致对其求值,但您已经在上一个表达式中求值了
    N-1
    ,因此只需在此处传递
    N1
    。再说一次,我完全不明白这有什么意义
  • 我认为使用
    succ(N1,N)
    而不是加减一是一个好主意,因为它在两个方向上都起作用(当然这里不相关)
  • 对我来说,将列表遍历与计算结合起来感觉有点恶心。一般来说,我会将事情分解,以便在可以完成的范围内,将计算与数据结构分开。这是编程的普遍准则

  • 既然您希望计算每个测量的面积,那么获得与无线电测量列表相对应的面积列表不是很合适吗?谓词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].
    

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