|
|
pl:prolog:prolog_lab:csp_eclipse [2013/01/22 13:13] mbr |
pl:prolog:prolog_lab:csp_eclipse [2019/06/27 15:50] |
====== 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]]. | |
| |
===== -. Podstawy środowiska ===== | |
| |
Proszę utworzyć plik o poniższej zawartości (tradycyjnie pliki z kodem ECLiPSe mają rozszerzenie .ecl): | |
| |
<code prolog> | |
:- 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). | |
</code> | |
| |
=== 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'': | |
<code prolog> | |
sendmore(Digits) | |
</code> | |
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 | |
<code prolog> | |
Carries = [C1,C2,C3,C4], | |
Carries :: [0..1], | |
</code> | |
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 [[http://en.wikipedia.org/wiki/Australia#States_and_territories|mapy Australii]]. Dwa sąsiednie stany muszą mieć różne kolory. Czy trzy kolory wystarczą do pokolorowania mapy? | |
| |
===== -. Problem n hetmanów ===== | |
| |
Trochę bardziej zaawansowane możliwości systemu ECLiPSe prezentuje program rozwiązujący problem n hetmanów. | |
| |
<code prolog> | |
:- 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. | |
</code> | |
| |
=== Opis programu === | |
| |
Po pierwsze, model zawiera [[http://eclipseclp.org/doc/tutorial/tutorial025.html|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? | |