2014-06-19 5 views
0

특정 값으로 합계 값으로 그룹을 발견하는 프로그램 : 예를 들어 동전프롤로그 - 나는 3 개 인수받는 프로그램을 만들고 싶어

  1. 목록 1 : [5,2,1]
  2. 값을 - 합계 우리 원하는 번호 :
  3. 이 특정 값과 합친 동전 목록 -이 목록은 목록 1의 하위 목록입니다. (예 : 4에 도달하기 위해 동일한 요소를 반복 할 수 있습니다. [2,2])
,

때문에 프로그램은이 일을해야합니다

  1. change([5,2,1],4,[2,2]) 돌아갑니다 Yes (원인은 2 + 2 = 4)

  2. change([5,2],6,Coins)이 내 시도 Coins = [2,2,2]

반환합니다 :

change(_,0,Res). 
change([X|Xs],Sum,Cs):- Sum <X, change(Xs,Sum,Cs). 
change([X|Y],Sum,[X|Res]):- Sum>=X, Sum2 is Sum - X, change([X|Y],Sum2,Res). 
+0

귀하의 질문에 정확히 무엇에주의를 지불? 첫 번째 규칙은'change (_, 0, []) .' ('Res' 대신'[]')입니다. –

+0

잘 .. 내가 그랬던 것처럼 작동하지 않아 .. – Ohad

+0

[u]로 변경해야하는 이유는 무엇입니까? 나는 그렇게 생각하지 않는다. 0을 얻으려면 일단 값을 얻으려면 필요한 설정을해야합니다. – Ohad

답변

1

첫 번째 규칙의 마지막 인수로 Res[]으로 변경해야합니다. 또한 동일한 결과를 여러 번 가져 오지 않도록 동일한 규칙에 잘라 내기 연산자를 추가해야합니다.

change(_, 0, []):-!. 
change([X|Y], Sum, [X|Res]):- 
    Sum >= X, !, % remove the cut operator to get all solutions 
    Sum2 is Sum - X, 
    change([X|Y], Sum2, Res). 
change([_|Xs],Sum,Cs):- 
    change(Xs, Sum, Cs). 
+0

실행하면 구문 오류가 발생하며 목록이 정렬되어 있다고 가정 할 수 없습니다. – Ohad

+0

응답의 코드 때문에 구문 오류가없는 것으로 확신합니다. 하지만 모든 솔루션이 필요합니까 아니면 가장 큰 동전이 필요한 솔루션입니까? –

+0

컴퓨터에서 잘 작동합니까? 나는 첫 번째 대답을 생산하기 위해 그것을 필요로한다. 반드시 큰 동전은 필요하지 않다 .. – Ohad

1

목록에서 요소를 '추측'하는 것은 member/2를 사용하여 수행 할 수 있습니다.

그냥 종료

change(_,0,[]). 
change(Coins,Sum,[C|Cs]) :- 
    Sum > 0, member(C, Coins), Rest is Sum-C, change(Coins,Rest,Cs). 
관련 문제