당신이 그것을 할 수있는 방법과 보존 logical-purity! 다음에
, 우리는 메타 술어 (
splitlistIfAdj/3
,
tfilter/3
및
maplist/3
)을 사용하는 용어 평등/불평등 술어 (
(=)/3
및
dif/3
)을 구체화. 실행
Xs1
의
?- Xs0 = [a,a,a,b,a,b,a,a,b,a,a,a,a], splitlistIfAdj(dif,Xs0,Xs1).
Xs0 = [ a,a,a, b, a, b, a,a, b, a,a,a,a ],
Xs1 = [[a,a,a],[b],[a],[b],[a,a],[b],[a,a,a,a]].
목록 : Xs1
는 실행 항목의Xs0
에서를 포함 할 수
첫째 :
의이 E = a
및 Xs0 = [a,a,a,b,a,b,a,a,b,a,a,a,a]
을 가지고 단계별로 count/3
단계를 구축하자 모두 실행 중입니다. Xs2
에는 관심있는 앱만 포함되어 있습니다.
?- Xs1 = [[a,a,a],[b],[a],[b],[a,a],[b],[a,a,a,a]], tfilter(\[X|_]^(X=a),Xs1,Xs2).
Xs1 = [[a,a,a],[b],[a],[b],[a,a],[b],[a,a,a,a]],
Xs2 = [[a,a,a], [a], [a,a], [a,a,a,a]].
거의 완료되었습니다. 마지막으로, 우리는 각각의 실행에 Xs2
(E
-runs의 목록을)지도 Xs
길이 :
?- Xs2 = [[a,a,a],[a],[a,a],[a,a,a,a]], maplist(length,Xs2,Xs).
Xs2 = [[a,a,a],[a],[a,a],[a,a,a,a]],
Xs = [ 3, 1, 2, 4].
이제
, 코드의 완성!
count(E,Xs0,Xs) :-
splitlistIfAdj(dif,Xs0,Xs1),
tfilter(E+\[X|_]^(X=E),Xs1,Xs2), % works for _any_ item E
maplist(length,Xs2,Xs).
의 일부 쿼리를 실행하자 : 코드 모노톤이므로
?- count(a,[a,a,a,a,b,a,a,a],Xs).
Xs = [4,3]. % succeeds deterministically
?- count(a,[a,a,a,b,a,b,a,a,b,a,a,a,a],Xs).
Xs = [3,1,2,4]. % succeeds deterministically
을, 우리는 너무,보다 일반적인 쿼리에 대한 논리적으로 사운드 답변를 얻을 :
이 ?- count(E,[a,a,a,b,a,b,a,a,b,a,a,a,a],Xs).
Xs = [3,1,2,4], E = a ;
Xs = [1,1,1], E = b ;
Xs = [], dif(E,a), dif(E,b) .
귀하의 질문은 상당히 모호하므로 입력을 위해 3 : 2 대신에 4 개의 인수를 사용하고, 출력에는 1, 현재 마비에는 1을 사용합니다. 요소가 발견되었습니다 (초기 값은 0). – Steven
@ 케이, 실제로 내가 입력 한 목록에는 두 개의 다른 요소가 포함되어 있습니다. 하나만 계산하면 결과는 그 요소를 계산해야합니다. 예를 들어 입력 수 (a, [a, a, b, a, b, a, a, b, a, a, a, a], X) 그리고 출력은 X = [3,1,2,4] –