2009-12-14 6 views
0

안녕 얘들 아, 내가 당신을 도울 수있는 간단한 프롤로그 질문. 기본적으로 두 개의 목록과 정수로 입력을 사용하는 함수를 작성하려고합니다. 여기서 함수는 x + y가 입력 정수와 같도록 첫 번째 목록에서 x를 찾고 두 번째 목록에서 y를 찾으려고 시도합니다. 두 개의 목록 페어링

지금까지 난 그냥 다음과 같은 일을 수행하여 아래로 재귀 할 생각입니다 :

sum([H1|T1], [H2|T2], Value) :- 
    NewVal is H1+H2 
    % Check for equality? 
    sum(List1, T2, Value) 
    sum(T1, List2, Value). 

그래서, 몇 가지 질문이 방법에 관한.

1) H1 | T1로 전달한 후 "전체"목록을 어떻게 참조합니까? 위 예제에서 나는 쉽게 List1과 List2라는 이름을 붙였다.

2) 평등을 확인할 수는 있지만 어떻게 검색을 중지하고 출력을 강제합니까?

답변

1

당신은 분리가 필요합니다. 즉, h1 + h2는 괜찮습니다. 그렇지 않으면 h1이없는 해결책이 있습니다. 그렇지 않으면 h2가없는 해결책이 있습니다.

불일치에 대한 프롤로그에는 두 가지 구문이 있습니다. 세미콜론 사용할 수 있습니다

sum([H1|T1], [H2|T2], Value) :- Value is H1+H2 ; sum([H1|T1], T2, Value) ; sum(T1, [H2|T2], Value). 

또는 별도의 절을 사용할 수 있습니다

sum([H1|_], [H2|_], Value) :- Value is H1+H2. 
sum([H1|T1], [_|T2], Value) :- sum([H1|T1], T2, Value). 
sum([_|T1], [H2|T2], Value) :- sum(T1, [H2|T2], Value). 
+0

아, 결국 다른 도움을 받아 세 개의 다른 절을 알아 냈습니다.하지만이 점은 훌륭하게 작성되었습니다. 감사합니다. 또한 세미콜론 연산자에 대해서도 몰랐습니다! – dhorn

1
  1. IIRC, 나는 당신이 [H1|T1]을 사용하여 매개 변수로 전체 목록을 전달할 수 있어야한다고 생각합니다.
  2. 대부분 해결책을 찾지 않으려면 Prolog cut을 사용하고 싶을 것입니다.
+0

아, 1 번에 좋은 점. 응, 내 마음이 100 % 일하지 않았나. 나는 2 번을 확인해 볼께. 고마워. – dhorn

1

1) Kaleb 맞아,이 일을 그냥 꼬리와 머리의 단점으로 목록을 재구성.
2) 제롬이 맞습니다.하지만 여기에 다른 방법이 있습니다. ...

"어떻게 멈추게합니까?" 실제로 당신의 술어의 누락 부분을 암시합니다. 현재 기본 사례가없는 재귀 조건부가 있습니다. 재귀는 중지 할 수있는 방법이 없습니다. 글쎄,이 경우에는 목록 중 하나의 끝에 도달 하겠지만, 빈 항목이 될 것이므로 머리 항목이 없으므로 용어 [H | T]와 통합 될 때 실패합니다.

목록의 특정 요소를 찾는 재귀 적 조건자를 작성할 때 솔루션을 정의하는 제약 조건을 기본에 포함시키는 것이 일반적입니다. 제롬의 해결책에서 이것을 볼 수 있습니다. 결과를 얻으면 술어가 발견되고 나중에 목록을 계속 처리하지 못하는 술어가됩니다. 그러나 당신이 그것을 역 추적하고 더 많은 해결책을 찾길 원한다면이 시점 이후에 계속 될 것입니다. 이러한 추가 솔루션에 신경 쓰지 않는다면 커팅을 사용하여 폐기 할 수 있습니다.

+0

기본적으로 절차 언어 코드의 관점에서 생각하고 Prolog로 "변환"하려고했는데 잘못된 접근입니다. 이것은 모두 좋은 정보입니다, 고마워요. – dhorn

관련 문제