Nasıl bir temel aritmetik ifade kolaylaştırabilirsiniz?

oy
6

Nasıl bir temel aritmetik ifade kolaylaştırabilirsiniz?

Örneğin

module ExprOps where 

simplify :: Expr -> Expr
simplify (Plus(Varx) (Const 0)) = Var x

Ne yapmam gerek?


module Expr where

-- Variables are named by strings, assumed to be identifiers.
type Variable = String

-- Representation of expressions.
data Expr = Const Integer
          | Var Variable
          | Plus Expr Expr
          | Minus Expr Expr
          | Mult Expr Expr
          deriving (Eq, Show)

Aklımdaki basitleştirmeler şunlardır:

0*e = e*0 = 0
1*e = e*1 = 0+e = e+0 = e-0 = e

Var st Var s den ayrı değişkendir: ve sürekli subexpressions basitleştirilmesi, örneğin Plus (Sabit 1) (Sabit 2) değişkenleri (veya değişkenler ve sabitler) birleştirilecek istemem İnş 3. olacaktı.

Ne elde etmek istiyorum yukarıdaki gibi bir modül oluşturmaktır adında bir işlev kullanır simplify :: Expr->Expr

Oluştur 26/11/2008 saat 11:27
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
0

Biz GMP rationals gibi, burada rationals bahsediyoruz? Eğer öyleyse, o biri kendi karşılıklı içine ikinci argüman yapma ve sonra çarparak bir bölümü basitleştirmek başladı.

Bunun dışında, çarpma ilavesi kereden fazla yapılır ve bölme çıkarma kereden fazla yapılır.

Mitch yorumlarda belirttiği gibi, size basitleştirmek için çalışıyoruz hakkında bazı bilgi ile yapabilirdi.

Cevap 26/11/2008 saat 11:43
kaynak kullanıcı

oy
10

Eh, doğru genel bir model var. Sadece daha fazla kurallara ihtiyacımız ve yinelemeli sadeleştirme sürecini uygulamak.

simplify :: Expr -> Expr 
simplify (Mult (Const 0) x) = Const 0 
simplify (Mult x (Const 0)) = Const 0
simplify (Plus (Const 0) x) = simplify x
simplify (Plus x (Const 0)) = simplify x 
simplify (Mult (Const 1) x) = simplify x 
simplify (Mult x (Const 1)) = simplify x 
simplify (Minus x (Const 0)) = simpify x
simplify (Plus (Const x) (Const y)) = Const (x + y)
simplify (Minus (Const x) (Const y)) = Const (x - y)
simplify (Mult (Const x) (Const y)) = Const (x * y)
simplify x = x
Cevap 26/11/2008 saat 15:49
kaynak kullanıcı

oy
1

Bir AI sınıfı yıllar önce bir proje olarak böyle bir şey yaptı. sınıf LISP'i kullanılan, bu yüzden yaptığı ilk şey bir S-İfade infix gösterimde gelen ifadeyi dönüştürmek oldu.

Sonra yinelemeli "ağaç" kateden ve her düğüm noktasında bir dizi kural uygulayarak meselesiydi. Bu düğüm olan işlenen her iki sabit olan bir işlem içerir, örneğin, eğer, hemen bir işlemi ve sonuç olan düğümün değiştirin.

temel işlevi yerine ulaştıktan sonra, bu sisteme yeni yeni basitleştirme kuralları ekleyerek meselesiydi.

Son olarak, S-İfade ekran için infix gösterimde geri dönüştürüldü.

Cevap 27/11/2008 saat 15:02
kaynak kullanıcı

oy
1

Sadece bir örnek vermek için buraya Verdiğin ifadeyi basitleştirmek verecek bir fonksiyon. Fikir basitleştirmek sağlar her tanım eşittir işareti maçların sol taraftaki kalıplardan biriyle kadar yukarıdan aşağıya doğru çalıştı olmasıdır. Geçen tanımının amacı ayrıca herhangi basitleştirmek için bilinen bir yol yoksa ya yinelenen patlak etmektir.

simplify :: Expr -> Expr
simplify (Plus l         (Const 0)) = simplify l
simplify (Plus (Const 0) r        ) = simplify r
simplify x                          = x
Cevap 21/08/2009 saat 22:19
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more