Целочисленная дальность подвески в прологе - PullRequest
1 голос
/ 16 апреля 2019

У меня следующий запрос:

?- Remainder :: 0..8, Qoutient #:: 0..Dividened,
   Dividened #= Qoutient * 9 + Remainder, Dividened = 12.

Как видите, у меня есть целочисленная приостановка Qoutient #:: 0..Dividened, и я пытаюсь очистить значение Dividend в конце.Однако я получаю следующую ошибку:

instantiation fault in Qoutient #:: 0 .. Dividened

Так как я могу решить эту проблему в Eclipse CLP?

1 Ответ

2 голосов
/ 17 апреля 2019

Вы могли бы написать Quotient#>=0, Quotient#=<Dividend, но на самом деле вообще нет необходимости давать какие-либо априорные границы для этой переменной. Просто используйте

?- Remainder :: 0..8, Dividend #= Quotient * 9 + Remainder, Dividend = 12.
Remainder = 3
Dividend = 12
Quotient = 1
Yes (0.00s cpu)

Вы можете обобщить это для произвольных делителей и упаковать все это во вспомогательный предикат, такой как

divmod(Dividend, Divisor, Quotient, Remainder) :-
        0 #=< Remainder, Remainder #=< Divisor-1,
        Dividend #= Quotient*Divisor + Remainder.

Тогда ваш запрос станет

?- divmod(D, 9, Q, R), D = 12.
D = 12
Q = 1
R = 3
Yes (0.00s cpu)
...