[Закрыть]
 
popoff.donetsk.ua
Глаз способен видеть все что угодно, кроме себя. Для того чтобы увидеть себя, ему нужна зеркальная поверхность.
Начало | Новости | Статьи | Форум | Опросы | Карта сайта | Обо мне
popoff.donetsk.ua - Форум - Функциональное и логическое программирование - Пролог. Предупредждение 420 - The variable only used once

Пролог. Предупредждение 420 - The variable only used once

форумы popoff.donetsk.ua
Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен

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

Автор Сообщение
Krion
Александр
Мар, 2006
Сообщений: 19
Krion url://forum.message:1278
Пролог. Предупредждение 420 - The variable only used once

Добрый день!

Кто знает помогите разобраться почему возникает предупреждение и что она означает:
Предупреждения возникают при компиляции в строчках 6,7,8,9



1     inters(list,list,list)
2     inters(list_s,list_s,list_s)
3     elem(integer,list).
4     elem(symbol,list_s).
5   clauses
6     elem(X,[X|L1]).    /* предикат принадлежности элемента списку*/
7     elem(X,[Y|L]):-elem(X,L).
8     inters([],L2,[]).
9     inters([X|L1],L2,[X|L3]):-elem(X,L2),!,inters(L1,L2,L3).
10    inters([X|L1],L2,L3):-inters(L1,L2,L3).
      
Мне удалось избежать  этого сообщения в строчках 6,7,8,9 вот таким вот образом

1     inters(list,list,list)
2     inters(list_s,list_s,list_s)
3     elem(integer,list).
4     elem(symbol,list_s).
5   clauses
6     elem(X,[X|_]).    /* предикат принадлежности элемента списку*/
7     elem(X,[_|L]):-elem(X,L).
8     inters([],_,[]).
9     inters([X|L1],L2,[X|L3]):-elem(X,L2),!,inters(L1,L2,L3).
10    inters([X|L1],L2,L3):-inters(L1,L2,L3).
      
Но в 10 строчке оно по прежнему возникает ( указатель указывает на голову X первого списка), Help to me!

popoff
Yuri
Июл, 2004
Сообщений: 923
popoff url://forum.message:1283

В Прологе переменная, использованная в правиле означает фактически следующее: «Здесь - такое же значение, как и там.» Если Вы используете переменную только один раз, то фактически Вы говорите: «Здесь - такое же значение как и где-то, только никто не знает где.»

Напишите для каждого предиката его процедурное и декларативное понимание. После этого для выбора значений между константой, именованной переменной и анонимной переменной, пользуйтесь следующей эвристикой:

1. Если значение известно, значит нужно поставить константу - то самое значение, которое известно.

2. Если значение не известно, то нужно ставить переменную:

2.1. Если значение Вас интересует, то нужно ставить именованную переменную.

2.2. Если значение Вас НЕ интересует, то нужно ставить анонимную переменную.

Рассмотрим, к примеру, строчку 8. Она декларативно озвучивается так: «Если первый список пуст, то его пересечение с любым списком является пустым списком.» Зададим вопросы по каждому аргументу:

1. Первый список известен? Да, известен: у нас в декларативном понимании явно указано: «если первый список пуст». Значит, в качестве первого аргумента ставим константу - пустой список.

2. Второй список известен? Нет, не известен: у нас в декларативном понимании явно сказано: «с любым списком». Он нас интересует? Нет, он нас не интересует, потому что в декларативном понимании нигде не указано на то, что от него зависит или хотим ли мы его узнать. Скорее наоборот, из декларативного понимания следует: «не важно, какой второй список - всё равно результат будет пустым списком». Поэтому, на втором месте - анонимная переменная.

3. Список - результат известен? Да, известен: у нас в декларативном понимании явно сказано: «является пустым списком». Значит, ставим константу - пустой список.

Вашу десятую строчку, например, декларативно можно было бы озвучить так: «(в остальных случаях) пересечение первого и второго списков - такое же, как и пересечение хвоста первого списка и всего второго списка.»

1,2. это голова и хвост первого списка. Думаю, рассуждения для них Вы сможете построить самостоятельно.

3. Второй список. Он нам известен? Нет, он не известен: в нашем декларативном понимании не сказано ни о каком конкретном значении этого списка. Он нас интересует? Да, он нас интересует: в нашем декларативном понимании сказано, что для нахождения списка-результата нам нужно знать весь второй список.

4. Список-результат. Он нам известен? Нет, он не известен: в декларативном понимании ничего не сказано, о том, какое именно конкретное значение будет принимать этот список. Он нас интересует? Да, он нас интересует: исходя из нашего декларативного понимания, именно список-результат мы и хотим найти.

5. Первый список в рекурсивном вызове. Он нам известен? Нет, конкретного значения в декларативном понимании нет. Он нас интересует? Да, знание этого списка нам необходимо для того, чтобы найти результат.

________________________________
Если не будет деревьев — нам нечем будет дышать, если вода загрязнится — нам нечего будет пить.
Krion
Александр
Мар, 2006
Сообщений: 19
Krion url://forum.message:1285

Огромное спасибо за то что объяснили что к чему и почему ошибка возникает, теперь у меня есть не только рабочая программа без ошибки, но теперь я ещё и знаю почему она была.

 

elem(X,[X|_]). /* предикат принадлежности элемента списку*/
 elem(X,[_|L]):-elem(X,L).
 inters([],_,[]).
 inters([X|L1],L2,[X|L3]):-elem(X,L2),!,inters(L1,L2,L3).
 inters([_|L1],L2,L3):-inters(L1,L2,L3).

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

Страницы: [1]
<< Новый  |  Старый >>  |  Ответ не возможен
Вход
Поиск[?]:
Программное обеспечение любой сложности
koins.com.ua