Другие языки программирования и технологии

Помогите написать программу на языке PROLOG

1. Даны два бидона – 7-ми литровый и 5-ти литровый. В начале оба
бидона пустые. Найти последовательность действий, в результате которых в 7-
ми литровом бидоне останутся 4 литра (неважно сколько воды останется в
другом бидоне). Возможные действия, которые можно производить:
- бидон может быть наполнен;
- бидон может быть опустошен;
- вода может быть перелита из одного бидона в другой до тех пор, пока
первый не опустошился или второй не наполнился.
Zura Bagomedoff
Zura Bagomedoff
318
Вот программа на языке 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)])`. Этот запрос вернет последовательность действий для достижения цели.
Armen Cuxunyan
Armen Cuxunyan
11 134
Лучший ответ
Вот один из возможных вариантов решения задачи на языке 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-ми литровом бидоне.
BT
Bah Tong
538