Пролог: нахождение 2 раз списка чисел и помещение числа и его двойника в список

#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