我知道我需要弄清楚自己的作业,但是看到班上没有人能解决问题,我需要一些帮助。
写一个Prolog程序,
p(X)
如果X
是由n
组成的列表,则为true 对于任何a
,n+1
后跟b
n >= 1
个。{/ p>
答案 0 :(得分:2)
我不记得如何在Prolog中编写代码,但想法是:
规则1: 如果listsize为1,则如果元素为B,则返回true。
规则2: 如果listsize为2,则返回false。
规则3: 检查列表中的第一项是否为A,最后一项是否为B. 如果是这样,请将元素2的解决方案返回到listsize-1。
如果我理解你的问题应该是完美的Prolog风格解决方案。
编辑:我完全忘了这件事。我编辑了答案,考虑n = 1和n = 2的情况。感谢Heath Hunnicutt。答案 1 :(得分:1)
您应该使用计数器来跟踪到目前为止找到的内容。当您找到b
时,请在计数器中添加一个。当您找到a
时,减去一个。遍历整个列表后,您的计数器的最终值应为1,因为您希望b
的数量比a
的数量多1。以下是如何在代码中编写代码的示例:
% 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
。在典型的家庭作业答案方式中,我已经离开了最后一点,让你自己添加。
答案 2 :(得分:1)
这是我的深层解决方案
:-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.