2010-12-05 23 views
2

Wie bekomme ich Y und Z in Prolog, wenn ich nur X kenne?Prolog, Test (X, Y, Z): - Y ist X + Z

Zum Beispiel:

test(X, Y, Z) :- X is Y + Z. 

aber Fehler:

?- test(2, Y, Z). 
ERROR: is/2: Arguments are not sufficiently instantiated 

Antwort

2

sagen, es ist nicht möglich, da Sie Y können wählen, was Sie sein wollen und sie Z oder umgekehrt berechnen.

Obwohl, wenn Sie wissen, dass Y und Z von einem begrenzten Satz (zB positive ganze Zahlen sind weniger als 5), können Sie wie etwas tun:

valid_number(1). 
valid_number(2). 
valid_number(3). 
valid_number(4). 

test(X, Y, Z) :- valid_number(Y), valid_number(Z), X is Y + Z. 
+1

Diese Set Constraints können auch mit 'between/3' erreicht werden. –

+0

Ja. Ich fand diese zwischen (I, J, J): - J> = I. zwischen (I, J, K): - J> I, J1 ist J - 1, zwischen (I, J1, K). ? - zwischen (1, 4, X). X = 4; X = 3; X = 2; X = 1; falsch. Es war sehr hilfreich. – Martynas

3

Sie haben sie als Argumente zu übergeben. Prologarithmetik (is/2) ist kein Zauberstab, sein rechtes Argument muss vollständig instanziiert sein (keine Variablen), bevor es ausgewertet werden kann.

Wenn das Prädikat in mehreren "Richtungen" arbeiten soll, mit mehreren Kombinationen von Grundbegriffen und Variablen, sollten Sie die Constraint Logic-Programmierung verwenden, aber das ist ein ziemlich fortgeschrittener Bereich der Logikprogrammierung. In CLP auf endlichen Domänen können Sie

:- use_module(library(clpfd)). % this differs between implementations 
test(X,Y,Z) :- X #= Y + Z. 
+1

I Einschränkung Vorschlag zweiten larsmans und feststellen, dass viel einfacher ist, für Anfänger als Low-Level-Modedarithmetik zu verstehen. Meiner Meinung nach sollte/2 aus Einführungskursen gestrichen werden, da es für Anfänger zu schwer zu verstehen ist. – mat

Verwandte Themen