2016-04-24 4 views
2

Я очень новичок в Prolog (исходит из C++), и у меня возникли проблемы с пониманием использования списков в качестве параметров. В частности, мне интересно, как учитывать случай, когда список имеет только один элемент (хвост «пуст»). Почему я не могу [L] как параметр сам по себе? Почему хвост должен быть явно включен?Проверить список из одного элемента в Prolog

/** Trying to print out the head of the list */ 
writeList([L|_]) :- write(L).  /** Works fine */ 
writeList([L]) :- write(L).  /** Doesn't work. Will return false, but why? */ 
writeList([L]) :- write([L]).  /** I thought I'd try this to see if it was a 
            problem with write(), but this returns false as well. */ 

Единственный способ решение, которое я придумал (без создания тестов после «: -») был:

writeList([L|[]]) :- write(L). 

Но это кажется немного неаккуратно, чтобы указать хвост [] , Есть ли более чистый способ сделать это?

Извините, если этот вопрос очень глупый - я пытался найти ответ на этот (довольно простой) вопрос, но я подозреваю, что в моем фундаментальном понимании есть проблема.

+0

Предикат 'writeList ([L]): - write (L) .' работал отлично для меня. Моя цель была '? - writeList ([alice]).'. – Enigmativity

+0

Имейте в виду, что прологовые цели преуспевают или терпят неудачу, они не __return__ true или false. – Enigmativity

+1

Я думаю, что я называл это неправильно (я оглянулся назад, и я продолжал делать writeList (alice) и как-то постоянно забывал о скобках). Похоже, мое замешательство было просто от очень глупой ошибки - спасибо за ответ, вот что заставило меня понять. – uncreative

ответ

2

Обозначение [X|Y] относится к списку, первым элементом которого является X и чей хвост Y.

Подсвечник _ является анонимным переменным и означает любой термин. В этом случае вы не хотите этого.

перечень А один элемент есть пустой хвост, поэтому Y связан с пустым списком [], то обозначение: [X|[]]

Аналогичным образом, для списка из двух элементов: [X,Y|[]]

Проверьте this Prolog Lists tutorial для получения дополнительной информации по этой теме.

+1

Хороший ответ! Просто небольшое дополнение: просто напишите '[X]' для одноэлементного списка и '[X, Y]' для двухэлементного списка. – mat

+0

@mat это чище !. Я действительно привык к []. Благодарю. – JosEduSol

Смежные вопросы