2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Функции в Mathematica
Сообщение05.09.2013, 15:51 
Вопрос такой как Mathematica сделать функцию от двух аргументов, при чем второй "опциональный", так чтобы если (x_ - число, то x; если x_-что-то другое, то ничего)

работающий пример такой

fun[a:_,b:_|PatternSequence[]]:=If[NumericQ[b], a b, a]

или

fun[a_,b_|PatternSequence[]]:=If[NumericQ[b], a b, a]

кому как больше нравиться, но хочется написать внутри функции, что то вроде

fun[a_,b_?NumericQ:PatternSequence[]]:=a b

это конечно не правильно, просто хочется проверки делать не снаружи а внутри и так чтобы если (x_ - число, то x; если x_-что-то другое, то ничего)
у кого нибудь есть какие нибудь идеи, я всё никак не могу сообразить....

 
 
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 17:20 
В две строчки не устроит?
Код:
fun[a_, b_?NumericQ] := a b
fun[a_, b_] := a

Частные правила проверяются раньше.

 
 
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 17:38 
я немного доработал, т.к. второй аргумент должен быть "опциональным", т.е. случай когда он отсутствует, тоже должен работать получилось

Код:
fun[a_,b_?NumericQ|PatternSequence[]]:=a b
fun[a_,b_]:= a


не совсем понял про частные правила, можете написать подробнее или дать ссылку в Mathematica Book, спасибо!

Решение интересное, но хотелось бы найти возможность сделать "без химии", при помощи одного объявления, этот пример понятно тестовый, хочется понять шаблон как делать такие функции...

 
 
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 18:54 
Насчет правил, если для f заданы три определения, неважно в каком порядке
Код:
f[1]=2
f[a]:=a^2
f[x_]:=3x

Сначала будет проверяться первое (самое частное), потом второе, потом третье. Это есть в хелпе, но не помню где. Можно еще так:
Код:
fun[a_, b_?NumericQ] := a b
fun[a_, b_:1] := a b

Есть функция Default для опционального аргумента и связанная форма записи, но это тоже не в одну строчку.

 
 
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 20:17 
(Опоздал, но пусть уж будет. :-) )

Частные правила — это, грубо говоря, те правила, в которых шаблоны соответствуют меньшему количеству вещей. Т. е., например, 0 соответствует только одному значению, _Integer — большему количеству, а _ — вообще всем вещам. И потому если у вас есть определения
Код:
f[0] = 1
f[_Integer] = 2
f[_] = 3
, даже если они будут исполнены в другом порядке, Mathematica при вызове f[что-нибудь] будет сначала проверять это что-нибудь на соответствие 0; потом, если не подойдёт, _Integer; потом _.

Правда, сейчас я не знаю, как будут сравниваться на «частность» два несравнимых шаблона, которым всё же соответствует что-то общее.

godaygo в сообщении #760756 писал(а):
но хотелось бы найти возможность сделать "без химии", при помощи одного объявления
Как по мне, это вредное стремление. Зачем такие ограничения?

 
 
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 21:48 
С одной стороны такие ограничения, своего рода перфекционизм , с другой большая правая часть. Задача написать своего рода интерпритатор для внешней программы (правда технология моего написания немного глупая, но всё же), залить его в отдельную библиотеку, тут вроде понятно, что можно и без этого обойтись и использовать предложенные Вами решения.
Другой интерес вызван с точки Генетического программирования, где второй паттерн, это может быть и число и заголовок или вообще "какой нибудь зверь", а функцию составляет сама программа, что бы не заставлять программу думать сколько одинаковых функций писать (с пониманием этих частных правил), требуется написание одной функции с двумя аргументами, с тестовой проверкой для второго.

 
 
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 21:54 
godaygo в сообщении #760869 писал(а):
что бы не заставлять программу думать сколько одинаковых функций писать
По-моему, выбор любого способа реализации такой функции требует от программы, составляющей её, думать одинаково много.

 
 
 
 Re: Функции в Mathematica
Сообщение05.09.2013, 22:47 
Не совсем так, на самом деле если бы в Mathematica было реализовано "выбор паттерна по условию", все было бы гораздо легче. Что-то вроде паттерна в стиле If или Switch . Но всё равно, спасибо Вам огромное!

 
 
 [ Сообщений: 8 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group