оператор целочисленного деления в Прологе

Этот код является частью программы, которую я пишу для решения шифровальной головоломки на прологе. Я решаю это с помощью CLPFD (SICStus Prolog). Я получаю сообщение об ошибке при использовании встроенного оператора целочисленного деления «//» (подробности см. Ниже). Я не смог решить эту проблему. Поэтому я написал свою собственную функцию целочисленного деления.

Я хочу знать, почему "//" не работает. Нет такой проблемы с другими арифметическими операторами, такими как +, -, /.

ДО:

solve1([],[],[H],H).
solve([H1],[H2],[H3,H4],C) :- H1 #\= 0, H2 #\= 0,
                              H3 #= (C+H1+H2)mod 10,
                              H4 #=(C+H1+H2)//10.

solve([H1|T1] , [H2|T2] , [H3|T3],C) :- H3 #= (C+H1+H2)mod 10,
                                        C1 #=(C+H1+H2)//10 ,
                                        solve(T1,T2,T3,C1).

Это ошибка, которую я получаю

ОШИБКА: Ошибка домена: clpfd_expression' expected, found (0 + _G1592 + _G1586) // 10 'Исключение: (12) throw (error (domain_error (clpfd_expression, (0 + _G3994 {0..9} + _ G3991 { 0..9}) // 10), _G3976))?

ПОСЛЕ:

integer_div(N,M) :- M #= N/10 , integer(M).
integer_div(N,M) :- N1 #= N mod 10 , N2 #= N-N1 , M #= N2/10.


solve1([],[],[H],H).
solve([H1],[H2],[H3,H4],C) :- H1 #\= 0, H2 #\= 0,
                              H3 #= (C+H1+H2)mod 10,
                              integer_div((C+H1+H2),H4).

solve([H1|T1] , [H2|T2] , [H3|T3],C) :- H3 #= (C+H1+H2)mod 10,
                                        integer_div((C+H1+H2),C1) ,
                                        solve(T1,T2,T3,C1).

Это работает отлично. Все, что я сделал, это заменил "//" моей версией целочисленного деления.


person Community    schedule 02.12.2009    source источник
comment
Начиная с 4.3.0, (//)/2 является допустимым оператором в clpfd SICStus.   -  person false    schedule 20.04.2016


Ответы (1)


Согласно документация, CLP-FD использует / для целочисленного деления.

person starblue    schedule 02.12.2009
comment
Вы действительно это тестировали? Я не думаю, что это целочисленное деление, потому что в противном случае моя функция integer_div не сработала бы. Я использовал / оператор там, и он действует как оператор деления - person ; 02.12.2009
comment
Боюсь, это совсем не полезно - person ; 03.12.2009
comment
Что ж, простой тест говорит, что одинарное / действительно является целочисленным делением: ?- T#=3, U#=T/2,labeling([], [T,U]). - person Martin Vseticka; 08.05.2013