2017-10-25 14 views
2

지역을 계산하는 다음과 같은 기능이 있습니다.영역 계산 접선 원주자 - 프롤로그

세 개의 매개 변수를받습니다. 첫 번째는 사례 수를 나타내는 n이고, 둘째는 원주의 라디오를 나타내고, 세 번째는 결과를 돌려줍니다.

첫 번째 입력이 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

술어는 ** 소문자로 시작해야 **. –

+1

아마도 재귀 호출은'(N1-1, T, A)'대신에'as (N1, T, A)'가되기를 원할 것입니다. 'as/3'에 대한 첫 번째 논의의 목적은 무엇입니까? 비어있을 때까지 목록을 처리 할 수있는 것 같습니다. 그 목록에있는 모든 첫 번째 절을 삭제할 수 있다고 생각합니다. 일단 목록이 비어지면 아무 것도 일치하지 않을 것이기 때문입니다. –

+0

두 번째 인수 목록의 길이와 중복되는 정보가 아닌가? –

답변

3

가 있는가 이 버전이 당신의 필요에 충분하지 않은 이유는 무엇입니까?

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

아니면 이럴 수 있습니까? 당신이 약 N 전혀 걱정할 필요가 왜

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. 이해가 안 돼요.
  2. N[X]을 모두 일치 시키면 중복됩니다. 수식을 반복해서는 안됩니다.
  3. 싱글 톤 오류가 많습니다. _T이 머리에 있고, T이 작동하지 않습니다.
  4. 재귀 호출에 N1-1을 전달하면 평가되지는 않지만 이전 표현식에서 N-1을 이미 평가 했으므로 여기서 N1을 전달하십시오. 다시 말하지만, 나는이 점을 전혀 보지 못했다.
  5. 두 방향 모두에서 작동하기 때문에 하나를 더하거나 뺄 때 succ(N1, N)을 사용하는 것이 좋습니다. (물론 여기서는 관련이 없습니다.)
  6. 목록 탐색과 나와 계산을 결합하는 것이 다소 어려워 보입니다. 나는 일반적으로 계산을 데이터 구조와 분리하여 수행 할 수 있도록해야합니다. 이것은 프로그래밍의 보편적 인 격언입니다.
2

모든 측정을위한 면적을 계산하고 싶으므로 무선 측정 목록에 해당하는 영역 목록을 얻는 것이 적절하지 않습니까? 당신의 술어의 구조는/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 

이 술어를 쿼리 원하는 결과를 얻을 수 있지만 목록에 : : 그리고 당신은 쉽게 maplist/3 사용하여 해당를 달성 할 수

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