To jest stara wersja strony!
LAB: Wprowadzenie do środowiska ECLiPSe
ECLiPSe jest jednym ze środowisk do programowania z ograniczeniami. Zapewnia ono szerokie możliwości tworzenia własnych ograniczeń oraz doboru właściwego sposobu poszukiwania rozwiązania. Składnia języka ECLiPSe jest oparta o Prolog. Istotne różnice opisane są w następującym przewodniku: http://eclipseclp.org/doc/tutorial/tutorial023.html.
1. Podstawy środowiska
Proszę utworzyć plik o poniższej zawartości (tradycyjnie pliki z kodem ECLiPSe mają rozszerzenie .ecl):
:- lib(ic).
sendmore(Digits) :-
% zmienne
Digits = [S,E,N,D,M,O,R,Y],
% przypisanie dziedziny
Digits :: [0..9],
% Ograniczenia
alldifferent(Digits),
S #\= 0,
M #\= 0,
1000*S + 100*E + 10*N + D
+ 1000*M + 100*O + 10*R + E
#= 10000*M + 1000*O + 100*N + 10*E + Y,
% szukanie rozwiązania
labeling(Digits).
Opis programu
Jest to program rozwiązujący zagadkę SEND+MORE=MONEY.
Przed uruchomieniem przeanalizuj działanie programu. Pierwsza linijka informuje, że będziemy korzystać ze standardowej biblioteki dla dziedzin skończonych. Predykat sendmore Najpierw unifikuje Digits z listą zmiennych wykorzystywanych do opisu problemu. Następnie zmiennym przypisywana jest dziedzina (liczby całkowite od 0 do 9).
Kolejnym etapem jest określenie ograniczeń. predykat alldifferent zapewnia, że wszystkie zmienne będą różne. Następnie wykorzystywane są operatory #\=
oraz #=
określające odpowiednio relację różności i równości. Istnieją różwnież analogiczne operatory większości i mniejszości, należy jednak pamiętać o znaku #
na początku operatora.
Ostatnia linijka powoduje rozpoczęcie wyszukiwania rozwiązania.
Uruchamianie programu
Uruchom eclipse poleceniem tkeclipse.
Wybierz File>Compile i wskaż utworzony plik.
Wywołaj w Query entry predykat sendmore
:
sendmore(Digits)
Zwróć uwagę, aby na liście rozwijanej z lewej strony wybrany był moduł eclipse.
Aby sprawdzić, czy nie istnieje więcej rozwiązań, wciśnij przycisk more.
Alternatywna wersja
Problem SEND + MORE = MONEY można też opisać w alternatywny sposób wprowadzając przeniesienia. Dodaj je do modelu
Carries = [C1,C2,C3,C4],
Carries :: [0..1],
i przepisz ograniczenia tak, aby je wykorzystywały. Sprawdź poprawność porównując z poprzednią wersją.
Kolorowanie mapy
Na podstawie ostatniego programu napisz predykat rozwiązujący problem kolorowania mapy Australii. Dwa sąsiednie stany muszą mieć różne kolory. Czy trzy kolory wystarczą do pokolorowania mapy?
2. Problem n hetmanów
Trochę bardziej zaawansowane możliwości systemu ECLiPSe prezentuje program rozwiązujący problem n hetmanów.
:- lib(ic).
queens(N, Board) :-
length(Board, N),
Board :: 1..N,
( fromto(Board, [Q1|Cols], Cols, []) do
( foreach(Q2, Cols), count(Dist,1,_), param(Q1) do
noattack(Q1, Q2, Dist)
)
).
noattack(Q1,Q2,Dist) :-
Q2 #\= Q1,
Q2 - Q1 #\= Dist,
Q1 - Q2 #\= Dist.
Opis programu
Po pierwsze, model zawiera pętle (fromto
, foreach
, count
, param
). Umożliwiają one bardziej zwarty zapis ograniczeń. Pod drugie, brakuje użycia predykatu label, przez co nie zostanie znalezione żadne rozwiązanie.
Ćwiczenie
Proszę zapisać do pliku i wykonać powyższy kod. Co pojawia się w oknie wyników?