Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / Orcas / NetFXw7 / ndp / fx / src / DataEntity / System / Data / Common / Utils / Boolean / Simplifier.cs / 1 / Simplifier.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace System.Data.Common.Utils.Boolean
{
// Simplifier visitor for Boolean expressions. Performs the following
// simplifications bottom-up:
// - Eliminate True and False (A Or False iff. A, A And True iff. A)
// - Resolve tautology (A Or !A iff. True, True Or A iff. True) and
// contradiction (A And !A iff. False, False And A iff. False)
// - Flatten nested negations (!!A iff. A)
// - Evaluate bound literals (!True iff. False, etc.)
// - Flatten unary/empty And/Or expressions
internal class Simplifier : BasicVisitor
{
internal static readonly Simplifier Instance = new Simplifier();
protected Simplifier()
{
}
internal override BoolExpr VisitNot(NotExpr expression)
{
BoolExpr child = expression.Child.Accept(this);
switch (child.ExprType)
{
case ExprType.Not:
return ((NotExpr)child).Child;
case ExprType.True: return FalseExpr.Value;
case ExprType.False: return TrueExpr.Value;
default: return base.VisitNot(expression);
}
}
internal override BoolExpr VisitAnd(AndExpr expression)
{
return SimplifyTree(expression);
}
internal override BoolExpr VisitOr(OrExpr expression)
{
return SimplifyTree(expression);
}
private BoolExpr SimplifyTree(TreeExpr tree)
{
bool isAnd = ExprType.And == tree.ExprType;
Debug.Assert(isAnd || ExprType.Or == tree.ExprType);
// Get list of simplified children, flattening nested And/Or expressions
List> simplifiedChildren = new List>(tree.Children.Count);
foreach (BoolExpr child in tree.Children)
{
BoolExpr simplifiedChild = child.Accept(this);
// And(And(A, B), C) iff. And(A, B, C)
// Or(Or(A, B), C) iff. Or(A, B, C)
if (simplifiedChild.ExprType == tree.ExprType)
{
simplifiedChildren.AddRange(((TreeExpr)simplifiedChild).Children);
}
else
{
simplifiedChildren.Add(simplifiedChild);
}
}
// Track negated children separately to identify tautologies and contradictions
Dictionary, bool> negatedChildren = new Dictionary, bool>(tree.Children.Count);
List> otherChildren = new List>(tree.Children.Count);
foreach (BoolExpr simplifiedChild in simplifiedChildren)
{
switch (simplifiedChild.ExprType)
{
case ExprType.Not:
negatedChildren[((NotExpr)simplifiedChild).Child] = true;
break;
case ExprType.False:
// False And A --> False
if (isAnd) { return FalseExpr.Value; }
// False || A --> A (omit False from child collections)
break;
case ExprType.True:
// True Or A --> True
if (!isAnd) { return TrueExpr.Value; }
// True And A --> A (omit True from child collections)
break;
default:
otherChildren.Add(simplifiedChild);
break;
}
}
List> children = new List>();
foreach (BoolExpr child in otherChildren)
{
if (negatedChildren.ContainsKey(child))
{
// A && !A --> False, A || !A --> True
if (isAnd) { return FalseExpr.Value; }
else { return TrueExpr.Value; }
}
children.Add(child);
}
foreach (BoolExpr child in negatedChildren.Keys)
{
children.Add(child.MakeNegated());
}
if (0 == children.Count)
{
// And() iff. True
if (isAnd) { return TrueExpr.Value; }
// Or() iff. False
else { return FalseExpr.Value; }
}
else if (1 == children.Count)
{
// Or(A) iff. A, And(A) iff. A
return children[0];
}
else
{
// Construct simplified And/Or expression
TreeExpr result;
if (isAnd) { result = new AndExpr(children); }
else { result = new OrExpr(children); }
return result;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// @owner [....]
// @backupOwner [....]
//---------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace System.Data.Common.Utils.Boolean
{
// Simplifier visitor for Boolean expressions. Performs the following
// simplifications bottom-up:
// - Eliminate True and False (A Or False iff. A, A And True iff. A)
// - Resolve tautology (A Or !A iff. True, True Or A iff. True) and
// contradiction (A And !A iff. False, False And A iff. False)
// - Flatten nested negations (!!A iff. A)
// - Evaluate bound literals (!True iff. False, etc.)
// - Flatten unary/empty And/Or expressions
internal class Simplifier : BasicVisitor
{
internal static readonly Simplifier Instance = new Simplifier();
protected Simplifier()
{
}
internal override BoolExpr VisitNot(NotExpr expression)
{
BoolExpr child = expression.Child.Accept(this);
switch (child.ExprType)
{
case ExprType.Not:
return ((NotExpr)child).Child;
case ExprType.True: return FalseExpr.Value;
case ExprType.False: return TrueExpr.Value;
default: return base.VisitNot(expression);
}
}
internal override BoolExpr VisitAnd(AndExpr expression)
{
return SimplifyTree(expression);
}
internal override BoolExpr VisitOr(OrExpr expression)
{
return SimplifyTree(expression);
}
private BoolExpr SimplifyTree(TreeExpr tree)
{
bool isAnd = ExprType.And == tree.ExprType;
Debug.Assert(isAnd || ExprType.Or == tree.ExprType);
// Get list of simplified children, flattening nested And/Or expressions
List> simplifiedChildren = new List>(tree.Children.Count);
foreach (BoolExpr child in tree.Children)
{
BoolExpr simplifiedChild = child.Accept(this);
// And(And(A, B), C) iff. And(A, B, C)
// Or(Or(A, B), C) iff. Or(A, B, C)
if (simplifiedChild.ExprType == tree.ExprType)
{
simplifiedChildren.AddRange(((TreeExpr)simplifiedChild).Children);
}
else
{
simplifiedChildren.Add(simplifiedChild);
}
}
// Track negated children separately to identify tautologies and contradictions
Dictionary, bool> negatedChildren = new Dictionary, bool>(tree.Children.Count);
List> otherChildren = new List>(tree.Children.Count);
foreach (BoolExpr simplifiedChild in simplifiedChildren)
{
switch (simplifiedChild.ExprType)
{
case ExprType.Not:
negatedChildren[((NotExpr)simplifiedChild).Child] = true;
break;
case ExprType.False:
// False And A --> False
if (isAnd) { return FalseExpr.Value; }
// False || A --> A (omit False from child collections)
break;
case ExprType.True:
// True Or A --> True
if (!isAnd) { return TrueExpr.Value; }
// True And A --> A (omit True from child collections)
break;
default:
otherChildren.Add(simplifiedChild);
break;
}
}
List> children = new List>();
foreach (BoolExpr child in otherChildren)
{
if (negatedChildren.ContainsKey(child))
{
// A && !A --> False, A || !A --> True
if (isAnd) { return FalseExpr.Value; }
else { return TrueExpr.Value; }
}
children.Add(child);
}
foreach (BoolExpr child in negatedChildren.Keys)
{
children.Add(child.MakeNegated());
}
if (0 == children.Count)
{
// And() iff. True
if (isAnd) { return TrueExpr.Value; }
// Or() iff. False
else { return FalseExpr.Value; }
}
else if (1 == children.Count)
{
// Or(A) iff. A, And(A) iff. A
return children[0];
}
else
{
// Construct simplified And/Or expression
TreeExpr result;
if (isAnd) { result = new AndExpr(children); }
else { result = new OrExpr(children); }
return result;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- CompressStream.cs
- TransformerConfigurationWizardBase.cs
- EditorZone.cs
- MaskedTextProvider.cs
- _CookieModule.cs
- GridProviderWrapper.cs
- GraphicsPath.cs
- InfoCardSymmetricAlgorithm.cs
- TextBox.cs
- ResourcePool.cs
- TranslateTransform.cs
- TextEffect.cs
- ImageListUtils.cs
- UnionExpr.cs
- exports.cs
- BulletedList.cs
- FastEncoder.cs
- LocationSectionRecord.cs
- VariableExpressionConverter.cs
- HtmlElementEventArgs.cs
- StickyNoteContentControl.cs
- CodeNamespaceCollection.cs
- COM2ExtendedUITypeEditor.cs
- FixedDocumentPaginator.cs
- TextSelection.cs
- TextSearch.cs
- DataContractSerializerSection.cs
- QualifiedCellIdBoolean.cs
- WebConfigurationManager.cs
- SelectedDatesCollection.cs
- EntityViewGenerator.cs
- HttpValueCollection.cs
- SimpleTextLine.cs
- CssTextWriter.cs
- PrePrepareMethodAttribute.cs
- RowParagraph.cs
- BoundPropertyEntry.cs
- BindingCompleteEventArgs.cs
- ValidationEventArgs.cs
- SqlFactory.cs
- RtfControls.cs
- MessageBox.cs
- CodeTypeParameterCollection.cs
- XamlTreeBuilder.cs
- XPathNodeIterator.cs
- DesignerMetadata.cs
- mil_sdk_version.cs
- DragStartedEventArgs.cs
- MetafileHeader.cs
- LinkButton.cs
- CodeTypeOfExpression.cs
- TextDecorationCollection.cs
- HttpEncoderUtility.cs
- ParameterModifier.cs
- HtmlElementEventArgs.cs
- PrinterSettings.cs
- PerfCounterSection.cs
- SelectQueryOperator.cs
- DesignerDataRelationship.cs
- DataServicePagingProviderWrapper.cs
- PublisherIdentityPermission.cs
- CounterSample.cs
- SQLUtility.cs
- AgileSafeNativeMemoryHandle.cs
- ParallelTimeline.cs
- PriorityBinding.cs
- AddInAttribute.cs
- ListMarkerSourceInfo.cs
- DataBoundControlDesigner.cs
- SecurityDocument.cs
- NoResizeSelectionBorderGlyph.cs
- hresults.cs
- ToolStripRenderEventArgs.cs
- HttpPostedFile.cs
- EntityContainerRelationshipSet.cs
- _BasicClient.cs
- SafeBitVector32.cs
- SoapDocumentServiceAttribute.cs
- SoapElementAttribute.cs
- FillErrorEventArgs.cs
- BinarySecretSecurityToken.cs
- TextEditorLists.cs
- InstanceContextMode.cs
- PageParserFilter.cs
- MultiBinding.cs
- PenLineJoinValidation.cs
- UnsignedPublishLicense.cs
- WriteFileContext.cs
- CompilerCollection.cs
- CheckBoxList.cs
- WorkerRequest.cs
- WebPartDisplayMode.cs
- AllMembershipCondition.cs
- EntityClientCacheKey.cs
- SystemPens.cs
- StartUpEventArgs.cs
- PtsHost.cs
- TypeSystem.cs
- InvalidWorkflowException.cs
- AssociativeAggregationOperator.cs