Любой программист с некоторым опытом работы в Prolog знает преимущества использования унарной нотации для чисел. К примеру, если мы представим ряд в виде списка 1" („4“ является список „[1,1,1,1]“ и так далее), мы можем определить:Пролог: отсутствует функция?
unary_succ(X,[1|X]).
следующие запросы делает что ожидается:
?- 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].
Таким образом, оператор unary_succ (X, Y) «связывает» X и Y таким образом, что, если после того, как факт, говорится, одна из этих переменных связана со значением, другой -
Однако это поведение невозможно, если мы используем внутреннее числовое представление:
?- 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
На мой взгляд, будет очень полезно, чтобы предыдущие утверждения и подобные им делали то, что ожидается. То есть нам нужно связать две переменные таким образом, чтобы, когда одна из них привязана к значению, другая выполняет предыдущее правило.
Мои вопросы:
а) некоторые простой способ сделать это в Прологе.
b) если это невозможно, любой другой язык программирования, который поддерживает эту функцию?
Любые комментарии могут быть отправлены.
Спасибо всем.
* Добавление I *
Другой пример:
user_id(john,1234).
user_id(tom,5678).
и запросы:
X=john,user_id(X,Y).
user_id(X,Y),X=john
, что в настоящее время решаемые возвратов.
В SWI Prolog, я думаю, вы можете сделать это с помощью библиотеки clpfd. Возможно, вы захотите проверить его исходный код, чтобы узнать, как он реализован. – nhahtdh
Привет. Спасибо за ваше сотрудничество. Добавленный к вопросу еще один пример, чтобы уточнить. –
Второе предложение CLP (FD) от @nhahtdh: по крайней мере, для целых чисел, использование ограничений CLP (FD), безусловно, является реляционным решением, которое вы ищете, и оно обеспечивается всеми основными реализациями Prolog. Просто напишите 'X # = 2, Y # = X + 1' или эквивалентно' Y # = X + 1, X # = 2'. – mat