Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Prolog] Задача о перестановке кубиков, Требуется ваша помощь 
V
    Опции темы
VIP52
Дата 27.5.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.5.2008

Репутация: нет
Всего: нет



Здравствуйте. 
Совсем недавно начал работать с языком Visual Prolog. Пока не совсем разобрался. Требуется ваша помощь. 

Задание

Имеется четыре пронумерованных кубика. На столе есть три места, на которые можно положить один или несколько кубиков в столбик. Можно брать кубик со стола или верхний кубик в столбике, а помещать на разрешённое место на столе или на верхний кубик в столбике.
На одном из разрешённых мест находится столбик кубиков 1234 (кубик с номером один сверху). Требуется переложить кубики на любое разрешённое место так, чтобы их номера образовывали интерактивно задаваемую последовательность.

Моя программа

Код

DOMAINS

d_v = v(string,string,string) 
list = d_v*

PREDICATES

nondeterm duga(d_v, d_v) 
nondeterm path(d_v What, list, d_v End_vert) 

nondeterm begin(d_v, d_v) 
nondeterm member(d_v, list) 
out_list(list) % вывод на экран элементов списка.

GOAL

write("Место 1 (начало):"), readln(X),
write("Место 2 (начало):"), readln(Y),
write("Место 3 (начало):"), readln(Z),
write("Место 1 (конец):"), readln(X1),
write("Место 2 (конец):"), readln(Y1),
write("Место 3 (конец):"), readln(Z1),
begin(v(X,Y,Z), v(X1,Y1,Z1)).

CLAUSES

begin(v(X,Y,Z), v(X1,Y1,Z1)) :- path(v(X,Y,Z), [v(X1,Y1,Z1)], v(X1,Y1,Z1)).

path(v(X,Y,Z), Was, v(X1,Y1,Z1)) :- write("Путь: "), out_list(Was).

path(v(X,Y,Z), Was, v(X1,Y1,Z1)) :- 
duga(v(X,Y,Z), v(X1,Y1,Z1)), 
not(member(v(X1,Y1,Z1), Was)), 
path(v(X1,Y1,Z1), [v(X1,Y1,Z1)|Was], v(X1,Y1,Z1)). 

out_list([v(H,L,N)|T]) :- out_list(T), nl, write("( ",H,", ",L,", ",N," )").
out_list([ ]).
member(H, [H|_]). 
member(H, [_|T]) :- member(H,T).

duga(v(X,Y,Z),v(X1,Y1,Z)):-X<>"",frontstr(1,X,A,Res),X1=Res,concat(A,Y,Y1).
% из первого во второй

duga(v(X,Y,Z),v(X1,Y,Z1)):-X<>"",frontstr(1,X,A,Res),X1=Res,concat(A,Z,Z1).
% из первого в третий

duga(v(X,Y,Z),v(X1,Y1,Z)):-Y<>"",frontstr(1,Y,B,Res),Y1=Res,concat(B,X,X1).
% из второго в первый

duga(v(X,Y,Z),v(X,Y1,Z1)):-Y<>"",frontstr(1,Y,B,Res),Y1=Res,concat(B,Z,Z1).
% из второго в третий

duga(v(X,Y,Z),v(X1,Y,Z1)):-Z<>"",frontstr(1,Z,C,Res),Z1=Res,concat(C,X,X1).
% из третьего в первый

duga(v(X,Y,Z),v(X,Y1,Z1)):-Z<>"",frontstr(1,Z,C,Res),Z1=Res,concat(C,Y,Y1).
% из третьего во второй


Реализовывал с помощью орграфа. 
Выводит только конечный результат, а не весь маршрут. Толи со списком проблема какая, толи еще что-то... Не могу понять, в чем проблема. 

Можете что-нибудь подсказать?
PM MAIL   Вверх
VIP52
Дата 30.5.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 27.5.2008

Репутация: нет
Всего: нет



Задачу решил.


Закрыто.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.