1

我在 PROLOG 中编写了我的第一个简单代码:

is_beginning([], _).
is_beginning([FirstLetterB|RestWordB], [FirstLetterW|RestWordW]) :-
   FirstLetterB == FirstLetterW,
   is_beginning(RestWordB, RestWordW).

它旨在找出 is_beginning 的第一个参数是否等于第二个开始。好吧,恕我直言,它可以很好地回答问题,但现在我想知道是否有可能获得定义的第二个参数的所有可能答案。例如。为了

is_beginning(Answers, [a,b,c]);

我希望得到 [], [a], [a,b], [a,b,c] 作为答案统一,但我只得到 [] (最简单的答案)。

有没有可能得到我想要的?也许我的定义有问题?我已经尝试使用 findall 和 forall,但对我来说效果不佳:(

感谢所有的答案。

4

2 回答 2

2

您在不需要时使用 ( == )/2 (请注意文档页面末尾的注释)。实际上,如果您将其更改为“简单”统一 (=)/2,您的程序将按预期工作:

is_beginning([], _).
is_beginning([FirstLetterB|RestWordB], [FirstLetterW|RestWordW]) :-
    FirstLetterB = FirstLetterW,
    is_beginning(RestWordB, RestWordW).

测试:

?- is_beginning(Answers, [a,b,c]).
Answers = [] ;
Answers = [a] ;
Answers = [a, b] ;
Answers = [a, b, c] ;
false.
于 2012-12-10T12:21:54.727 回答
1

解释器不会立即返回所有解决方案。当它返回时[],按“;” 告诉它继续搜索:

?- is_beginning(X, [a,b,c]).
X = [] ;
X = [a] ;
X = [a, b] ;
X = [a, b, c] ;
false.

如果您需要 Prolog 列表中的所有这些解决方案,而不仅仅是在控制台中打印出来,这findall/3确实是您正在寻找的:

?- findall(X, is_beginning(X, [a,b,c]), L).
L = [[], [a], [a, b], [a, b, c]].
于 2012-12-10T11:22:23.630 回答