open-axiom repository from github
-- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
-- All rights reserved.
-- Copyright (C) 2007-2011, Gabriel Dos Reis.
-- All rights reserved.
--
-- Redistribution and use in source and binary forms, with or without
-- modification, are permitted provided that the following conditions are
-- met:
--
-- - Redistributions of source code must retain the above copyright
-- notice, this list of conditions and the following disclaimer.
--
-- - Redistributions in binary form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in
-- the documentation and/or other materials provided with the
-- distribution.
--
-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
-- names of its contributors may be used to endorse or promote products
-- derived from this software without specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import bc_-util
namespace BOOT
-- Basic Command matrix entry
bcMatrix() == bcReadMatrix nil
bcReadMatrix exitFunctionOrNil ==
page := htInitPage('"Matrix Basic Command", nil)
htpSetProperty(page,'exitFunction,exitFunctionOrNil)
htMakePage
'((domainConditions
(isDomain PI (PositiveInteger)))
(text . "Enter the size of the matrix:")
(inputStrings
("Number of {\em rows}:\space{3}" "" 5 2 rows PI)
("Number of {\em columns}: " "" 5 2 cols PI))
(text . "\blankline ")
(text . "How would you like to enter the matrix?")
(text . "\beginmenu")
(text . "\item ")
(bcLinks ("\menuitemstyle{By entering individual entries}" "" bcInputExplicitMatrix explicit))
(text . "\item ")
(bcLinks ("\menuitemstyle{By formula}" "" bcInputMatrixByFormula formula))
(text . "\endmenu"))
htShowPage()
bcInputMatrixByFormula(htPage,junk) ==
page := htInitPage('"Basic Matrix Command", htpPropertyList htPage)
htMakePage '(
(domainConditions
(isDomain S (Symbol))
(isDomain FE (Expression (Integer))))
(text . "\menuitemstyle{}\tab{2}")
(text . "Enter the {\em row variable}: ")
(text . "\tab{36}")
(bcStrings (6 i rowVar S))
(text . "\blankline ")
(text . "\newline ")
(text . "\menuitemstyle{}\tab{2}")
(text . "Enter the {\em column variable}: ")
(text . "\tab{36}")
(bcStrings (6 j colVar S))
(text . "\blankline ")
(text . "\newline ")
(text . "\menuitemstyle{}\tab{2}")
(text . "Enter the general {\em formula} for the entries:")
(text . "\newline\tab{2} ")
(bcStrings (40 "1/(x - i - j - 1)" formula FE)))
htMakeDoneButton('"Continue", 'bcInputMatrixByFormulaGen)
nrows :=
null $bcParseOnly => objValUnwrap htpLabelSpadValue(htPage,'rows)
readInteger htpLabelInputString(htPage,'rows)
ncols :=
null $bcParseOnly => objValUnwrap htpLabelSpadValue(htPage,'cols)
readInteger htpLabelInputString(htPage,'cols)
htpSetProperty(page, 'nrows, nrows)
htpSetProperty(page, 'ncols, ncols)
htShowPage()
bcInputMatrixByFormulaGen htPage ==
fun := htpProperty(htPage,'exitFunction) => apply(fun, [htPage])
formula := htpLabelInputString(htPage,'formula)
rowVar := htpLabelInputString(htPage,'rowVar)
colVar := htpLabelInputString(htPage,'colVar)
nrows := htpProperty(htPage,'nrows)
ncols := htpProperty(htPage,'ncols)
bcGen strconc('"matrix([[",formula,'" for ",colVar,'" in 1..",
toString ncols,'"] for ",rowVar,'" in 1..",toString nrows,'"])")
bcInputExplicitMatrix(htPage,junk) ==
nrows :=
null $bcParseOnly => objValUnwrap htpLabelSpadValue(htPage,'rows)
readInteger htpLabelInputString(htPage,'rows)
ncols :=
null $bcParseOnly => objValUnwrap htpLabelSpadValue(htPage,'cols)
readInteger htpLabelInputString(htPage,'cols)
cond := nil
k := 0
wrows := #toString nrows
wcols := #toString ncols
labelList :=
"append"/[[f for j in 1..ncols] for i in 1..nrows] where f() ==
rowpart := strconc('"{\em Row",htStringPad(i,wrows))
colpart := strconc('", Column",htStringPad(j,wcols),'":}\space{2}")
prefix := strconc(rowpart,colpart)
-- name := makeSymbol strconc(htMkName('"row",i),htMkName('"col",j))
name := makeSymbol toString (k := k + 1)
[prefix,'"",30, 0,name,'P]
labelList :=
[['domainConditions, '(isDomain P (Polynomial $EmptyMode)), cond],
['inputStrings, :labelList] ]
page := htInitPage('"Solve Basic Command", htpPropertyList htPage)
bcHt '"Enter the entries of the matrix:"
htMakePage labelList
htMakeDoneButton('"Continue", 'bcGenExplicitMatrix)
htpSetProperty(page,'nrows,nrows)
htpSetProperty(page,'ncols,ncols)
htShowPage()
bcGenExplicitMatrix htPage ==
htpSetProperty(htPage,'matrix,htpInputAreaAlist htPage)
fun := htpProperty(htPage,'exitFunction) => apply(fun, [htPage])
bcGen bcMatrixGen htPage
bcMatrixGen htPage ==
nrows := htpProperty(htPage,'nrows)
ncols := htpProperty(htPage,'ncols)
mat := htpProperty(htPage,'matrix)
formula := symbolTarget('formula,mat) =>
formula := formula.0
rowVar := (symbolTarget('rowVar,mat)).0
colVar := (symbolTarget('colVar,mat)).0
strconc('"matrix([[",formula,'" for ",colVar,'" in 1..",
toString ncols,'"] for ",rowVar,'" in 1..",toString nrows,'"])")
mat := htpProperty(htPage,'matrix) =>
mat := reverse mat
k := -1
matform := [[mat.(k := k + 1).1
for j in 0..(ncols-1)] for i in 0..(nrows-1)]
matstring := bcwords2liststring [bcwords2liststring x for x in matform]
strconc('"matrix(",matstring,'")")
systemError nil