tags:

views:

90

answers:

2

How to define a as a integer/float number ?

I want to find the results of a+b+c+d=10 where a,b,c,d is integer and >=0.

+1  A: 

with SWI-Prolog you can use CLP(FD) library

1 ?- use_module(library(clpfd)).
%  library(error) compiled into error 0.00 sec, 9,764 bytes
% library(clpfd) compiled into clpfd 0.05 sec, 227,496 bytes
true.

2 ?- Vars=[A,B,C,D],Vars ins 0..10,sum(Vars,#=,10),label(Vars).
Vars = [0, 0, 0, 10],
A = 0,
B = 0,
C = 0,
D = 10 ;
Vars = [0, 0, 1, 9],
A = 0,
B = 0,
C = 1,
D = 9 ;
Vars = [0, 0, 2, 8],
A = 0,
B = 0,
C = 2,
D = 8 ;
Vars = [0, 0, 3, 7],
A = 0,
B = 0,
C = 3,
D = 7 ;
...
Xonix
Can you explain the code?
Well, first you define 4 variables, then defining domains for variables (from 0..10) then adding constraints (sum of all vars = 10), last statement (label(Vars)) causes search (by backtracking) for all possible variables values.
Xonix
Are ins ,#= keywords of clp?I never see them in prolog before.
That's right.. )
Xonix
+2  A: 

Here is a simple, modern, pure Prolog, non-CLP-library solution:

range(X):-
        member(X,[0,1,2,3,4,5,6,7,8,9,10]).

ten(A,B,C,D):-
        range(A),
        range(B),
        range(C),
        range(D),
        10 =:= A + B + C + D.
ThomasH
Is there a more simple way to represent 0~10?I'm worried when the problem's domain is 0~100...
SWI Prolog has the ``between/3`` predicate. ``between(0,100,X)`` will successively bind X to 0..100 inclusively.
ThomasH