计算面积切线周长 - Prolog

时间:2017-10-25 19:14:55

标签: 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(4, [1,1,1,1], R).
R = 0.162050807568877130000 ;
R = 0.162050807568877130000 ;
R = 0.162050807568877130000 ;
R = 0.162050807568877130000.

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

2 个答案:

答案 0 :(得分:3)

这个版本不足以满足您的需求吗?

<?php
$lines= array(1, 2, 3, 4, 5);
function lineOne($line){
     if($line == null ){ $line = 1; }
     if( in_array($line, $lines) ){
          $line = rand(6, 10);
          lineOne($line);
          break;
      }
     echo $line;
}
lineOne();
?>

或许这个?

as([H|_], A):- 
  A is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2.
as([_|T], A) :- as(T, A).
  1. 我不明白为什么你需要担心area(H, Area) :- Area is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2. as(List, Area) :- member(Ratio, List), area(Ratio, Area).
  2. 匹配NN会导致冗余。你不应该重复你的公式。
  3. 你有很多单身错误:头部是[X],然后身体里的_T无效。
  4. 您正在将T传递给递归调用,这不会导致它被评估 - 但您已经在前一个表达式中评估了N1-1,因此请在此处传递N-1。同样,我根本没有看到这一点。
  5. 我认为使用N1而不是添加或减去一个是个好主意,因为它适用于两个方向(当然在这里不相关)。
  6. 将列表遍历与计算结合起来感觉有点蠢。我通常会将事情分解,以便在可以完成的情况下将计算与数据结构分开。这是编程的通用格言。

答案 1 :(得分:2)

既然你想计算每次测量的面积,那么获得与无线电测量列表相对应的区域列表是不合适的呢?你的谓词结构为/ 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].