1. Даны два бидона – 7-ми литровый и 5-ти литровый. В начале оба
бидона пустые. Найти последовательность действий, в результате которых в 7-
ми литровом бидоне останутся 4 литра (неважно сколько воды останется в
другом бидоне). Возможные действия, которые можно производить:
- бидон может быть наполнен;
- бидон может быть опустошен;
- вода может быть перелита из одного бидона в другой до тех пор, пока
первый не опустошился или второй не наполнился.
Другие языки программирования и технологии
Помогите написать программу на языке PROLOG
Вот программа на языке PROLOG, которая решает эту задачу:
```prolog
% определение состояния
state(X,Y) :- X >= 0, X =< 7, Y >= 0, Y =< 5.
% наполнение бидона
fill(7,Y,state(X,Y),state(7,Y)).
fill(X,5,state(X,Y),state(X,5)).
% опустошение бидона
empty(0,Y,state(X,Y),state(0,Y)).
empty(X,0,state(X,Y),state(X,0)).
% переливание воды из одного бидона в другой
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) >= 7,
X1 is 7,
Y1 is (Y - (7 - X)),
state(X1,Y1),
X2 is X,
Y2 is Y.
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) < 7,
X1 is (X + Y),
Y1 is 0,
state(X1,Y1),
X2 is X,
Y2 is Y.
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) >= 5,
X1 is (X - (5 - Y)),
Y1 is 5,
state(X1,Y1),
X2 is X,
Y2 is Y.
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) < 5,
X1 is 0,
Y1 is (X + Y),
state(X1,Y1),
X2 is X,
Y2 is Y.
% определение цели
goal(state(4,_)).
% поиск решения
solve(State,Solution) :-
goal(State),
write(Solution),
nl.
solve(State,Solution) :-
fill(7,Y,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
fill(X,5,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
empty(0,Y,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
empty(X,0,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
pour(_,_,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
```
Чтобы найти решение этой задачи с помощью этой программы на языке PROLOG, вы можете запустить запрос `solve(state(0,0),[state(0,0)])`. Этот запрос вернет последовательность действий для достижения цели.
```prolog
% определение состояния
state(X,Y) :- X >= 0, X =< 7, Y >= 0, Y =< 5.
% наполнение бидона
fill(7,Y,state(X,Y),state(7,Y)).
fill(X,5,state(X,Y),state(X,5)).
% опустошение бидона
empty(0,Y,state(X,Y),state(0,Y)).
empty(X,0,state(X,Y),state(X,0)).
% переливание воды из одного бидона в другой
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) >= 7,
X1 is 7,
Y1 is (Y - (7 - X)),
state(X1,Y1),
X2 is X,
Y2 is Y.
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) < 7,
X1 is (X + Y),
Y1 is 0,
state(X1,Y1),
X2 is X,
Y2 is Y.
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) >= 5,
X1 is (X - (5 - Y)),
Y1 is 5,
state(X1,Y1),
X2 is X,
Y2 is Y.
pour(X1,Y1,state(X,Y),state(X2,Y2)) :-
(X + Y) < 5,
X1 is 0,
Y1 is (X + Y),
state(X1,Y1),
X2 is X,
Y2 is Y.
% определение цели
goal(state(4,_)).
% поиск решения
solve(State,Solution) :-
goal(State),
write(Solution),
nl.
solve(State,Solution) :-
fill(7,Y,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
fill(X,5,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
empty(0,Y,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
empty(X,0,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
solve(State,Solution) :-
pour(_,_,State,NextState),
\+ member(NextState,Solution),
solve(NextState,[NextState|Solution]).
```
Чтобы найти решение этой задачи с помощью этой программы на языке PROLOG, вы можете запустить запрос `solve(state(0,0),[state(0,0)])`. Этот запрос вернет последовательность действий для достижения цели.
Вот один из возможных вариантов решения задачи на языке PROLOG:
% Правило, которое определяет, что бидон с объемом Volume имеет начальное состояние Empty.
empty(bidon(Volume), Empty) :-
Empty is 0.
% Правило, которое определяет, что бидон с объемом Volume имеет максимальное состояние Full.
full(bidon(Volume), Full) :-
Full is Volume.
% Правило, которое определяет, что объем воды в бидоне составляет Amount.
contains(bidon(Volume), Amount) :-
Amount >= 0,
Amount =< Volume.
% Правило, которое определяет, что бидон Volume1 может быть переливан в бидон Volume2.
pour(bidon(Volume1), bidon(Volume2), Result1, Result2) :-
contains(bidon(Volume1), Amount1),
contains(bidon(Volume2), Amount2),
Total is Amount1 + Amount2,
(Total =< Volume2 -> Result1 = empty(bidon(Volume1), 0), Result2 = contains(bidon(Volume2), Total) ;
Total > Volume2 -> Result1 = contains(bidon(Volume1), Total - Volume2), Result2 = full(bidon(Volume2), Volume2)).
% Правило, которое определяет, что бидон Volume1 может быть наполнен.
fill(bidon(Volume1), Result) :-
Result = full(bidon(Volume1), Volume1).
% Правило, которое определяет, что бидон Volume1 может быть опустошен.
empty(bidon(Volume1), Result) :-
Result = empty(bidon(Volume1), 0).
% Правило, которое определяет последовательность действий, необходимых для получения 4 литров в 7-ми литровом бидоне.
solution([empty(bidon(7), 0), fill(bidon(5), bidon(5)), pour(bidon(5), bidon(7), bidon(0), bidon(5)),
fill(bidon(5), bidon(5)), pour(bidon(5), bidon(7), bidon(3), bidon(2)), empty(bidon(7), 0),
pour(bidon(5), bidon(7), bidon(0), bidon(5)), fill(bidon(5), bidon(5)), pour(bidon(5), bidon(7), bidon(2), bidon(3))]).
Здесь мы определили несколько правил для моделирования состояния и действий с бидонами, а также определили последовательность действий, необходимых для получения 4 литров в 7-ми литровом бидоне.
% Правило, которое определяет, что бидон с объемом Volume имеет начальное состояние Empty.
empty(bidon(Volume), Empty) :-
Empty is 0.
% Правило, которое определяет, что бидон с объемом Volume имеет максимальное состояние Full.
full(bidon(Volume), Full) :-
Full is Volume.
% Правило, которое определяет, что объем воды в бидоне составляет Amount.
contains(bidon(Volume), Amount) :-
Amount >= 0,
Amount =< Volume.
% Правило, которое определяет, что бидон Volume1 может быть переливан в бидон Volume2.
pour(bidon(Volume1), bidon(Volume2), Result1, Result2) :-
contains(bidon(Volume1), Amount1),
contains(bidon(Volume2), Amount2),
Total is Amount1 + Amount2,
(Total =< Volume2 -> Result1 = empty(bidon(Volume1), 0), Result2 = contains(bidon(Volume2), Total) ;
Total > Volume2 -> Result1 = contains(bidon(Volume1), Total - Volume2), Result2 = full(bidon(Volume2), Volume2)).
% Правило, которое определяет, что бидон Volume1 может быть наполнен.
fill(bidon(Volume1), Result) :-
Result = full(bidon(Volume1), Volume1).
% Правило, которое определяет, что бидон Volume1 может быть опустошен.
empty(bidon(Volume1), Result) :-
Result = empty(bidon(Volume1), 0).
% Правило, которое определяет последовательность действий, необходимых для получения 4 литров в 7-ми литровом бидоне.
solution([empty(bidon(7), 0), fill(bidon(5), bidon(5)), pour(bidon(5), bidon(7), bidon(0), bidon(5)),
fill(bidon(5), bidon(5)), pour(bidon(5), bidon(7), bidon(3), bidon(2)), empty(bidon(7), 0),
pour(bidon(5), bidon(7), bidon(0), bidon(5)), fill(bidon(5), bidon(5)), pour(bidon(5), bidon(7), bidon(2), bidon(3))]).
Здесь мы определили несколько правил для моделирования состояния и действий с бидонами, а также определили последовательность действий, необходимых для получения 4 литров в 7-ми литровом бидоне.
Похожие вопросы
- Помогите написать программу на языке програмирования КУМИР
- помогите написать программу на языке С!
- Помогите пожалуйста! помогите написать программу на языке паскаль
- помогите написать программу на языке Си: В одномерном массиве целых чисел заменить максимальное значение минимальным.
- помогите написать программу на языке си
- Помогите написать программу на языке Pascal ABC
- помогите понять-программа, которая переводит новую написанную программу на языке, понятном прогр
- Помогите написать программу на любом языке программирования
- Помогите пожалуйста написать программу на языке программирования AssemblerКто первый поможет сделать правильно10балов+50
- Помогите написать программу со switch в СИ