PROLOG: процесс вывода, почему возвращает false - PullRequest
0 голосов
/ 05 июня 2018

У меня есть определение 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 ]

0 голосов
/ 05 июня 2018

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

?- conc([X | [green]], Y, [red, green, blue]).
X = red,
Y = [blue].
0 голосов
/ 05 июня 2018

Отказ от ответственности: я не знаю Пролог.Остальная часть этого ответа - окончательное предположение.

Ваше предлагаемое решение 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]

Т.е.

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

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

Проблема в [X | green], поскольку green нехвост списка.

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

...