простое прологическое объяснение манипуляции со строками - PullRequest
0 голосов
/ 01 мая 2011

просто нужно простое объяснение .. пытаюсь собрать все вместе здесь.

lastitem([X|Xs],Out) :- lastitem(Xs,Out).

здесь трассировка: lastitem ([a, b, c], X).

[trace] 8 ?- lastitem([a,b,c],X).
   Call: (6) lastitem([a, b, c], _G536) ? creep
   Call: (7) lastitem([b, c], _G536) ? creep
   Call: (8) lastitem([c], _G536) ? creep
   Exit: (8) lastitem([c], c) ? creep
   Exit: (7) lastitem([b, c], c) ? creep

шаг 1 говорит, что если lastitem (что-то, somethign) существует, то listem ([X | Xs], Out] .. поэтому вырезается A. шаг 2-3 делает то же самое ... но с W / B и C. теперь возникает вопрос: что происходит с пустым списком на шаге 4? Почему пустойсписок не выполняет lastitem (Xs, Out)? или я решаю неправильно?

Также может помочь словесное объяснение обратного отслеживания ... потому что в приложении я действительно получаю искаженное. У приложения нет целей, чтобы решить между шагами... но обратное не означает ... и мой ответ выше ... если вы проследите его, вы увидите, что переменная X всегда одинакова в обратном порядке или в этом примере. В приложении она изменяется.

append([],L,L).
append([H|T],L2,[H|L3]) :- append(T,L2,L3).

append([a, b, c], [1, 2, 3], _G518) % <-- variable L3 continues to change
append([b, c], [1, 2, 3], _G587) % <-- same
append([c], [1, 2, 3], _G590) % < -- same
append([], [1, 2, 3], _G593)  % <-- same
append([], [1, 2, 3], [1, 2, 3])
append([c], [1, 2, 3], [c, 1, 2, 3])
append([b, c], [1, 2, 3], [b, c, 1, 2, 3])
append([a, b, c], [1, 2, 3], [a, b, c, 1, 2, 3])

X = [a, b, c, 1, 2, 3]

Ответы [ 2 ]

0 голосов
/ 01 мая 2011

В lastitem([X|Xs],Out) :- lastitem(Xs,Out)., с обеих сторон второй аргумент - Out, поэтому он должен оставаться неизменным.

В append([H|T],L2,[H|L3]) :- append(T,L2,L3)., третий аргумент с левой стороны - [H|L3],но с правой стороны это L3, поэтому, когда вы вызываете append, у вас есть «переменная» для [H|L3], но переменная для L3 должна быть другой.Имена переменных, такие как _G536, являются глобальными, поэтому, когда они представляют разные вещи, они должны быть разными.

(Извините за неточную терминологию, я некоторое время не работал с Prolog.)

0 голосов
/ 01 мая 2011

Как и вы, я смущен отсутствием базового регистра в lastitem.Вы уверены, что это на самом деле не было определено как

lastitem([X|[]], X).
lastitem([X|Xs],Out):- lastitem(Xs,Out).

или что-то подобное?


Что касается всех следов, постарайтесь не думать слишком настойчиво, глядя на код Prolog.Например, append можно «перевести» в более обычное функциональное определение:

function append(xs, ys) = 
    if xs is [] then
        return ys
    else
        let [H|L] = xs
        return [H | append(L, ys)]

Понимание этого имеет большое значение для понимания версии Prolog:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...