2014-05-23 3 views
2

문제를 해결하기 위해 GNU Prolog를 사용합니다. 나는 다음과 같은 조건을 정의했습니다 :findall/3은 솔루션 대신 빈 목록을 반환합니다.

% 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)). 

프롤로그 clue_two(17)에 해당하지만 findall(S, clue_two(S), L)을하려고 할 때, GNU 프롤로그가 빈 목록을 반환 말한다. 왜?

+1

'findall/3'은 해결책을 찾지 못합니다. 왜냐하면'clue_two (S)'는 해결책을 찾지 못합니다. 이것은 Paulo의 대답으로 설명됩니다. – lurker

+0

좋아! 감사합니다 ... – Saroupille

+2

하나의 프로그램에서 여기에 제약과 더 전통적인 프로그래밍 스타일을 혼합하고 있습니다. 이것이 당신이 원하는 것이라는 것을 확신하지 못합니다. – false

답변

2

forall/2 사실상의 표준 조건은 동일하다 : 때문에 부정 사용에

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

, Generator 또는 Test 중 하나에 대한 호출로 인한 더 바인딩은 반환되지 않습니다.

관련 문제