Унификация списка пролога

Я пытаюсь углубить свое понимание Пролога и того, как он обрабатывает объединение списков. Так что я застрял на этом примере, потому что знаю ответ, выполняя код, но не могу понять, как он работает.

[X,a,X,f(X,a)|Y] = [Z,Z|Y]

Ответ:

X=Z
Z=a
Y=_
L=[a,f(a,a)|Y]

Я знаю, что голова объединяется с другой головой, поэтому, если я внесу некоторые изменения, например:

let C=[X,a,X,f(X,a)]
let D=[Z,Z]

и объединение должно происходить таким образом:

[C|Y]=[D|L]

Значит, Y должен быть равен L, а не _, верно? Может ли кто-нибудь лучше объяснить мне это и исправить мою ошибку?


person Teo    schedule 16.04.2015    source источник
comment
В SWI-Prolog он дает X=Z, Z=a, Y = [a,f(a,a)|Y], что, я думаю, является ожидаемым результатом.   -  person hynner    schedule 16.04.2015
comment
Откуда L? На SWI-Prolog это дает L = [a, f (a, a) | Y], но я не знаю, как придумать это решение.   -  person Teo    schedule 17.04.2015
comment
Как я уже сказал, на моем SWI-Prolog нет буквы L :-)   -  person hynner    schedule 17.04.2015
comment
Тео, какой интерпретатор Пролога ты используешь?   -  person lurker    schedule 17.04.2015


Ответы (2)


В списках нет ничего особенного или уникального. Список - это просто структура данных ./2. Нотация списков в Прологе - это просто синтаксический сахар. В двух словах:

  • [] является атомом и обозначает пустой список.
  • [a] в точности эквивалентен .(a,[]).
  • [a,b] в точности эквивалентен .(a,.(b,[])).
  • и Т. Д.

Конструкция голова / хвост [Head|Tail] также является синтаксическим сахаром:

  • [H|T] в точности эквивалентен .(H,T).

Замените нотацию списка точечной нотацией, и ваш предикат будет работать точно так же. Просто не так удобно.

Подробности см. в моем ответе.

person Nicholas Carey    schedule 17.04.2015

Пожалуйста, покажите, как вы действительно общаетесь с переводчиком.

Например,

$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.1.36-18-ga5e157c)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- [X,a,X,f(X,a)|Y] = [Z,Z|Y].
X = Z, Z = a,
Y = [a, f(a, a)|Y].

(Обратите внимание, что Y теперь циклический термин.)

Если бы вы показали, что делаете на самом деле, вам будет легче помочь. Просто отредактируйте свой вопрос.

person Community    schedule 17.04.2015