Пролог арифметический синтаксис - PullRequest
4 голосов
/ 24 декабря 2009

Как определить a как целое число / число с плавающей запятой?

Я хочу найти результаты a+b+c+d=10, где a,b,c,d является целым числом и >=0.

Ответы [ 3 ]

5 голосов
/ 24 декабря 2009

с SWI-Prolog вы можете использовать библиотеку CLP (FD)

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 ;
...
4 голосов
/ 25 декабря 2009

Вот простое, современное, чистое решение Prolog, не-CLP-библиотеки:

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.
2 голосов
/ 27 августа 2011

Вот GNU-Prolog фрагмент кода с решением ограничений для конечных областей:

$ gprolog
| ?- [user].
compiling user for byte code...
ten(A,B,C,D) :- fd_domain([A,B,C,D],0,9999999), 10 #= A + B + C + D.

Ctrl + D

| ?- ten(A,B,C,D), fd_labeling([A,B,C,D]).

Как видите, он решает проблему больших диапазонов , например, 0-9999999

A = 0
B = 0
C = 0
D = 10 ? ;

A = 0
B = 0
C = 1
D = 9 ? ;

A = 0
B = 0
C = 2
D = 8 ? ;
...

P.S. Спасибо за Przemysław Kobylański за его блог с ясными, очень хорошими примерами Пролога , где я нашел вдохновляющие примеры.

P.P.S. При игре с конечными доменами вы можете использовать fd_set_vector_max / 1 . В приведенном выше случае это не нужно, но в зависимости от ограничения может быть полезно - больше подробностей, когда Gnu-Prolog работает с диапазонами, когда с векторами возможных значений, можно найти в руководстве «Решатель конечных областей и встроенные предикаты Введение "

...