2010-07-19 53 views
2

計數定子句語法遞歸我有以下的Prolog明確子句語法:Prolog中

s-->[a],s,[b]. 
s-->[]. 

這將導致在如[A,A,B,B]在相對被接受像字[一個字,b,A,b]。簡而言之,語法顯然是一個^ n b^n。現在我想將n返回給用戶。我如何計算n?

回答

3
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. 
+0

這正是,我想有! :) – ubuntudroid 2010-07-19 09:03:19

+0

查詢'? - 短語(s(0),Xs).'不終止。這應該。 – repeat 2015-07-23 12:12:55

2
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 
2

的答案by @thequarkby @LittleBobbyTables做工精細與地面字符串使用時。

但是如果它們的長度沒有限制,就像下面的查詢一樣呢?

?- phrase(s(3),_).    % expected: success 
%         observed: no answer(s) 

?- phrase(s(-10),_).    % expected: failure 
%         observed: no answer(s) 

我們當然希望像上面那樣的查詢能夠普遍終止! 讓我們用寫:

:- 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.