2015-10-10 3 views
0

Эй, ребята, я начал разработку Пролога вчера, мне нужна помощь, для моего университета я должен создать функцию проверки списка.Prolog Validate Структура списка

It should accept the lists: 

[a] 
[a,b] 
[a,b,c] 

And Reject 
[a,[b|c]] 

Когда I`m понимание мой университет скрипт правильно: enter image description here

Код должен быть написан с переменными. И как «listCheck/1»

/** 
Accept single value lists 
*/ 
listCheck([A]). 

/* 
When there is a Head|Tail list check the Tail 
*/ 
listCheck([Head|Tail]):-listCheck(Tail). 

Знаете ли вы хорошую страницу входа для парней, которые переключаются на пролограммирование? Я программирую C# и Java с некоторых лет, но прологи кажутся мне очень странными. :-)

+0

В частности, в контексте первого студенческого контакта с Пролога, динамической типизации и одиночными связями списков «Он должен принять списки [а], [а, Ь], [а, Ь, с], и т.д. . - и отклонить [a, [b | c]]. " только мало смысла. OTOH "... отклонить ** [a, b | c] **", теперь *, что * я получаю! Добираюсь? – repeat

ответ

0

Итак, сегодня я пришел к следующему коду, этот код работает, но из-за рекурсии он возвращает «true», «false» для данного списка «[a, [b | c]]». Есть ли способ отменить рекурсию, когда часть [b | c] не работает?

/** 
Accept single value lists 
*/ 
checkList([]). 
checkList([E]). 
checkList([Head|Tail]):-not(atom(Tail)), atom(Head),checkList(Tail). 
+1

почему бы и нет: 'is_list ([]). is_list ([_ | Es]): - nonvar (Es), is_list (Es). «Но все же это выглядит странно для меня. Просто возьмите 'length (Es, _)', который перечисляет все допустимые списки. – false

+0

Привет, спасибо за сообщение, но этот is_list возвращается для [a, [b | c]] true. Событие его почти похоже на мою версию ;-) – Bjego

+1

Это само определение списка! – false

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