保持邏輯上純,很容易:使用元謂詞 tcount/3
亦隨物化型測試謂詞number_t/2
(簡稱number_truth/2
):
number_t(X,Truth) :- number(X), !, Truth = true.
number_t(X,Truth) :- nonvar(X), !, Truth = false.
number_t(X,true) :- freeze(X, number(X)).
number_t(X,false) :- freeze(X,\+number(X)).
讓我們運行查詢OP建議:
?- tcount(number_t,[1,2,c,h,4],N).
N = 3. % succeeds deterministically
請注意,這是單調的:延遲變量綁定總是l聽起來很健康。試想一下:
?- tcount(number_t,[A,B,C,D,E],N), A=1, B=2, C=c, D=h, E=4.
N = 3, A = 1, B = 2, C = c, D = h, E = 4 ; % succeeds, but leaves choice point
false.
最後,讓我們看一些下面相當一般查詢的答案:
?- tcount(number_t,[A,B,C],N).
N = 3, freeze(A, number(A)), freeze(B, number(B)), freeze(C, number(C)) ;
N = 2, freeze(A, number(A)), freeze(B, number(B)), freeze(C,\+number(C)) ;
N = 2, freeze(A, number(A)), freeze(B,\+number(B)), freeze(C, number(C)) ;
N = 1, freeze(A, number(A)), freeze(B,\+number(B)), freeze(C,\+number(C)) ;
N = 2, freeze(A,\+number(A)), freeze(B, number(B)), freeze(C, number(C)) ;
N = 1, freeze(A,\+number(A)), freeze(B, number(B)), freeze(C,\+number(C)) ;
N = 1, freeze(A,\+number(A)), freeze(B,\+number(B)), freeze(C, number(C)) ;
N = 0, freeze(A,\+number(A)), freeze(B,\+number(B)), freeze(C,\+number(C)).
啊我看,這工作得非常好。謝謝,但是,如果我想避免使用內置的謂詞,你能指出我正確的方向嗎?就像在現有代碼中實現「只使用數字」一樣。從我看到的情況看來,只有在諮詢序言的時候,你可以使用數字/ 1,這是真的嗎? – Majusbeh 2013-04-21 16:49:11