Jeder Programmierer mit etwas Erfahrung in Prolog kennt die Vorteile der Verwendung unärer Notation für Zahlen. wenn wir eine Zahl als Liste von 1" durch Beispiel stellen (‚4‘ Liste ‚[1,1,1,1]‘ und so weiter), können wir definieren:Prolog: fehlende Funktion?
unary_succ(X,[1|X]).
die folgenden Abfragen tun was erwartet wird:
?- X=[1,1],unary_succ(X,Y).
X = [1, 1],
Y = [1, 1, 1].
?- unary_succ(X,Y),X=[1,1].
X = [1, 1],
Y = [1, 1, 1].
?- unary_succ(X,Y),Y=[1,1].
X = [1],
Y = [1, 1].
auf diese Weise Aussage unary_succ (X, Y) „bindet“ X und Y in einer Weise, dass, wenn nach der Tat festgestellt wird, eine dieser Variablen auf einen Wert gebunden ist, der andere tut das.
Dieses Verhalten ist jedoch nicht möglich, wenn wir die interne Zahlendarstellung verwenden:
Meiner Meinung nach wird es sehr nützlich sein, dass frühere Aussagen und ähnliche das tun, was erwartet wird. Das heißt, wir müssen zwei Variablen so verknüpfen, dass, wenn einer von ihnen an einen Wert gebunden ist, der andere der zuvor festgelegten Regel folgt.
Meine Fragen sind:
a) einige einfache Möglichkeit, dass in Prolog zu tun.
b) Falls nicht möglich, jede andere Programmiersprache, die diese Funktion unterstützt?
Jeder Kommentar ist willkommen.
Danke an alle.
* Nachtrag I *
Ein weiteres Beispiel ist:
user_id(john,1234).
user_id(tom,5678).
und Anfragen:
X=john,user_id(X,Y).
user_id(X,Y),X=john
, die derzeit von Rückzieher gelöst werden.
In SWI Prolog, ich denke, Sie können mit Clpfd Bibliothek tun. Sie können den Quellcode überprüfen, um zu sehen, wie er implementiert wird. – nhahtdh
Hallo. Danke für deine Zusammenarbeit. Zu der Frage ein weiteres Beispiel zur Klärung hinzugefügt. –
Ich zweite der CLP (FD) Vorschlag von @nhahtdh: Zumindest für Integer ist die Verwendung von CLP (FD) Constraints definitiv die relationale Lösung, nach der Sie suchen und die von allen wichtigen Prolog-Implementierungen bereitgestellt wird. Schreiben Sie einfach "X # = 2, Y # = X + 1" oder äquivalent "Y # = X + 1, X # = 2". – mat