2010-06-05 5 views
5

Sono nuovo a Prolog. Ho bisogno di scrivere un sommatore intero che aggiungerà numeri compresi tra 0-9 e altri numeri 0-9 e produrrà una soluzione 0-18. Questo è quello che voglio fare:Prolog Beginner: Come unificare con gli operatori di confronto aritmetico o come ottenere un set var nell'intervallo di valori

% pseudo code 
add(in1, in2, out) :- 
    in1 < 10, 
    in2 < 10, 
    out < 18. 

Mi piacerebbe essere in grado di chiamare in questo modo:

Per verificare se si tratta di una valida aggiunta:

?- add(1,2,3). 
true. 
?- add(1,2,4). 
false. 

con una parte mancante variabile:

?- add(X,2,3). 
X = 1. 
?- add(1,4,X). 
X = 5. 

Con più variabili mancanti:

?- add(X,Y,Z). 
% Some output that would make sense. Some examples could be: 
X=1, Y=1, Z=2 ; 
X=2, Y=1, Z=3 ...... 

Mi rendo conto che questa è probabilmente una domanda piuttosto semplicistica ed è probabilmente molto semplice. Tuttavia, secondo il Prolog tutorial sto usando:

"A differenza di unificazione operatori aritmetici Operatori di confronto non possono essere utilizzate per dare i valori ad una variabile L'può essere valutata solo quando ogni termine su ogni lato sono stati un'istanza.".

risposta

0

Soluzione:

lessThanTen(9). 
lessThanTen(8). 
lessThanTen(7). 
lessThanTen(6). 
lessThanTen(5). 
lessThanTen(4). 
lessThanTen(3). 
lessThanTen(2). 
lessThanTen(1). 
lessThanTen(0). 

addSimple(Add1,Add2,Sol) :- 
    lessThanTen(Add1), 
    lessThanTen(Add2), 
    Sol is Add1+Add2. 
1

Che dire di questo ?:

add(X,Y,Z) :- 
     Z is X + Y, 
     X < 10, 
     Y < 10, 
     Z < 19. 

Problema: questo funziona bene per le query della forma add(1,1,X) perchè Z 's un'istanza prima che i < chiamate, ma non riesce quando chiedi add(X,1,2). Potresti usare var/1 per distinguere il tipo di query (var/1 ti dice se una variabile non è giustificata o meno), ma sembra molto dolore.

+0

Sì, questo non funziona perché quello che hai descritto nella tua risposta. – sixtyfootersdude

6

Tutti i moderni sistemi Prolog forniscono vincoli di dominio finiti, che sono vere relazioni che possono (in contrasto con più predicati aritmetici di basso livello come/2 e>/2) essere utilizzati in tutte le direzioni. In SWI-Prolog:

:- use_module(library(clpfd)). 

plus(X, Y, Z) :- 
     [X,Y] ins 0..9, 
     X + Y #= Z. 

Risultati per i tuoi esempi:

?- plus(1,2,3). 
true. 

?- plus(1,2,4). 
false. 

?- plus(X,2,3). 
X = 1. 

?- plus(1,4,X). 
X = 5. 

?- plus(X,Y,Z). 
X in 0..9, 
X+Y#=Z, 
Y in 0..9, 
Z in 0..18. 

Dal momento che il predicato può essere utilizzato in tutte le direzioni, non ha più senso chiamarlo "aggiungere/3", come ciò implicherebbe una direzione, ma il predicato descrive veramente quando la relazione è valida ed è quindi più generale.

Problemi correlati