2017-12-18 13 views
0

Example of trace produced.L2의 모든 요소가 L1 (즉, L1 = [1, 2, 3]이고 L2 = [2, 4, 6] 인 경우 해당 요소의 두 배인 술어 listDouble(L1, L2)을 작성하려고합니다. 그것은, 그러나프롤로그 - 각 값을 두 배로 늘린 후 원래 목록에서 요소의 새 목록 만들기?

listDouble([], [L2]). 
listDouble([H|T], [L2|_]):- 
     L is H * 2, 
     listDouble(T, [L]). 

하지의 작업과 나는 L2에 각 요소의 두 배를 추가하는 방법을 이해하는 데 어려움을 겪고 있다고 생각 :)이 내 코드는 지금까지입니까?

+0

단일 변수 경고가 표시되지 않습니까? 구조는 괜찮아 보입니다. 변수 이름의 분포를 다시 생각하면됩니다. –

+0

@TomasBy 몇 가지 싱글 톤 변수 경고가 나타납니다. 그러나 올바르게 구성하지 않았기 때문에 그럴 수도 있다고 생각했습니다. L2는 L1에있는 요소의 목록을 의미하지만 각 요소는 두 배로 늘어납니다. 즉 L1 = [1, 2, 3]이면 L2 = [2, 4, 6] – Carol

+0

경고입니다. 프롤로그에서 치명적인 오류를 나타냅니다. 제가 생각하기에 문제를 이해합니다. 기본 케이스에 문제가 있음을 깨닫게하려고했습니다. –

답변

1
listDouble([],[]). 
listDouble([H|T], [D|L]):- 
     D is H * 2, 
     listDouble(T,L). 
+0

오, 알았어, 고마워! – Carol

+0

@Carol 이것은 Prolog에서 매우 공통적 인 패턴으로, 목록을 반복하고 해당 요소를 해당 목록에 매핑합니다. 그래서, 당신을 위해 이것을 할'maplist'라는 ISO 술어가 있습니다. 값을 두 배로하는 술어를 정의하면'maplist'를 사용할 수 있습니다. 예를 들어'double (X, D) : - D는 X * 2.'이고'listDouble (List, DList) : - maplist (double, List, DList) '입니다. – lurker