Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Как работать с этой программой?
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
hollo2017 hollo2017 вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.12.2017
По умолчанию Как работать с этой программой? - 20.12.2017, 12:01

Задача про канниболов и миссонеров
prolog Код:
% Решение
% [K, K, K, M, M, M], []
% 1) KM ->
% [K, K, M, M], [K, M]
% 2) M <-
% [K, K, M, M, M], [K]
% 3) KMM ->
% [K, M], [K, K, M, M]
% 4) KM <-
% [K, K, M, M], [K, M]
% 5) KMM ->
% [K], [K, K, M, M, M]
% 6) M <-
% [K, M], [K, K, M, M]
% 7) KM ->
% [], [K, K, K, M, M, M]

count_k(L, N):-
    delete(L, 'm', L1),
    length(L1, M), N is M.

count_m(L, N):-
    delete(L, 'k', L1),
    length(L1, M), N is M.

balance(L):-
    count_m(L, X),
    count_k(L, Y),
    (X >= Y; X == 0).

sort_items(A, B):-
    append(Begin, ['m', 'k' | Tail], A),
    append(Begin, ['k', 'm' | Tail], C),
    sort_items(C, B);
    append(A, [], B).

% KM ->
step(A, B):-
    append(Left, ['>' | Right], A),
    append(Begin, ['k', 'm' | Tail], Left),
    append(Right, ['k', 'm'], Right2),
    balance(Right2),
    sort_items(Right2, RightSorted),
    append(Begin, Tail, L),
    balance(L),
    append(L, ['<'], L1),
    append(L1, RightSorted, B).

% KMM ->
step(A, B):-
    append(Left, ['>' | Right], A),
    append(Begin, ['k', 'm', 'm' | Tail], Left),
    append(Right, ['k', 'm', 'm'], Right2),
    balance(Right2),
    sort_items(Right2, RightSorted),
    append(Begin, Tail, L),
    balance(L),
    append(L, ['<'], L1),
    append(L1, RightSorted, B).

% M <-
step(A, B):-
    append(Left, ['<' | Right], A),
    append(Begin, ['m' | Tail], Right),
    append(['m'], Left, Left2),
    balance(Left2),
    sort_items(Left2, LeftSorted),
    append(Begin, Tail, R),
    balance(R),
    append(['>'], R, R1),
    append(LeftSorted, R1, B).

% KM <-
step(A, B):-
    append(Left, ['<' | Right], A),
    append(Begin, ['k', 'm' | Tail], Right),
    append(['k', 'm'], Left, Left2),
    balance(Left2),
    sort_items(Left2, LeftSorted),
    append(Begin, Tail, R),
    balance(R),
    append(['>'], R, R1),
    append(LeftSorted, R1, B).

% Печать решения

print_way([_]).
print_way([_, B | Tail]):-
    print_way([B | Tail]),
    nl,
    write(B).
   
print_answer([A | _]):-
    nl,
    write(A),
    nl.

prolong([Temp | Tail], [New, Temp | Tail]):-
    step(Temp, New),
    not(member(New, [Temp | Tail])).

% Поиск в глубину

depth_search(Start, Finish):-
    depth([Start], Finish, Way),
    print_way(Way),
    print_answer(Way).

depth([Finish | Tail], Finish, [Finish | Tail]).
depth(TempWay, Finish, Way):-
    prolong(TempWay, NewWay),
    depth(NewWay, Finish, Way).

% Поиск в ширину

breadth_search(Start, Finish):-
    breadth([[Start]], Finish, Way),
    print_way(Way),
    print_answer(Way).

breadth([[Finish | Tail] | _], Finish, [Finish | Tail]).
breadth([TempWay | OtherWays], Finish, Way):-
    findall(W, prolong(TempWay, W), Ways),
    append(OtherWays, Ways, NewWays),
    breadth(NewWays, Finish, Way).

% Поиск с итерационным углублением

int(1).
int(N):- int(M), N is M + 1.

iter_search(Start, Finish):-
    int(Level),
    (
        Level > 100, !;
        id([Start], Finish, Way, Level), print_way(Way), print_answer(Way)
    ).

id([Finish | Tail], Finish, [Finish | Tail], 0).
id(TempWay, Finish, Way, N):-
    N > 0,
    prolong(TempWay, NewWay),
    N1 is N - 1,
    id(NewWay, Finish, Way, N1).

:- use_module(library(statistics)).
Пробую так, но
bash Код:
depth_search((['k','k','k','m','m','m'],[]), ([],['k','k','k','m','m','m'])).
false
Ответить с цитированием
  (#2 (permalink)) Старый
hollo2017 hollo2017 вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.12.2017
По умолчанию 20.12.2017, 20:59

Здесь поиск в ширину и поиск в глубину. Интересно, как запустить этот поиск. Кто-нибудь подскажите пожалуйста. Код не мой
Ответить с цитированием
  (#3 (permalink)) Старый
Винитарх Винитарх вне форума
Специалист
 
Аватар для Винитарх
 
Сообщений: 7,988
Сказал(а) спасибо: 2
Поблагодарили 303 раз(а) в 303 сообщениях
Регистрация: 01.03.2003
Адрес: Краснодар
По умолчанию 20.12.2017, 22:03

Вы запускаете вроде правильно. Может быть ошибка в программе?
Лучше спросить там, где Вы её взяли.
Ответить с цитированием
Пользователь сказал cпасибо:
hollo2017 (21.12.2017)
  (#4 (permalink)) Старый
hollo2017 hollo2017 вне форума
Новичок
 
Сообщений: 3
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 20.12.2017
По умолчанию 21.12.2017, 08:31

Цитата:
Сообщение от Винитарх Посмотреть сообщение
Вы запускаете вроде правильно. Может быть ошибка в программе?
Лучше спросить там, где Вы её взяли.
К сожалению не такой возможности. Но говорят, что все правильно. Может проблема в диалекте? Я пробовал в сви и гну
Ответить с цитированием
  (#5 (permalink)) Старый
Alexiski Alexiski вне форума
Любитель давать советы
 
Сообщений: 4,281
Сказал(а) спасибо: 27
Поблагодарили 54 раз(а) в 54 сообщениях
Регистрация: 16.10.2005
По умолчанию 21.12.2017, 17:18

prolog Код:
?- iter_search((['k','k','k','m','m','m','>']), ([_, 'k','k','k','m','m','m'])).

[k,k,k,m,m,m,>]
[k,k,m,m,<,k,m]
[k,k,m,m,m,>,k]
[k,m,<,k,k,m,m]
[k,k,m,m,>,k,m]
[k,<,k,k,m,m,m]
[k,m,>,k,k,m,m]
[<,k,k,k,m,m,m]
true
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно работать с графической программой A n d r e y С/С++ 2 05.05.2011 19:24
GCC warnings как правильно работать с этой функцией vilru С/С++ 6 26.11.2009 17:40
Как работать с этой программой XLisp-Plus 3.04 abc_kirov Lisp 1 29.03.2009 15:36
Как работать с программой speedfan SuSLiK Разное 0 25.12.2008 22:36
Как работать с программой резервного копирования SyncBackup Shell v0.9 schink Разное 0 04.06.2008 11:54
Как правильно работать с программой jv16 power tools? svetiks Любые вопросы от новичков 3 26.03.2008 17:13
PeekMessage как с этой функцией работать Bogdan1024 С/С++ 2 19.06.2006 13:58
Сложность n*log как работать с этой функцией nattefrost С/С++ 3 22.01.2006 16:42
Как правильно работать с программой Oracle Kelt Oracle 3 23.12.2004 10:21
MinGW Developer Studio как работать на этой платформе Александr С/С++ 2 11.05.2004 16:42
Как работать с программой Дизассамблер Hawk Вопросы начинающих программистов 1 03.08.2003 20:21
FindFileInTree как работать с этой функцией Anonymous Delphi 1 16.12.2002 11:40



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов