findall / 3返回一个空列表而不是解决方案

时间:2014-05-23 15:45:26

标签: prolog gnu-prolog prolog-findall

我使用GNU Prolog来解决问题。我定义了以下谓词:

% P is the product of X and Y
produit(X,Y,P) :- 
    between(2,200,X),
    between(2,200,Y),
    X #<# Y,
    X*Y #=# P.

% S is the sum of X and Y 
somme(X,Y,S) :-
    between(2,200,X),
    between(2,200,Y),
    X #<# Y,
    X+Y #=# S.

%je ne peux pas deviner
clue_one(X,Y) :-
    produit(X,Y,P),
    XX*YY #=# P,
    XX #\=# X,
    XX #\=# 1,
    YY #\=# 1,
    XX #\=# Y.

%je le savais
clue_two(S) :-
    forall(somme(X,Y,S), clue_one(X,Y)).

Prolog说clue_two(17)是真的但是当我尝试findall(S, clue_two(S), L)时,GNU Prolog会返回空列表。为什么呢?

1 个答案:

答案 0 :(得分:2)

forall/2事实上的标准谓词相当于:

forall(Generator, Test) :-
    \+ (Generator, \+ Test).

由于使用了否定,因此不会返回因调用GeneratorTest而导致的绑定。