Prolog:识别n> = 1的^ n b ^(n + 1)语言

时间:2010-02-22 19:38:39

标签: prolog clpfd

我知道我需要弄清楚自己的作业,但是看到班上没有人能解决问题,我需要一些帮助。

  

写一个Prolog程序,p(X)   如果X是由n组成的列表,则为true   对于任何an+1后跟b n >= 1个。{/ p>

3 个答案:

答案 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.