Пролог арифметический синтаксис
Как определить a
как целое число / число с плавающей точкой ?
Я хочу найти результаты a+b+c+d=10
, где a,b,c,d
- целое число и >=0
.
3 ответа:
Вот простое, современное, чистое решение пролога, не содержащее библиотеки 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.
С 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 ; ...
Вот 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
P.S. Спасибо Пшемыславу Кобылянскому за его блог с четкими, очень хорошими примерами пролога , где я нашел вдохновляющие примеры.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. P. S. играя с конечными доменами, вы можете использовать fd_set_vector_max/1 . В приведенном выше случае это не нужно, но в зависимости от ограничения может быть полезно - более подробно, когда Gnu-Prolog работает на диапазонах, когда на векторах возможных значений, можно найти в руководстве "решатель конечных областей и встроенные предикаты-введение"