在prolog中找到所有的统一

时间:2012-12-10 10:10:14

标签: prolog unification prolog-findall

我在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,但它对我来说效果不好:(

感谢所有答案。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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]].