2014-04-17 4 views
-1

그래서 재귀를 사용하지 않고 프롤로그를 사용하여 목록에서 단일 요소를 얻으려는 데 문제가 있습니다. 예를 들어 foreach, foreachelem 등과 같은 루프에만 의존합니다 ....프롤로그 용 목록의 요소에 어떻게 액세스합니까?

그래서 목록이 있습니다. Xs = [1,2,3], 각 요소를 개별적으로 얻고 싶습니다. 가장 좋은 나는 ... 지금까지 올이있다 한

sumOfList(Xs, Max) :- 
    (foreach(List, Xs), count(I, 1, _), param(Xs) 
     do 
      (foreach(List2, Xs), count(J, 2, _), param(Xs, I, List) 
       do 
        (List =< List2 
        -> Max is List2; 
        Max is List1 
        ) 
      ) 
    ). 

이 그래서 내가 맥스 자리의 어떤 종류를 만들려면 어떻게해야합니까, 궁금하네요 ... 내가 지금까지있어 최고입니다 최종 계산에 사용할 수 있습니까?

+0

이 일식 CLP인가? –

+0

예! 모든 도움을 주시면 감사하겠습니다 ... – user3390252

+0

루프 구조를 배우고 싶지만 정말로 최대 목록을 원하면 'Max is max (Xs)'라고 써주십시오. – jschimpf

답변

4

귀하의 질문에 대한 명확하지 않습니다. 즉, 이클립스 선언 루프와 음이 아닌 요소 목록에서 최대를 찾을 수있는 방법은 다음과 같습니다

max_with_loop(Xs, Max) :- 
    (foreach(Xi, Xs), fromto(0, MaxPrev, MaxCurr, Max) do 
     MaxCurr is max(MaxPrev, Xi)). 

흥미로운 부분은 fromto(0, MaxPrev, MaxCurr, Max)이다. 이 부분을 사용하여 반복간에 정보를 전송할 수 있습니다. 초기 MaxPrev는 루프 MaxCurr이 Max가 된 후에 MaxCrer가 MaxPrev가 될 때마다 반복 횟수가 0이됩니다.

BTW에서 ECLiPSe의 선언 루프는 구문 설탕의 일종으로, 시스템에서 재귀 호출로 변환됩니다.

업데이트 : 변형, 코멘트에 @false에 의해 제안, 또한 음수와 함께 작동 :

max_with_loop([First | Xs], Max) :- 
    (foreach(Xi, Xs), fromto(First, MaxPrev, MaxCurr, Max) do 
     MaxCurr is max(MaxPrev, Xi)). 
+0

'max_with_loop ([- 2, -1], - 1) .'은 실패합니다. – false

+0

@false 예, 제가 쓴 것처럼, 그것은 음수가 아닌 요소에 대해서만 작동합니다. –

+0

올바르게 정의하지 않는 이유는 무엇입니까? – false