序言:识别一个^ N b ^(N + 1)的语言对于n> = 1
题
我明白,我需要找出我自己的功课,但看到的类,没有人可以计算出来的,我需要一些帮助。
写Prolog程序使得
p(X)
为真,如果X
是由n
名单a
真实接着n+1
b
的,对于任何n >= 1
。
解决方案
您应该用一个计数器来跟踪你已经发现迄今。当你找到一个b
,添加一个计数器。当你发现一个a
,减之一。您的计数器的完整列表之后的最终值遍历应该是一个,因为你想b
的数量是为1以上a
的数量。下面是如何编写的示例中代码:
% When we see an "a" at the head of a list, we decrement the counter.
validList([a|Tail], Counter) :-
NewCounter is Counter - 1,
validList(Tail, NewCounter).
% When we see an "b" at the head of a list, we increment the counter.
validList([b|Tail], Counter) :-
NewCounter is Counter + 1,
validList(Tail, NewCounter).
% When we have been through the whole list, the counter should be 1.
validList([], 1).
% Shortcut for calling the function with a single parameter.
p(X) :-
validList(X, 0).
现在,这会做的几乎的你想要什么 - 它的规则匹配所有n >= 0
,当你想为所有n >= 1
。在典型的家庭作业答案的方式,我把最后一点为你自己添加。
其他提示
我不记得如何在Prolog的代码本,但这个想法是这样的:
规则1: 如果LISTSIZE为1,如果该元素是B返回true。
规则2: 如果LISTSIZE为2,返回false。
规则3: 检查列表中的第一项是A,最后一个是B. 如果这是真的,返回元件2到LISTSIZE-1的溶液。
如果我明白你的问题正确,应该是完美的Prolog风格的解决方案。
编辑:我完全忘了这一点。我编辑的答案考虑N = 1和n = 2。由于希斯Hunnicutt的情况。
下面是我的深奥溶液
:-use_module(library(clpfd)).
n(L, N) -->
[L],
{N1 #= N-1
},
!, n(L, N1).
n(_, 0) --> [], !.
ab -->
n(a, N),
{N1 is N + 1
},
n(b, N1).
p(X) :- phrase(ab, X).
test :-
p([b]),
p([a,b,b]),
p([a,a,b,b,b]),
p([a,a,a,b,b,b,b]),
\+ p([a]),
\+ p([a,b]),
\+ p([a,a,b,b]),
\+ p([a,b,b,c]).
测试:
?- [ab].
% ab compiled 0.00 sec, -36 bytes
true.
?- test.
true.
不隶属于 StackOverflow