>

프롤로그에서 if 문이나 루프를 사용하는 방법을 이해하려고 노력하고 있지만 다른 상황이 많기 때문에 얻을 수 없습니다. 예 : 자바에서 쉽게 말할 수있는 것을 말하고 싶다면 if(x>=4) { } else if { }   (x>4) 까지 루프 동안 무언가를하고 싶다면 . 프롤로그에는 많은 문제가 있습니다. 알려주세요. 나는 숫자가있는 1 개의 list1이 있고 list2가 있다고 말하는 운동을 봅니다. 내가해야 할 일은 List1의 모든 숫자가 최대 10이어야하는 새 list2를 만들어야하지만 list2에서 각 숫자의 두 번 표시되어야합니다. 더 명확하게 설명 해야하는 것, list1에는 14라고 말하는 숫자가 있고 10보다 크므로 list2에서는 14,14 여야합니다 .if 문을 작성하거나 목록과 같은 루프를 예를 들어 어떻게 만들 수 있습니까? 충분히 읽었지만이 언어는 적어도 나에게 이상합니다. 예를 들어 if 문을 배웠지만이 경우에는 사용할 수 없습니다. 여기에서 검색했지만 스위트는 없습니다. 제발, 당신이 그것을 정리할 수 있다면 if 문과 루프가 좋은 설명을 제공하여 프롤로그에 들어갑니다. 프롤로그에서 시작하는 사람에게 더 이해하기 쉽도록 java if 문이나 루프와 같이 "유사한"을 작성하는 것이 도움이 될 것입니다.

doubles(List1,List2)

  • 답변 # 1

    댓글을 달려고했지만 댓글이 길어졌습니다!

    대부분의 Prolog 초보자가 가진 가장 큰 문제는 "이 다른 언어에서 X를하는 것처럼 Prolog에서 X를하는 방법"이라는 관점에서 생각한다는 것입니다. 프롤로그가 다른 언어와 전혀 다르기 때문에 여러 번 실패합니다. 예, 당신은 그것을 강요 할 수 있지만 결국에는 매우 잘못 작성된 Prolog 프로그램으로 끝납니다. 대신, 원래 문제에 대해 생각하고 프롤로그 작동 방식 측면에서 문제를 다시 변환해야합니다. Prolog에서는 컴퓨터에 일련의 단계를 사용하여 수행 할 작업 (제한적)을 지시하는 함수가 아니라 논리 및 산술 관계 (선언적)를 설명하는 사실과 규칙을 선언합니다. 이것은 Prolog의 "문제"가 아닙니다. 문제는 초보자가 Prolog를 이해하지 못한다는 것입니다.

    Prolog 용어로 문제를 설명해 봅시다. 두 번째 목록이 첫 번째의 요소를 10보다 큰 요소와 복제하는 목록 간의 관계를 설명하는 규칙이 필요합니다. 관계 dup_greater_than_10 를 호출하겠습니다. .

    기본 사례는 간단하다 : 빈리스트 []  빈 목록의 "dup보다 큰 10"입니다 :

    dup_greater_than_10([], []).
    
    

    이제 비어 있지 않은 목록의 각 요소를 처리해야합니다. 프롤로그의 목록은 머리와 꼬리 (목록의 나머지)로 작성 될 수 있습니다. [X|Xs]  첫 번째 요소가 X 인 목록입니다.  "목록의 나머지"(꼬리)는 Xs 목록입니다. .

    X 사건에 대한 규칙을 작성합시다  이 경우 두 번째 인수는 첫 번째 인수와 동일한 머리 여야합니다.

    dup_greater_than_10([X|Xs], [X|Ys]) :-
        X =< 10,
        dup_greater_than_10(Xs, Ys).
    
    
    이 규칙은 [X|Ys]   [X|Xs] 목록의 "dup over than 10"버전입니다  만약 X =< 10  목록 Ys   Xs 목록의 "10보다 큰 dup"입니다. .

    이제 X > 10 사건에 대한 규칙이 필요합니다 . 나는 그것을 설명하고 간단한 프롤로그의 글을 당신에게 남겨 두겠습니다 :

    와이즈 비즈 와이즈 비즈  

    의 "dup보다 큰 10"입니다  만일 [X,X|Ys]  그리고 목록 [X|Xs]   X > 10 목록의 "10보다 큰 dup"입니다. .

    Ys 의 복제를 표현하는 것이 얼마나 간단한 지보십시오  목록의 머리에? 프롤로그에서 다음 목록을 작성할 수 있습니다. Xs  이것은 초기 요소 X 로 시작하는 목록입니다 [X1, X2, ..., Xn|T] , ..., X1  그리고 꼬리 X2 .

    알다시피, " Xn 는 어떻게합니까?"  진술과 T  "이 렌치로 못을 두드리는 방법은 무엇입니까?"라고 묻는 것과 같습니다. 할 수는 있지만 비효율적이며 예쁘지 않습니다. 올바른 질문은 "어떻게 이런 종류의 문제를 해결합니까? 프롤로그에 문제가 있습니까? "

    if

  • 이전 java - 파일에 쓸 수 없습니다
  • 다음 java - 이진 파일에서 배열로 객체를 읽는 중 ClassCastException