Я пытаюсь написать правило для переноса элементов, но при вводе рекурсивного правила первый элемент все еще включается, может быть, я неправильно понимаю синтаксис, но запятая не должна go для следующего элемента?
% [First] should be consumed (note: charcode 194 is for the backtick character)
backticks(L) --> [First], {char_code(First,194), writeln(["first was backtick",First])}, nobackticks(L), {writeln(["identifier",L])}.
nobackticks([]) --> [Last], {char_code(Last,194),writeln(["last is backtick",Last])}.
nobackticks([X|Xs]) --> [X], nobackticks(Xs), {writeln(["checking backticks",X,Xs])}.
%run recursively until it finds the last backtick
Тест
:- string_chars("´backticks´",Text), phrase(backticks(X),Text,[]), writeln(X).
Вывод:
[first was backtick,´]
[last is backtick,´]
[checking backticks,s,[]]
[checking backticks,k,[s]]
[checking backticks,c,[k,s]]
[checking backticks,i,[c,k,s]]
[checking backticks,t,[i,c,k,s]]
[checking backticks,k,[t,i,c,k,s]]
[checking backticks,c,[k,t,i,c,k,s]]
[checking backticks,a,[c,k,t,i,c,k,s]]
[checking backticks,b,[a,c,k,t,i,c,k,s]]
[checking backticks,´,[b,a,c,k,t,i,c,k,s]]
[identifier,[´,b,a,c,k,t,i,c,k,s]]
Ожидаемый вывод:
[identifier,[b,a,c,k,t,i,c,k,s]]
Наконец, правило не выполнено