Prolog中确定子句语法递归的计数

Prolog中确定子句语法递归的计数,prolog,grammar,dcg,clpfd,Prolog,Grammar,Dcg,Clpfd,我有以下序言明确从句语法: s-->[a],s,[b]. s-->[]. 这将导致像[a,a,b,b]这样的词被接受,与像[a,b,a,b]这样的词相反。简而言之,语法显然是a^nb^n。现在我想把n返回给用户。如何计算n 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 =

我有以下序言明确从句语法:

s-->[a],s,[b].
s-->[].
这将导致像[a,a,b,b]这样的词被接受,与像[a,b,a,b]这样的词相反。简而言之,语法显然是a^nb^n。现在我想把n返回给用户。如何计算n

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
需要为DCG非终端提供参数。请注意,等式的工作原理与命令式编程语言的赋值不同,因此使用了X是Y+1

一些示例输出:

s(X,[a,b,b,b],[]).
false.

s(X,[a,a,a,b,b,b],[]).
X = 3 ;
false.
当与地弦一起使用时,答案和答案很好地工作

但是,如果它们的长度没有限制,比如在下面的查询中,该怎么办

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

这正是我想要的!:)查询
?-短语(s(0),Xs)。
不会终止。应该这样。
?- 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.