2010-06-05 6 views
5

Ich bin neu in Prolog. Ich muss einen ganzzahligen Addierer schreiben, der Zahlen zwischen 0-9 zu anderen Zahlen 0-9 hinzufügt und eine Lösung 0-18 produziert. Dies ist, was ich tun möchte:Prolog Anfänger: Wie man mit arithmetischen Vergleichsoperatoren vereinheitlicht oder wie man eine var auf einen Wertebereich setzt

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

Ich mag wäre in der Lage sein, um es so zu nennen:

Um zu überprüfen, ob es eine gültige Zusätzlich ist:

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

mit einem fehlenden Variable:

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

Mit mehreren fehlenden Variablen:

?- 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 ...... 

Ich realisiere, dass dies wahrscheinlich eine ziemlich einfache Frage ist und es wahrscheinlich sehr einfach ist. Doch nach dem Prolog tutorial Ich verwende:

„Anders als Vereinigung Arithmetic Vergleichsoperatoren Operatoren können nicht auf eine Variable geben Werte verwendet werden, die nur ausgewertet werden, wenn jeder Term auf jeder Seite instanziiert wurden..“

Antwort

0

Lösung:

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

Was ist das ?:

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

Problem: Das funktioniert gut für Abfragen der Form add(1,1,X) weil Z ‚s vor den < Anrufe instanziiert, doch irgendwie wenn Sie fragen add(X,1,2). Sie können var/1 verwenden, um die Art der Abfrage zu unterscheiden (var/1 sagt Ihnen, ob eine Variable uninstantiated oder nicht), aber das klingt wie eine Menge Schmerzen.

+0

Ja, das funktioniert nicht, weil das, was Sie in Ihrer Antwort beschrieben. – sixtyfootersdude

6

Alle modernen Prolog-Systeme stellen endliche Domänenbedingungen bereit, die echte Beziehungen sind, die (im Gegensatz zu arithmetischen Vergleichselementen mit niedrigerem Niveau wie is/2 und>/2) in allen Richtungen verwendet werden können. In SWI-Prolog:

:- use_module(library(clpfd)). 

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

Ergebnisse für Ihre Beispiele:

?- 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. 

Da das Prädikat kann in alle Richtungen verwendet wird, ist es nicht mehr Sinn machen, es zu nennen "add/3", wie das würde eine Richtung bedeuten, aber das Prädikat beschreibt wirklich, wann die Beziehung gilt und ist daher allgemeiner.