List 计算面积切线周长-序言
我有以下计算面积的函数 它接收三个参数,第一个是表示案例数量的n,第二个是表示周长的比值,第三个是返回结果的l 我的问题是,当第一个输入大于1时,它不工作 这是我的代码: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)
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政策,该帖子的非故意破坏版本是已分发的版本。因此,任何故意破坏行为都将被恢复。请不要通过故意破坏您的帖子来为人们做更多的工作。如果您想将此帖子与您的帐户解除关联,请参阅