14:32

LISP, PROLOG

Буду очень благадорна за помощь в написании программы на обоих языках.

Условие: Даны два предложения. Вывести слова, которые входят в каждое из них, т.е. совпадающее слова.

Как я не билась - написать не получается. :(

Комментарии
12.11.2008 в 15:09

Псих
Языки совершенно не знаю. Могу описать словами как бы я писал такое, скажем, на C.
12.11.2008 в 15:12

Crazy Wizard если не сложно - напиши. Возможно, пойму. :)
12.11.2008 в 15:28

Псих
Для начала я бы создал структуру со следующими полями:
-указатель на строку.
-указатель на эту же структуру.
Потом создал бы 2 указателя на такую структуру с названиями, которые отображали бы суть "начало списка слов первого предложения" и "текущая позиция в списке". Потом я бы пробегал по первому предложению и вытягивал по 1 слову. (искал бы начало слова (первая встретившаяся буква) и конец слова (либо конец строки, либо символ какой-нибудь, либо пробел)). Вот нашёл начало и конец слова, выделил бы место в динам. памяти под это слово и записал бы его туда. Указатель на эту строку в структуру. Потом создание новой структуры, её адрес в соответствующее поле первой структуры. Ну и так далее, пока не получится список слов первого предложения. Потом ищем первое слово во втором предложении, запоминаем его либо в переменной с большим объёмом, либо выделяем память под неё динамично. Пробегаем по списку и сравниваем с каждым словом из первого предложения. Находим - печатаем. Ну и так далее =)
Хотя может можно и как-то проще.. Это первое, что пришло в голову.
12.11.2008 в 15:31

Псих
Хотя сори, я ступил) Это плохой способ) Ищем первое слово, записываем в отдельную переменную, потом ищем вхождение слова во второй строке, только если слово, скажем, "абв", надо искать " абв " или " абв"+любой символ =)
12.11.2008 в 15:33

спасибо)
попробую скомпоновать..
12.11.2008 в 16:14

I'm not dead... yet.
В прологе так сделать не получится, потому что это совершенно извращенский язык, там даже и текста программы-то нет по большому счету. Там все основано на рекурсии и пока додумаешься, как это сделать, голову сломать можно. А вот в лиспе можно попробовать реализовать нормальный алгоритм. Я бы помог, но мы эти языки проходили года три назад, сдал и забыл как страшный сон...
12.11.2008 в 16:17

ну если нас дали такое задание - значит на прологе можно реализовать.. весь вопрос в том: как?((
по ходу дела этого не знает никто..

я тоже мечтаю сдать лисп и забыть.. хотя нам все твердят, что это очень полезно..
12.11.2008 в 19:22

няшный лисп это хорошо [:
вот реализация на схеме (плт) - paste.org.ru/?qyarpq

пролога не знаю, а на эрланге думаю не подойдет

пысы
для правильной работы надо кое-где поменять местами значения (-;
12.11.2008 в 19:24

Just-a-Shadow рекурсия божественна :Р
и очень сильна, если ее правильно применять ( и оптимизировать компилятором )
12.11.2008 в 20:06

slackovod спасибо)

посмотрела.. не все поняла, но разберусь думаю..
12.11.2008 в 22:04

I'm not dead... yet.
Не, я не говорил что это невозможно сделать на прологе, у нас тоже были задания типа этого... я имел в виду, что на прологе нельзя просто взять и реализовать какой-то алгоритм, применимый к любому другому языку. Потомучто в нем нет переменных, нет циклов, нет переходов... да и компилятора-то нет. Язык в каком-то смысле очень интересный, но бесполезный :( Вот для примера одна из моих лабораторных:


——————————————————
/*Дан файл, содержащий слова, разделенные пробелами, причем
среди них встречается слово BOOK. Создать файл, который будет
содержать слова из исходного файла, а слово BOOK будет заменено
словом CAR.*/

q :- exitsys.

/* Чтение слова */

read_word( Word ) :- get0(C),
!,
char(C, FirstChar),
get0(C1),
word_tail(C1, Tail),
name(Word, [FirstChar|Tail]).

word_tail(C, [NewChar|Tail]) :- char(C, NewChar),
get0(C1),
word_tail(C1, Tail); char(C, NewChar).

word_tail(C, []).

char(C, C) :- C>=97, C=65, C'), print(NW), nl.


/* Рекурсивная обработка файла */
work:- read_word(Word), print('|'), one_word(Word), !, work.


t :- see('1.txt'), (work, !, fail); see(user).

t2 :- see('1.txt'), get0(C).

————————————————————————————————

Пошарился сейчас по винту, думал может найду что-то похожее на задание, которое нужно реализовать, но нашел только это...
12.11.2008 в 23:22

Just-a-Shadow эмм... для программирования совсем не обязательно иметь именно переменные, циклы и переходы (-;
например любой цикл заменяеться хвостовой рекурсией. переходы - функциями. переменные вообще ненужны, достаточно констант. нужен только правильный компилятор.а то что его у пролога нет ( да и нет ли на самом деле, черт их знает эти секретные лаборатории ;-)).

в моем исходнике хвостовая рекурсия как раз таки используеться для создания цикла (хотя думать в терминах рекурсии имхо удобней)

кста насколько я знаю программное обеспечение части небезизвестной системы энергия-буран написана именно на нем
13.11.2008 в 11:43

I'm not dead... yet.
slackovod
кста насколько я знаю программное обеспечение части небезизвестной системы энергия-буран написана именно на нем
ну да, я тоже читал про это, но это жесть... имхо, ПО для таких вещей лучше писать на чем-то известном и проверенном, например для боинга его пишут на си, на обыкновенном си, без объектов.
13.11.2008 в 13:45

Just-a-Shadow , и в чем же преимущества "известного и проверенного си" если оба подхода способны обеспечить нужный уровень надежности и производительности? + не забываем зависимость кол-ва ошибок от объема кода, что очень важно для действительно больших и сложных систем
13.11.2008 в 14:23

I'm not dead... yet.
slackovod не хочу я спорить про преимущества си перед прологом при разработке ПО для летательных аппаратов, это уже оффтоп получается, да и лень мне :)
13.11.2008 в 14:26

оффтоп говорите?.... ((%