Переменные Prolog не объединяются должным образом - PullRequest
1 голос
/ 07 мая 2020

Я написал в Прологе следующее, чтобы проверить, похож ли второй массив на первый, за исключением того, что он имеет в два раза больше значений:

twice([],[]).
twice([X|T1], [X1, X2|T2]) :- X == X1, X == X2, twice(T1, T2).

Когда я пишу twice([1,2],[1,1,2,2])., я получаю true, но когда я запрашиваю : twice([1,2], X). Я получаю false вместо X = [1,1,2,2], в чем проблема?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Вы использовали предикат ==/2 для сравнения двух переменных X1 и X2.

На самом деле вы также можете значительно сократить программу

twice([],[]).
twice([X|T1], [X, X|T2]) :- twice(T1, T2).
1 голос
/ 07 мая 2020

Это потому, что ==/2 [swi-doc] - это не , как предполагается, для объединения. Он проверяет, совпадают ли два термина (для переменных, если это одинаковые переменные). Объединение выполняется с помощью =/2 [swi-doc] , что:

Объединить Term1 с Term2. True, если объединение прошло успешно.

Таким образом, вы можете написать X = X1, но это не обязательно. Использование той же переменной унифицирует значения, поэтому вы можете реализовать twice/2 как:

twice([], []).
twice([<b>X</b>|T1], [<b>X,X</b>|T2]) :-
    twice(T1, T2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...