我明白,我需要找出我自己的功课,但看到的类,没有人可以计算出来的,我需要一些帮助。

  

写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.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top