Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основное / Turbo Prolog. Важный нюанс

.pdf
Скачиваний:
33
Добавлен:
04.04.2021
Размер:
52.14 Кб
Скачать
output(R)).
output([1, 2, 3, 4, 5])

Turbo 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))))))).

Вот такие пироги!