#list #recursion #prolog #nested-lists
#Список #рекурсия #пролог #вложенные списки
Вопрос:
Я новичок в Prolog, и я пытался создать предикат в Prolog, который находит двойник списка чисел и помещает число и его двойник в один список. Например:
?- double_list([2,3,6,10], List).
List = [[2, 4], [3, 6], [6, 12], [10, 20]].
Это код, который я сделал до сих пор:
double_list([],[]).
double_list([H|T], [[H, double]| List]):-
double is (H*2),
double_list(T, List).
Я не знаю, где я ошибся. Я продолжаю получать false.
при попытке запустить программу.
Комментарии:
1. Когда вы выполняете пошагово выполнение программы, в какой момент она ведет себя неправильно?
2. Я попытался использовать трассировку, он говорит Fail: (8) double равен 2 * 2 ? ползучесть. Но поскольку я … Я все еще не знаком с prolog, я пропустил ошибку с прописными буквами.
Ответ №1:
Переменные в Прологе начинаются либо с подчеркивания, либо с заглавной буквы. Проблема в вашем коде в том, что вы написали double
вместо Double
. Исправление вашего кода для:
double_list([],[]).
double_list([H|T], [[H, Double]| List]):-
Double is H*2,
double_list(T, List).
дает ожидаемый ответ на ваш запрос:
| ?- double_list([2,3,6,10], List).
List = [[2, 4], [3, 6], [6, 12], [10, 20]]
yes
Некоторые системы Prolog способны обнаружить ошибку в вашем коде. Например, используя SICStus Prolog, мы получаем:
* invalid LHS in arithmetic expression: double