計數定子句語法遞歸我有以下的Prolog明確子句語法:Prolog中
s-->[a],s,[b].
s-->[].
這將導致在如[A,A,B,B]在相對被接受像字[一個字,b,A,b]。簡而言之,語法顯然是一個^ n b^n。現在我想將n返回給用戶。我如何計算n?
計數定子句語法遞歸我有以下的Prolog明確子句語法:Prolog中
s-->[a],s,[b].
s-->[].
這將導致在如[A,A,B,B]在相對被接受像字[一個字,b,A,b]。簡而言之,語法顯然是一個^ n b^n。現在我想將n返回給用戶。我如何計算n?
s(X)-->[a],s(Y),[b],{X is Y+1}.
s(0)-->[].
一個需要給參數給DCG非端子。請注意,平等不能像命令式編程語言的賦值那樣工作,因此X使用了Y + 1。
一些樣本輸出:
s(X,[a,b,b,b],[]).
false.
s(X,[a,a,a,b,b,b],[]).
X = 3 ;
false.
s(N, M) --> [a], {N1 is N + 1}, s(N1, M), [b].
s(N, N) --> [].
s(N) --> s(0, N).
用法:
?- phrase(s(N), [a,a,a,b,b,b]).
N = 3
的答案by @thequark和by @LittleBobbyTables做工精細與地面字符串使用時。
但是如果它們的長度沒有限制,就像下面的查詢一樣呢?
?- phrase(s(3),_). % expected: success
% observed: no answer(s)
?- phrase(s(-10),_). % expected: failure
% observed: no answer(s)
我們當然希望像上面那樣的查詢能夠普遍終止! 讓我們用clpfd寫:
:- use_module(library(clpfd)).
s(0) --> [].
s(N) --> {N#>0,N#=N0+1},[a],s(N0),[b].
示例查詢:
?- phrase(s(N),[a,a,a,a,b,b,b,b]).
N = 4 ; % works like in the other answers
false.
?- phrase(s(3),Xs).
Xs = [a,a,a,b,b,b] ; % now, this works too!
false. % (terminates universally)
?- phrase(s(-10),_). % fails, like it should
false.
這正是,我想有! :) – ubuntudroid 2010-07-19 09:03:19
查詢'? - 短語(s(0),Xs).'不終止。這應該。 – repeat 2015-07-23 12:12:55