Prolog arithmetic syntax

前端 未结 3 1594
清酒与你
清酒与你 2021-01-14 01:32

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

相关标签:
3条回答
  • 2021-01-14 02:22

    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.
    
    0 讨论(0)
  • 2021-01-14 02:27

    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 ;
    ...
    
    0 讨论(0)
  • 2021-01-14 02:29

    Here is GNU-Prolog piece of code with constraint solving over finite domains :

    $ 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]).
    

    As you can see, it solves problem of big ranges like 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. Thanks for Przemysław Kobylański for his blog with clear, very nice Prolog examples, where I've found inspiring examples.

    P.P.S. When playing with finite domains, you might like to use fd_set_vector_max/1 . In above case it's not needed, but depending on constraint might be usefull - more details when Gnu-Prolog operates on ranges, when on vectors of possible values, can be found at manual "Finite domain solver and built-in predicates - Introduction"

    0 讨论(0)
提交回复
热议问题