Qualsiasi programmatore con una certa esperienza in Prolog conosce i vantaggi dell'uso notazione unaria per i numeri. Con l'esempio, se rappresentiamo un numero come elenco di 1" ('4' è la lista '[1,1,1,1]' e così via), possiamo definire:Prolog: funzione mancante?
unary_succ(X,[1|X]).
le seguenti query fa cosa ci si aspetta:
?- 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].
in questo modo, l'affermazione unary_succ (X, Y) "lega" X e Y in un modo che, se dopo il fatto è indicato, una di queste variabili è destinata ad un valore, l'altro
Tuttavia, questo comportamento non è possibile se si utilizza la rappresentazione del numero interno:
?- X=2,succ(X,Y).
X = 2,
Y = 3.
?- succ(X,Y),X=2.
ERROR: succ/2: Arguments are not sufficiently instantiated
?- succ(X,Y),Y=2.
ERROR: succ/2: Arguments are not sufficiently instantiated
A mio parere, sarà molto utile che dichiarazioni precedenti e simili facciano ciò che ci si aspetta. Cioè, abbiamo bisogno di collegare due variabili in un modo che, quando una di esse è legata a un valore, l'altra segue la regola precedentemente stabilita.
Le mie domande sono:
a) un modo semplice per farlo in Prolog.
b) se non possibile, qualsiasi altro linguaggio di programmazione che supporta questa funzione?
Qualsiasi commento è benvenuto.
Grazie a tutti.
* addendum I *
altro esempio è:
user_id(john,1234).
user_id(tom,5678).
e query:
X=john,user_id(X,Y).
user_id(X,Y),X=john
che attualmente vengono risolti mediante backtracking.
In SWI Prolog, penso che si possa fare con la libreria clpfd. Potresti voler controllare il suo codice sorgente per vedere come è implementato. – nhahtdh
Ciao. Grazie per la collaborazione. Aggiunto alla domanda un altro esempio da chiarire. –
I secondo il suggerimento CLP (FD) di @nhahtdh: Almeno per i numeri interi, l'utilizzo dei vincoli CLP (FD) è sicuramente la soluzione relazionale che si sta cercando e fornita da tutte le principali implementazioni di Prolog. Basta scrivere 'X # = 2, Y # = X + 1' o equivalentemente' Y # = X + 1, X # = 2'. – mat