我有以下Prolog明确条款语法:
s-->[a],s,[b].
s-->[].
这将导致像[a,a,b,b]这样的单词被接受与[a,b,a,b]之类的单词相反。简而言之,语法显然是一个^ n b ^ n。现在我想将n返回给用户。我该如何计算n?
答案 0 :(得分: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.
答案 1 :(得分: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 :(得分:2)
答案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.