2014-03-04 4 views
1
my_list([this,is,a,dog,.,what,is,your,name,?,i,simply,adore,you,!]). 

count(_, [], 0) :- !. 
count(X, [X|Q], N) :- !, count(X, Q, N1), N is N1+1. 
count(X, [_|Q], N) :- count(X, Q, N). 


number_of_sentence(N) :- my_list(L),count(.,L,N). 
number_of_sentence(N) :- my_list(L),count(?,L,N). 
number_of_sentence(N) :- my_list(L),count(!,L,N). 

에 (을 my_list) 1 긍정적 인, 1 개 질문 1 문장의 세 가지 유형의 다른 규칙의 출력이되는 추가하고 난 지금이 ​​감탄 목록에 위의 코드에서 프롤로그

?- number_of_sentence(N). 
N = 1 ; 
N = 1 ; 
N = 1. 

을 수행 할 때 당신의 프롤로그 라이브러리 (aggregate)가있는 경우 난 당신이 할 수있는 N의 값을 추가하고 ...... "총 = 3" 가 하나라도 제발 도움이 될 수 있습니다

+0

이미있는 'count' 조건부를 사용하여 솔루션을 만들 수 있습니다. 'count '의'X' 인자가 하나의 원소 인 대신'L'리스트로 만드십시오. '[X | Q]'를 반복 할 때마다'X'가'L'의 멤버라면, 카운트를 증가시킵니다. 그러면'count ([.,?,!], L, N)로 호출 할 수 있습니다 .' – lurker

답변

1

를 표시 할 수있는 방법

?- aggregate(sum(C), (my_list(L), (count(.,L,C);count(?,L,C);count(!,L,C))), N). 

하지만 mbratch의 제안이 더 좋습니다. count/3이없는 또 다른 방법 :

?- aggregate(count, E^(my_list(L), member(E, L), memberchk(E, [.,?,!])), N). 
L = [this, is, a, dog, '.', what, is, your, name|...], 
N = 3.