2014-05-16 5 views
1

항목, 목록 및 숫자를 허용하는 프롤로그의 조건자를 올바르게 작성하려고 시도하고 해당 항목이 해당 횟수만큼 목록에 있는지 확인합니다. 예를 들어프롤로그의 조건 자에 문제가 발생했습니다.

count(7,[3,7],X). 

X=1입니다.

count(7,[3,7],1). 

이 내가

count_occur(A,[0|B],D). 
count_occur(A,[A|C],D) :- count_occur(A,C,D1), D is D1+1. 
count_occur(A,[B|C],D) :- count_occur(A,C,D). 

나는 프롤로그 아주 새로운 오전 정말 프로그래밍 패러다임을 이해하는 데 어려움을 겪고 지금까지 무엇을 가지고 true

반환합니다.

내가하려고하는 것은 목록의 첫 번째 항목이 D를 증가시키고 목록의 나머지 부분과 다시 비교할 경우 전달 된 값 (A)과 일치하는지 확인하는 것입니다. 이것은 내가 어쨌든 혀짤음이나 다른 언어로 그것을하는 방법이다. 약간의 도움을 사용할 수 있었는지, 잠시 동안 이것에 있었고 단지 나를 위해 클릭하지 않았습니다.

+0

첫 번째 줄의 목적은 무엇입니까? 빈 목록이있는 경우를 처리해야합니다. –

답변

1

나는 그것을 테스트하기 위해 지금 프롤로그가없는,하지만 난 그런 식으로 그것을 시도 할 것 :

count_occur(A, [], 0). 
count_occur(A, [A|T], D):- count_occur(A, T, D1), D is D1 + 1. 
count_occur(A, [B|T], D):- A \= B, count_occur(A, T, D). 

아이디어는 목록이 비어있는 경우, 각 요소의 0 발생 있다는 것입니다. 나머지는 내가 옳다고 생각하는 것과 거의 비슷합니다.

유일한 차이점은 A \= B입니다. 즉 A \neq B을 의미합니다. 그렇지 않으면 A == B을 수락 할 것이므로 count_occur(3, [3], 0).이 참일 수 있습니다. 그 점을 확인해야합니다.

도움이 되었기를 바랍니다.

+0

어쨌든 고마워요. A/B 부분은 필요하지 않았으므로, 그것이 작동하도록하기 위해 첫 번째 사실을 변경해야한다는 것을 의미합니다. 지금 D를 0으로 변경하면 기본 케이스에서 어떻게 될지 알 수 있습니다. 그러나 프롤로그가 어떻게 목록에 하나의 항목 만있는 경우를 해결할 수 있는지 궁금합니다. count_occur (7, [7], X)와 같은 호출에는 B와 T 또는 A와 T에 바인드 할 목록에 두 개의 값이 없기 때문에 적용되는 규칙이 없을까요? 그것은 작동하지만 나는 아직 어떻게 왔는지 이해하지 못한다. – user3538411

+0

글쎄, 내가 기억하는 한 [7]은 [7 | []]와 같으므로이 두 번째 규칙으로갑니다. 'A/= B'에 관해서는 적어도 구현 한 내용이 입니까? - count_occur (3, [3], 0). 나는 정확하지 않다고 생각하는 입니다. –