ProLog

для паскаля у нас есть,скажем так,поле военных действий и не одно,пусть и по Прологу будет))

"думаю можно разок"))

ну в качестве первого комментария хотелось бы немного не прям по программированию сказать,а просто в целом о впечатлениях об этом языке,ну думаю можно разок)))конечно мы сейчас изучаем только азы,но уже язык кажется интересным,особенно тем что он не похож на Паскаль,другая логика,оформление))

123

Да уж, вторая лаба уже очень интересная... Чувствую, придётся провозиться не один час.

час?

Саш,не знаю как ты,но мне дня точно не хватит)))))))

2-курс, Пролог.

Ну что вы на задворках, как бедные родственники?
Стесняетесь? Напрасно! Вы мне по-прежнему дороги. Спрашивайте, я готов Вам помочь.
А хотите, и Шумаф Туркубиевича привлечём?
Ну вот вам для разминки пара задачек.
Пролог. Задача1. На основе операции сложения реализовать предикат mult(M,N,Z), который конкретизирует Z произведением натуральных значений M и N. (умножение, конечно, не использовать).

Пролог. Задача2. Реализовать предикат sum(M,Z), который конкретизирует Z суммой цифр десятичной записи записи заданного натурального M .

Совет. Попробуйте написать для заданных задач сначала рекурсивные программы их решения на ТП (т.е. без явных циклических конструкций). Перевод таких программ в Пролог - чисто техническое упражнение. Удачи!

Задача 2

  1. sum(M,Z):- M<10, Z is M.
  2. sum(M,Z):- M1 is M // 10,
  3.            X is M mod 10,
  4.            sum(M1,Z1),
  5.            Z is X + Z1.          

Задача 1

  1. mult(M,1,Z):- Z is M.
  2. mult(M,N,Z):- dec(N,N1), mult(M,N1,Z1), Z is M + Z1.

Молчанов Дима

Задача 2 - в зачёт.
По задаче 1 неясно, что за предикат dec(...) и можно ли без него обойтись ...

Задача 1

Можно и так:

  1. mult(M,1,Z):- Z is M.
  2. mult(M,N,Z):- N1 is N - 1, mult(M,N1,Z1), Z is M + Z1.

Где справедливость, я спрашиваю???)))

Балин, так нечестно, только зашёл, и всё решено((((
Вчера пять часов убил на решение 13 задач по прологу, которые никто больше и не делал, так ещё и тут прокол. Единственная радость, что теперь могу сказать: первые элементарные задачи решаю практически моментально. =DDDD

.

Валерий Шахамболетович, дайте нам, пожалуйста, что-нибудь эдакое порешать. =)

Небольшая задача

Задача про количество чётных и нечётных цифр числа. Надеюсь, никто не возражает, что я её сюда кину.

  1. ch(X,Y):-
  2.             X<10,
  3.             Y is (1-(X mod 2));
  4.             X1 is X//10,
  5.             ch(X1,Y1),
  6.             Y is Y1+(1-(X mod 2)).
  7. nech(X,Y):-
  8.             X<10,
  9.             Y is X mod 2;
  10.             X1 is X//10,
  11.             ch(X1,Y1),
  12.             Y is Y1+(X mod 2).
  13. kolvo:-
  14.             write('Vvedite chislo i postavte tochku'),nl,
  15.             read(X),nl,
  16.             ch(X,Y),
  17.             nech(X,Y1),
  18.             write('Kolichestvo chetnyh tsyfr ravno'),nl,
  19.             write(Y),nl,
  20.             write('Kolichestvo nechetnyh tsyfr ravno'),nl,
  21.             write(Y1),nl.

:(

ну вот...а я всё пропустил...:(

Не переживайте, Серёжа...

Да простит меня Саша, сомнительное решение ...

PROLOG

Prolog -Задача1, Дмитрий, согласен.

Александр:

  1. procedure Cht_Necht(N:Word; var Ch, Nch:Byte);
  2.      var N1:Word; Ch1,Nch1,k :byte;
  3. Begin
  4.      if N < 10 then begin
  5.         Ch:= 1 - N mod 2; Nch:=N mod 2;
  6.      End Else  begin
  7.         k:=N mod 10; N1:= N div 10;
  8.         Cht_Necht(N1, Ch1, Nch1);
  9.         Ch:= Ch1 + (1 - k mod 2);
  10.         Nch:=Nch1 + k mod 2
  11.      end;
  12. End;

точно!

Логично было всё в один предикат уместить, ибо принцип действия схожий. Реализацию на Прологе писать, наверное, смысла нет, т.к. там ничего сложного. Только один вопрос: зачем нам вводить переменную k? Нам же достаточно просто искать остаток от деления самого текущего числа. Хотя особой роли это не играет. =)

Зиновьев А.

Дело тут не только в том, один или несколько предикатов. У Вас неверная база рекурсии (в обоих основных предикатах).
Жаль, что Вы во-первых, не последовали моему совету отрабатывать логику решения сначала на более понятном и привычном для Вас Паскале и, во-вторых, ленитесь проверять решения на практике. Я бы на Вашем месте задачку всё же довёл до практической реализазации.
А что касается моей переменной k, то она лишь для удобства.
И ещё. Уж слишком паскалеподобный у Вас стиль Пролог-программирования.

Неправда((

Я всегда всё по несколько раз перепроверяю, прежде чем написать. Хоть убейте, не вижу, что там неправильно, чёрт побери... Вот количество чётных из первого решения на Паскале:

  1. procedure chet(ch:word; var s:byte);
  2.   var s1:byte; ch1:word;
  3. begin
  4.   if ch<10 then s:=1-(ch mod 2)
  5.   else begin
  6.     ch1:=ch div 10;
  7.     chet(ch1,s1);
  8.     s:=s1+(1-(ch mod 2))
  9.   end
  10. end;

реализация в прологе второго решения:
  1. chnech(X,Ch,Nech):-
  2.               X<10,
  3.               Ch is 1-(X mod 2),
  4.               Nech is X mod 2;
  5.               X1 is X//10,
  6.               chnech(X1,Ch1,Nech1),
  7.               Ch is Ch1+(1-(X mod 2)),
  8.               Nech is Nech1+(X mod 2).

Sorry, Александр,

Не заметил символы ';' в 3-й и 9-й строках вашего исходного решения и отнёс то, что стоит за ними к продлжению базы рекурсии, т.е. к условию X<10.
Кстати, это свидетельство того, что ';' лучше не употреблять в длинной последовательности предложений, разделённых запятыми. Программа теряет в наглядности.
В любом случае, базу и шаг рекурсии всегда оформляйте как отдельные правила процедуры.
Если не принимать во внимание последнего замечания, 2-е Пролог решение - конфетка!

P.S. А вот чёрта упоминать в диалоге с преподавателем (да и просто, со старшим по возрасту) не пристало ...
Тем более, что и убивать Вас я не собирался.

ну вот...

и я все пропустила:(

////

Я больше не буду, исправлюсь. =) Честное пионерское!

Даны 2 списка.Сравнить их

  1. rav([X],[X]).
  2. rav([X|R],[X|L]):-rav(R,L).
.

Дан список,является ли он палиндромом?

  1. pal(L):-revers(L,L).
.

Реверс

Оксана почему-то сам реверс не написала. =)

  1. revers([],L).
  2. revers([X|R],L):-revers(R,[X|L]).

ахахах,потому что мягко говоря...

невнимательная)))))))ахахах,почему то решила,что выложила,во даю)))

Prolog-Revers

Саша, Ваша база рекурсии: реверсируя пустой список, получим ЛЮБОЙ список(?!)

Самый лакомый кусочек

Самый лакомый кусочек (мякоть) задачи Оксана, как и подобает настоящей женщине, оставила мужчинам :))

мой забытый revers=)

  1. revers([X],X).
  2. revers([X|L],T):-revers(L,T),soed(T,X,R).%soed-слияние 2х                                                                       списков.разобрано на паре=)

P.S.а мужчины пусть свои лакомые кусочки выкладывают,все равно у нас разные,так что тоже выложила))

Оксана, и у Вас ошибки:

Оксана, и у Вас ошибки:
1 строка. Всё же, Х - это терм или список?
2 строка. Всё же, Т - это результат реверса списка [X|L] или списка L?

подразумевалось..

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

А если так?))

  1. revers([],L,L).
  2. revers([X|L1],L2,T):-revers(L1,[X|L2],T).

Oксана

Оксана, не ясно, почему 3 параметра. Задан входной список, а получаем реверсный, так что их должно быть 2 ...

ну второй как

ну второй как вспомогательный...хотя это мое решение кажется ничем не отличается от решения Саши,кроме того что 3 параметра

просто я не могу понять как

просто я не могу понять как можно базу рекурсии записать в 2 параметра,чтоб логично было

Вот Вам, Оксана, простая

Вот Вам, Оксана, простая база рекурсии ...
rev([],[]).

я уже совсем запуталась((

с решением Саши логически я согласна,если заменить базу на ту что вы,Валерий Шахамболетович,сказали,НО этот вариант не работает...на счет реверса я сдаюсь,уступаю этот "лакомый кусочек" мужчинам...

Не ясно, Оксана, какой ЭТОТ

Не ясно, Оксана, какой ЭТОТ вариант, который не работает. Я пока вообще не видел ни у кого из вас рабочих вариантов. Ну, раз так трудно, то вот ...

  1. rev([],[]).
  2. rev([X|L],R):-rev(L,L1), soed(L1,[X],R).

Попробуйте в Arity и отпишитесь.

программа выдает NO

программа выдает NO

ошибка в soed

я проверила отдельно слияние и оно не работает для 2х непустых списков

Вы уверены, Оксана?

  1. soed([],L,L).
  2. soed([X|R],L,T):- soed(R,L,T1), T=[X|T1].

и это не работает? (к сожалению, у меня нет под рукой Arity и сам я не могу проверить ...)

Да

Всё работает... Я всё никак не мог придумать, как с пустого списка начать.

так работает просто в

так работает
просто в аудитории у нас был другой soed

Какой был soed

Какой был soed в аудитории? Приведите пожалуйста ...

Такой же

Запись была просто немного другой.

  1. soed([],L,L).
  2. soed([X|L],T,[X|R]):-soed(L,T,R).

Проверьте, Саша, всё же и

Проверьте, Саша, всё же и этот "классный" вариант.
Если он действительно не идёт, то это очень странно ...

123

Да я сразу же и попробывал в реверсе использовать "классный" вариант. Всё работает. =)

Спасибо, Саша, привет Оксане!

Спасибо, Саша, вопрос закрыт, привет Оксане!

Здравствуйте))

но для 2ух непустых не работает

123

Я не знаю, Оксана, как ты запускаешь, но у меня и для двух непустых, и для пустого и непустого, и вообще разные варианты перепробывал, работает "классный" вариант для всех.

И я пробовал - работало.

И я пробовал - работало. Подойдите, Оксана, на бльшой перемене - попробуем вместе.

пузырьковая

  1. min([X],X).
  2. min([X,Y|R],Z):-X>Y,min([Y|R],Z);min([X|R],Z).
  3. udal(X,[X|L],L).
  4. udal(X,[Y|R],[Y|T]):-udal(X,R,T).
  5. puzyr([],[]).
  6. puzyr(L,[Z|R]):-min(L,Z),udal(Z,L,P),puzyr(P,R).

Придумал только такую реализацию.