| 1 | % (c) 2012-2022 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, | |
| 2 | % Heinrich Heine Universitaet Duesseldorf | |
| 3 | % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) | |
| 4 | ||
| 5 | :- module(interval_calc,[interval_addition/3 | |
| 6 | ,interval_subtraction/3 | |
| 7 | ,interval_multiplication/3 | |
| 8 | ,interval_negation/2 | |
| 9 | ]). | |
| 10 | ||
| 11 | :- use_module(probsrc(module_information),[module_info/2]). | |
| 12 | :- module_info(group,kodkod). | |
| 13 | :- module_info(description,'This module provides methods to calculate with interval expressions.'). | |
| 14 | ||
| 15 | :- use_module(probsrc(inf_arith)). | |
| 16 | ||
| 17 | interval_addition(irange(Am,AM2),irange(Bm,BM2),irange(Cm,CM2)) :- | |
| 18 | Cm infis Am+Bm, CM2 infis AM2+BM2. | |
| 19 | interval_subtraction(irange(Am,AM2),irange(Bm,BM2),irange(Cm,CM2)) :- | |
| 20 | Cm infis Am-BM2, CM2 infis AM2-Bm. | |
| 21 | interval_multiplication(irange(Am,AM2),irange(Bm,BM2),irange(Cm,CM2)) :- | |
| 22 | MultExprs = [Am*Bm,Am*BM2,AM2*Bm,AM2*BM2], | |
| 23 | get_min(MultExprs,Cm), | |
| 24 | get_max(MultExprs,CM2). | |
| 25 | interval_negation(irange(Am,AM2),irange(Cm,CM2)) :- | |
| 26 | CM2 infis -Am, Cm infis -AM2. | |
| 27 | ||
| 28 | get_min([A],Min) :- !, Min infis A. | |
| 29 | get_min([A|Rest],Min) :- | |
| 30 | get_min(Rest,Rmin), Min infis min(A,Rmin). | |
| 31 | get_max([A],Max) :- !,Max infis A. | |
| 32 | get_max([A|Rest],Max) :- | |
| 33 | get_max(Rest,Rmax), Max infis max(A,Rmax). |