Основное / Turbo Prolog. Важный нюанс
.pdfTurbo Prolog
Важный нюанс, о котором мало кто знает.
Имеем следующий код.
DOMAINS
list_of_real = real* lists_of_real = list_of_real*
PREDICATES output(list_of_real)
GOAL
output([1, 2, 3, 4, 5]). CLAUSES
output([1, 2, 3, 4, 5]) :- write("1"), nl, !.
output(R) :- write("2"), nl.
Казалось бы — в цели вызывается предикат output с аргументом [1, 2, 3, 4, 5] И вроде мы указали случай Но как бы не так!
Вывод на экран: 2 (результат
Что не так?
Сравнение списков вещественных чисел не работает...
Почему — неизвестно. Числа 1, 2, 3, 4, 5 достаточно точные.
Если заменим на список целых чисел, все заработает:
DOMAINS
list_of_integer = integer* lists_of_integer = list_of_integer*
PREDICATES output(list_of_integer)
GOAL
output([1, 2, 3, 4, 5]). CLAUSES
output([1, 2, 3, 4, 5]) :- write("1"), nl, !.
output(R) :- write("2"), nl.
Вывод: 1 (результат output([1, 2, 3, 4, 5])).
Если передать 5 вещественных чисел не в виде списка, тоже будет работать:
PREDICATES
output(real, real, real, real, real)
GOAL
output(1, 2, 3, 4, 5). CLAUSES
output(1, 2, 3, 4, 5) :- write("1"), nl, !.
output(X1, X2, X3, X4, X5) :- write("2"), nl.
Вывод: 1 (результат output(1, 2, 3, 4, 5)). Вот удивительно!
Списочную структуру можно реализовать вручную.
Результат будет тот же, что и при использовании стандартного списка.
DOMAINS
node = node(real, node) ; nil PREDICATES
output(node)
GOAL
output(node(1, node(2, node(3, node(4, node(5, nil)))))). CLAUSES
output(node(1, node(2, node(3, node(4, node(5, nil)))))) :- write("1"), nl, !.
output(R) :- write("2"), nl.
Вывод: 2 (результат output(R))
И, естественно, при integer всё будет работать.
DOMAINS
node = node(integer, node) ; nil PREDICATES
output(node)
GOAL
output(node(1, node(2, node(3, node(4, node(5, nil)))))). CLAUSES
output(node(1, node(2, node(3, node(4, node(5, nil)))))) :- write("1"), nl, !.
output(R) :- write("2"), nl.
Вывод: 1 (результат output(node(1, node(2, node(3, node(4, node(5, nil))))))).
Вот такие пироги!