PROLOG: процесс вывода, почему возвращает false

3va спросил: 12 мая 2018 в 04:11 в: prolog

У меня есть определение conc:

conc([], L2, L2).
conc([X1|R1], L2, [X1|RN]) :-
   conc(R1, L2, RN).

Я не понимаю, почему conc([X | green], Y, [red, green, blue]). возвращает false а не

X = [red],
Y = [blue]

Каков процесс вывода здесь?

2 ответа

Есть решение
melpomene ответил: 12 мая 2018 в 04:27

Отказ от ответственности: я не знаю Prolog. Остальная часть этого ответа - это ошеломляющая догадка.

Ваше предлагаемое решение X = [red] не имеет смысла, потому что это сделает X одноэлементный список. Предположим

X = red

.

Это даст нам

conc([red | green], [blue], [red, green, blue]).

Со вторым уравнением conc, который превращается в

conc(R1, L2, RN).
% with:
% X1 = red
% R1 = green
% L2 = [blue]
% [X1|RN] = [red, green, blue]
% i.e. X1 = red
%      RN = [green, blue]

Ie

conc(green, [blue], [green, blue]).

И теперь мы застреваем, потому что ни один из ваших conc применяется к green.

Проблема заключается в [X | green], потому что green не является хвостом списка. p>

Вместо этого вы имели в виду [X, green]

Paulo Moura ответил: 12 мая 2018 в 04:28

В нотации списка Prolog | разделяет элементы, перечисленные слева от списка остальных элементов справа. Проблема в вашем запросе. Вместо [X | green] вам нужно написать либо [X | [green]], либо [X,green]. С одним из этих исправлений вы получите правильный ответ. Например.

?- conc([X | [green]], Y, [red, green, blue]).
X = red,
Y = [blue].