Full Code of aimacode/aima-csharp for AI

master a8a4f15c4789 cached
221 files
584.1 KB
157.6k tokens
1704 symbols
1 requests
Download .txt
Showing preview only (644K chars total). Download the full file or copy to clipboard to get everything.
Repository: aimacode/aima-csharp
Branch: master
Commit: a8a4f15c4789
Files: 221
Total size: 584.1 KB

Directory structure:
gitextract_gi623cc4/

├── .gitattributes
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── aima-csharp/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── agent/
│   │   ├── Action.cs
│   │   ├── Agent.cs
│   │   ├── AgentProgram.cs
│   │   ├── Environment.cs
│   │   ├── EnvironmentObject.cs
│   │   ├── EnvironmentState.cs
│   │   ├── EnvironmentView.cs
│   │   ├── EnvironmentViewNotifier.cs
│   │   ├── Model.cs
│   │   ├── Percept.cs
│   │   ├── State.cs
│   │   └── impl/
│   │       ├── AbstractAgent.cs
│   │       ├── AbstractEnvironment.cs
│   │       ├── DynamicAction.cs
│   │       ├── DynamicEnvironmentState.cs
│   │       ├── DynamicPercept.cs
│   │       ├── DynamicState.cs
│   │       ├── NoOpAction.cs
│   │       ├── ObjectWithDynamicAttributes.cs
│   │       ├── SimpleEnvironmentView.cs
│   │       └── aprog/
│   │           ├── ModelBasedReflexAgentProgram.cs
│   │           ├── SimpleReflexAgentProgram.cs
│   │           ├── TableDrivenAgentProgram.cs
│   │           └── simplerule/
│   │               ├── ANDCondition.cs
│   │               ├── Condition.cs
│   │               ├── EQUALCondition.cs
│   │               ├── NOTCondition.cs
│   │               ├── ORCondition.cs
│   │               └── Rule.cs
│   ├── aima-csharp.csproj
│   ├── environment/
│   │   ├── cellworld/
│   │   │   ├── Cell.cs
│   │   │   ├── CellWorld.cs
│   │   │   ├── CellWorldAction.cs
│   │   │   └── CellWorldFactory.cs
│   │   ├── eightpuzzle/
│   │   │   ├── BidirectionalEightPuzzleProblem.cs
│   │   │   ├── EightPuzzleBoard.cs
│   │   │   ├── EightPuzzleFunctionFactory.cs
│   │   │   ├── EightPuzzleGoalTest.cs
│   │   │   ├── ManhattanHeuristicFunction.cs
│   │   │   └── MisplacedTilleHeuristicFunction.cs
│   │   ├── map/
│   │   │   ├── AdaptableHeuristicFunction.cs
│   │   │   ├── BidirectionalMapProblem.cs
│   │   │   ├── DynAttributeNames.cs
│   │   │   ├── ExtendableMap.cs
│   │   │   ├── Map.cs
│   │   │   ├── MapAgent.cs
│   │   │   ├── MapEnvironment.cs
│   │   │   ├── MapEnvironmentState.cs
│   │   │   ├── MapFunctionFactory.cs
│   │   │   ├── MapStepCostFunction.cs
│   │   │   ├── MoveToAction.cs
│   │   │   ├── Scenario.cs
│   │   │   ├── SimplifiedRoadMapOfAustralia.cs
│   │   │   ├── SimplifiedRoadMapOfPartOfRomania.cs
│   │   │   └── StraightLineDistanceHeuristicFunction.cs
│   │   └── wumpusworld/
│   │       ├── AgentPercept.cs
│   │       ├── AgentPosition.cs
│   │       ├── ManhattanHeuristicFunction.cs
│   │       └── Room.cs
│   ├── logic/
│   │   ├── common/
│   │   │   ├── Lexer.cs
│   │   │   ├── LexerException.cs
│   │   │   ├── LogicTokenTypes.cs
│   │   │   ├── Parser.cs
│   │   │   ├── ParserException.cs
│   │   │   ├── ParserTreeNode.cs
│   │   │   └── Token.cs
│   │   ├── fol/
│   │   │   ├── CNFConverter.cs
│   │   │   ├── Connectors.cs
│   │   │   ├── PredicateCollector.cs
│   │   │   ├── Quantifiers.cs
│   │   │   ├── StandardizeApart.cs
│   │   │   ├── StandardizeApartInPlace.cs
│   │   │   ├── StandardizeApartIndexical.cs
│   │   │   ├── StandardizeApartIndexicalFactory.cs
│   │   │   ├── StandardizeApartResult.cs
│   │   │   ├── SubstVisitor.cs
│   │   │   ├── SubsumptionElimination.cs
│   │   │   ├── Unifier.cs
│   │   │   ├── VariableCollector.cs
│   │   │   ├── domain/
│   │   │   │   ├── DomainFactory.cs
│   │   │   │   ├── FOLDomain.cs
│   │   │   │   ├── FOLDomainAnswerLiteralAddedEvent.cs
│   │   │   │   ├── FOLDomainEvent.cs
│   │   │   │   ├── FOLDomainListener.cs
│   │   │   │   ├── FOLDomainSkolemConstantAddedEvent.cs
│   │   │   │   └── FOLDomainSkolemFunctionAddedEvent.cs
│   │   │   ├── inference/
│   │   │   │   ├── AbstractModulation.cs
│   │   │   │   ├── Demodulation.cs
│   │   │   │   ├── FOLBCAsk.cs
│   │   │   │   ├── FOLFCAsk.cs
│   │   │   │   ├── FOLModelElimination.cs
│   │   │   │   ├── FOLOTTERLikeTheoremProver.cs
│   │   │   │   ├── FOLTFMResolution.cs
│   │   │   │   ├── InferenceProcedure.cs
│   │   │   │   ├── InferenceResult.cs
│   │   │   │   ├── InferenceResultPrinter.cs
│   │   │   │   ├── Paramodulation.cs
│   │   │   │   ├── otter/
│   │   │   │   │   ├── ClauseFilter.cs
│   │   │   │   │   ├── ClauseSimplifier.cs
│   │   │   │   │   ├── LightestClauseHeuristic.cs
│   │   │   │   │   └── defaultimpl/
│   │   │   │   │       ├── DefaultClauseFilter.cs
│   │   │   │   │       ├── DefaultClauseSimplifier.cs
│   │   │   │   │       └── DefaultLightestClauseHeuristic.cs
│   │   │   │   ├── proof/
│   │   │   │   │   ├── AbstractProofStep.cs
│   │   │   │   │   ├── Proof.cs
│   │   │   │   │   ├── ProofFinal.cs
│   │   │   │   │   ├── ProofPrinter.cs
│   │   │   │   │   ├── ProofStep.cs
│   │   │   │   │   ├── ProofStepBwChGoal.cs
│   │   │   │   │   ├── ProofStepChainCancellation.cs
│   │   │   │   │   ├── ProofStepChainContrapositive.cs
│   │   │   │   │   ├── ProofStepChainDropped.cs
│   │   │   │   │   ├── ProofStepChainFromClause.cs
│   │   │   │   │   ├── ProofStepChainReduction.cs
│   │   │   │   │   ├── ProofStepClauseBinaryResolvent.cs
│   │   │   │   │   ├── ProofStepClauseClausifySentence.cs
│   │   │   │   │   ├── ProofStepClauseDemodulation.cs
│   │   │   │   │   ├── ProofStepClauseFactor.cs
│   │   │   │   │   ├── ProofStepClauseParamodulation.cs
│   │   │   │   │   ├── ProofStepFoChAlreadyAFact.cs
│   │   │   │   │   ├── ProofStepFoChAssertFact.cs
│   │   │   │   │   ├── ProofStepGoal.cs
│   │   │   │   │   ├── ProofStepPremise.cs
│   │   │   │   │   └── ProofStepRenaming.cs
│   │   │   │   └── trace/
│   │   │   │       ├── FOLModelEliminationTracer.cs
│   │   │   │       └── FOLTFMResolutiontracer.cs
│   │   │   ├── kb/
│   │   │   │   ├── FOLKnowledgeBase.cs
│   │   │   │   ├── FOLKnowledgeBaseFactory.cs
│   │   │   │   └── data/
│   │   │   │       ├── CNF.cs
│   │   │   │       ├── Chain.cs
│   │   │   │       ├── Clause.cs
│   │   │   │       ├── Literal.cs
│   │   │   │       └── ReducedLiteral.cs
│   │   │   └── parsing/
│   │   │       ├── AbstractFOLVisitor.cs
│   │   │       ├── FOLLexer.cs
│   │   │       ├── FOLParser.cs
│   │   │       ├── FOLVisitor.cs
│   │   │       └── ast/
│   │   │           ├── AtomicSentence.cs
│   │   │           ├── ConnectedSentence.cs
│   │   │           ├── Constant.cs
│   │   │           ├── FOLNode.cs
│   │   │           ├── Function.cs
│   │   │           ├── NotSentence.cs
│   │   │           ├── Predicate.cs
│   │   │           ├── QuantifiedSentence.cs
│   │   │           ├── Sentence.cs
│   │   │           ├── Term.cs
│   │   │           ├── TermEquality.cs
│   │   │           └── Variable.cs
│   │   └── propositional/
│   │       ├── agent/
│   │       │   └── KBAgent.cs
│   │       ├── kb/
│   │       │   └── KnowledgeBase.cs
│   │       └── parsing/
│   │           ├── PLVisitor.cs
│   │           └── ast/
│   │               ├── AtomicSentence.cs
│   │               ├── ComplexSentence.cs
│   │               ├── Connective.cs
│   │               ├── PropositionSymbol.cs
│   │               └── Sentence.cs
│   ├── search/
│   │   ├── Local/
│   │   │   ├── FitnessFunction.cs
│   │   │   ├── Individual.cs
│   │   │   └── Scheduler.cs
│   │   ├── framework/
│   │   │   ├── CutOffIndicatorAction.cs
│   │   │   ├── EvaluationFunction.cs
│   │   │   ├── HeuristicFunction.cs
│   │   │   ├── Metrics.cs
│   │   │   ├── Node.cs
│   │   │   ├── NodeExpander.cs
│   │   │   ├── PathCostFunction.cs
│   │   │   ├── PerceptToStateFunction.cs
│   │   │   ├── Search.cs
│   │   │   ├── SearchAgent.cs
│   │   │   ├── SearchForActions.cs
│   │   │   ├── SearchUtils.cs
│   │   │   ├── SimpleProblemSolvingAgent.cs
│   │   │   ├── SolutionChecker.cs
│   │   │   ├── problem/
│   │   │   │   ├── ActionsFunction.cs
│   │   │   │   ├── BidirectionalProblem.cs
│   │   │   │   ├── DefaultGoalTest.cs
│   │   │   │   ├── DefaultStepCostFunction.cs
│   │   │   │   ├── GoalTest.cs
│   │   │   │   ├── Problem.cs
│   │   │   │   ├── ResultFunction.cs
│   │   │   │   └── StepCostFunction.cs
│   │   │   └── qsearch/
│   │   │       ├── GraphSearch.cs
│   │   │       ├── GraphSearchBFS.cs
│   │   │       ├── QueueSearch.cs
│   │   │       └── TreeSearch.cs
│   │   └── online/
│   │       ├── LRTAStarAgent.cs
│   │       ├── OnlineDFSAgent.cs
│   │       └── OnlineSearchProblem.cs
│   └── util/
│       ├── ArrayIterator.cs
│       ├── CSharpRandomizer.cs
│       ├── DisjointSets.cs
│       ├── FrequencyCounter.cs
│       ├── Interval.cs
│       ├── LUDecomposition.cs
│       ├── LabeledGraph.cs
│       ├── LinkedHashSet.cs
│       ├── Matrix.cs
│       ├── MixedRadixNumber.cs
│       ├── MockRandomizer.cs
│       ├── Pair.cs
│       ├── Point2D.cs
│       ├── Randomizer.cs
│       ├── SetOps.cs
│       ├── Table.cs
│       ├── Triplet.cs
│       ├── TwoKeyHashMap.cs
│       ├── Util.cs
│       ├── Vector.cs
│       └── XYLocation.cs
├── aima-csharp-unity/
│   ├── .gitignore
│   └── README.md
└── aima-csharp.sln

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto

###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs     diff=csharp

###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following 
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln       merge=binary
#*.csproj    merge=binary
#*.vbproj    merge=binary
#*.vcxproj   merge=binary
#*.vcproj    merge=binary
#*.dbproj    merge=binary
#*.fsproj    merge=binary
#*.lsproj    merge=binary
#*.wixproj   merge=binary
#*.modelproj merge=binary
#*.sqlproj   merge=binary
#*.wwaproj   merge=binary

###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg   binary
#*.png   binary
#*.gif   binary

###############################################################################
# diff behavior for common document formats
# 
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the 
# entries below.
###############################################################################
#*.doc   diff=astextplain
#*.DOC   diff=astextplain
#*.docx  diff=astextplain
#*.DOCX  diff=astextplain
#*.dot   diff=astextplain
#*.DOT   diff=astextplain
#*.pdf   diff=astextplain
#*.PDF   diff=astextplain
#*.rtf   diff=astextplain
#*.RTF   diff=astextplain


================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
[Xx]64/
[Xx]86/
[Bb]uild/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/

# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*

# NUNIT
*.VisualState.xml
TestResult.xml

# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c

# DNX
project.lock.json
artifacts/

*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc

# Chutzpah Test files
_Chutzpah*

# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db

# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap

# TFS 2012 Local Workspace
$tf/

# Guidance Automation Toolkit
*.gpState

# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user

# JustCode is a .NET coding add-in
.JustCode

# TeamCity is a build add-in
_TeamCity*

# DotCover is a Code Coverage Tool
*.dotCover

# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*

# MightyMoose
*.mm.*
AutoTest.Net/

# Web workbench (sass)
.sass-cache/

# Installshield output folder
[Ee]xpress/

# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html

# Click-Once directory
publish/

# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml

# TODO: Un-comment the next line if you do not want to checkin 
# your web deploy settings because they may include unencrypted
# passwords
#*.pubxml
*.publishproj

# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets

# Microsoft Azure Build Output
csx/
*.build.csdef

# Microsoft Azure Emulator
ecf/
rcf/

# Microsoft Azure ApplicationInsights config file
ApplicationInsights.config

# Windows Store app package directory
AppPackages/
BundleArtifacts/

# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/

# Others
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs

# RIA/Silverlight projects
Generated_Code/

# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm

# SQL Server files
*.mdf
*.ldf

# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings

# Microsoft Fakes
FakesAssemblies/

# GhostDoc plugin setting file
*.GhostDoc.xml

# Node.js Tools for Visual Studio
.ntvs_analysis.dat

# Visual Studio 6 build log
*.plg

# Visual Studio 6 workspace options file
*.opt

# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions

# LightSwitch generated files
GeneratedArtifacts/
ModelManifest.xml

# Paket dependency manager
.paket/paket.exe

# FAKE - F# Make
.fake/

================================================
FILE: CONTRIBUTING.md
================================================
How to Contribute to aima-csharp
==========================

Thanks for considering contributing to `aima-csharp`! Whether you are an aspiring [Google Summer of Code](https://summerofcode.withgoogle.com/organizations/5663121491361792/) student, or an independent contributor, here is a guide to how you can help:

## Read the Code and Start on an Issue

- First, read and understand the code to get a feel for the extent and the style.
- Look at the [issues](https://github.com/aimacode/aima-csharp/issues) and pick one to work on.
- One of the issues is that some algorithms are missing from the [list of algorithms](/README.md#index-of-implemented-algorithms).

## New and Improved Algorithms

- Implement functions that were in the third edition of the book but were not yet implemented in the code. Check the [list of pseudocode algorithms (pdf)](https://github.com/aimacode/pseudocode/blob/master/aima3e-algorithms.pdf) to see what's missing.
- As we finish chapters for the new fourth edition, we will share the new pseudocode in the [`aima-pseudocode`](https://github.com/aimacode/aima-pseudocode) repository, and describe what changes are necessary.
We hope to have a `algorithm-name.md` file for each algorithm, eventually; it would be great if contributors could add some for the existing algorithms.


Contributing a Patch
====================

1. Submit an issue describing your proposed change to the repo in question (or work on an existing issue).
1. The repo owner will respond to your issue promptly.
1. Fork the desired repo, develop and test your code changes.
1. Submit a pull request.

Reporting Issues
================

- Under which versions of Visual Studio does this happen?

- Is anybody working on this?

# Choice of Programming Languages

Are we right to concentrate on Java and Python versions of the code? I think so; both languages are popular; Java is
fast enough for our purposes, and has reasonable type declarations (but can be verbose); Python is popular and has a very direct mapping to the pseudocode in the book (but lacks type declarations and can be slow). The [TIOBE Index](http://www.tiobe.com/tiobe_index) says the top seven most popular languages, in order, are:

        Java, C, C++, C#, Python, PHP, Javascript

So it might be reasonable to also support C++/C# at some point in the future. It might also be reasonable to support a language that combines the terse readability of Python with the type safety and speed of Java; perhaps Go or Julia. I see no reason to support PHP. Javascript is the language of the browser; it would be nice to have code that runs in the browser without need for any downloads; this would be in Javascript or a variant such as Typescript.

There is also a `aima-lisp` project; in 1995 when we wrote the first edition of the book, Lisp was the right choice, but today it is less popular (currently #31 on the TIOBE index).


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2018 aimacode

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# ![](https://github.com/aimacode/aima-java/blob/gh-pages/aima3e/images/aima3e.jpg)aima-csharp
C# implementation of algorithms from [Russell](http://www.cs.berkeley.edu/~russell/) And [Norvig's](http://www.norvig.com/) [Artificial Intelligence - A Modern Approach 3rd Edition](http://aima.cs.berkeley.edu/). You can use this in conjunction with a course on AI, or for study on your own.

## Index of Implemented Algorithms

Here is a table of algorithms, the figure, name of the code in the book, and the file where they are implemented in the code. This chart was made for the third edition of the book and needs to be updated for the upcoming fourth edition. Empty implementations are a good place for contributors to look for an issue. The [aima-pseudocode](https://github.com/aimacode/aima-pseudocode) project describes all the algorithms from the book.

|Fig|Page|Name (in book)|Code|
| -------- |:--------:| :-----| :----- |
|2|34|Environment|[Environment](/aima-csharp/agent/Environment.cs)|
|2.1|35|Agent|[Agent](/aima-csharp/agent/Agent.cs)|
|2.3|36|Table-Driven-Vacuum-Agent||
|2.7|47|Table-Driven-Agent|[TableDrivenAgentProgram](/aima-csharp/agent/impl/aprog/TableDrivenAgentProgram.cs)|
|2.8|48|Reflex-Vacuum-Agent|[?ReflexVacuumAgent?](/aima-csharp/agent/impl/aprog/ModelBasedReflexAgentProgram.cs)|
|2.10|49|Simple-Reflex-Agent|[SimpleReflexAgentProgram](/aima-csharp/agent/impl/aprog/SimpleReflexAgentProgram.cs)|
|2.12|51|Model-Based-Reflex-Agent|[ModelBasedReflexAgentProgram](/aima-csharp/agent/impl/aprog/ModelBasedReflexAgentProgram.cs)|
|3|66|Problem|
|3.1|67|Simple-Problem-Solving-Agent|[SimpleProblemSolvingAgent](/aima-csharp/search/framework/SimpleProblemSolvingAgent.cs)|
|3.2|68|Romania|[SimplifiedRoadMapOfPartOfRomania](/aima-csharp/environment/map/SimplifiedRoadMapOfPartOfRomania.cs)|
|3.7|77|Tree-Search|[TreeSearch](/aima-csharp/search/framework/qsearch/TreeSearch.cs)|
|3.7|77|Graph-Search|[GraphSearch](/aima-csharp/search/framework/qsearch/GraphSearch.cs)|
|3.10|79|Node|[Node](/aima-csharp/search/framework/Node.cs)|
|3.11|82|Breadth-First-Search|
|3.14|84|Uniform-Cost-Search|
|3|85|Depth-first Search|
|3.17|88|Depth-Limited-Search|
|3.18|89|Iterative-Deepening-Search|
|3|90|Bidirectional search|
|3|92|Best-First search|
|3|92|Greedy best-First search|
|3|93|A\* Search|
|3.26|99|Recursive-Best-First-Search |
|4.2|122|Hill-Climbing|
|4.5|126|Simulated-Annealing|
|4.8|129|Genetic-Algorithm|
|4.11|136|And-Or-Graph-Search|
|4|147|Online search problem|[OnlineSearchProblem](/aima-csharp/search/online/OnlineSearchProblem.cs)|
|4.21|150|Online-DFS-Agent|[OnlineDFSAgent](/aima-csharp/search/online/OnlineDFSAgent.cs)|
|4.24|152|LRTA\*-Agent|[LRTAStarAgent](/aima-csharp/search/online/LRTAStarAgent.cs)|
|5.3|166|Minimax-Decision|
|5.7|170|Alpha-Beta-Search|
|6|202|CSP|
|6.1|204|Map CSP|
|6.3|209|AC-3|
|6.5|215|Backtracking-Search|
|6.8|221|Min-Conflicts|
|6.11|224|Tree-CSP-Solver|
|7|235|Knowledge Base|
|7.1|236|KB-Agent|[KBAgent](/aima-csharp/logic/propositional/agent/KBAgent.cs)|
|7.7|244|Propositional-Logic-Sentence|[Sentence](/aima-csharp/logic/propositional/parsing/ast/Sentence.cs)|
|7.10|248|TT-Entails|
|7|253|Convert-to-CNF|
|7.12|255|PL-Resolution|
|7.15|258|PL-FC-Entails?|
|7.17|261|DPLL-Satisfiable?|
|7.18|263|WalkSAT|
|7.20|270|Hybrid-Wumpus-Agent|
|7.22|272|SATPlan|
|9|323|Subst|
|9.1|328|Unify|[Unifier](/aima-csharp/logic/fol/Unifier.cs)|
|9.3|332|FOL-FC-Ask|[FOLFCAsk](/aima-csharp/logic/fol/inference/FOLFCAsk.cs)|
|9.3|332|FOL-BC-Ask|[FOLBCAsk](/aima-csharp/logic/fol/inference/FOLBCAsk.cs)|
|9|345|CNF|[CNFConverter](/aima-csharp/logic/fol/CNFConverter.cs)|
|9|347|Resolution|[FOLTFMResolution](/aima-csharp/logic/fol/inference/FOLTFMResolution.cs)|
|9|354|Demodulation||
|9|354|Paramodulation|[Paramodulation](/aima-csharp/logic/fol/inference/Paramodulation.cs)|
|9|345|Subsumption|[SubsumptionElimination](/aima-csharp/logic/fol/SubsumptionElimination.cs)|
|10.9|383|Graphplan|---|
|11.5|409|Hierarchical-Search|---|
|11.8|414|Angelic-Search|---|
|13.1|484|DT-Agent|---|
|13|484|Probability-Model|
|13|487|Probability-Distribution|
|13|490|Full-Joint-Distribution|
|14|510|Bayesian Network|
|14.9|525|Enumeration-Ask|
|14.11|528|Elimination-Ask|
|14.13|531|Prior-Sample|
|14.14|533|Rejection-Sampling|
|14.15|534|Likelihood-Weighting|
|14.16|537|GIBBS-Ask|
|15.4|576|Forward-Backward|
|15|578|Hidden Markov Model|
|15.6|580|Fixed-Lag-Smoothing|
|15|590|Dynamic Bayesian Network|
|15.17|598|Particle-Filtering|
|16.9|632|Information-Gathering-Agent|---|
|17|647|Markov Decision Process|
|17.4|653|Value-Iteration|
|17.7|657|Policy-Iteration|
|17.9|663|POMDP-Value-Iteration|---|
|18.5|702|Decision-Tree-Learning|
|18.8|710|Cross-Validation-Wrapper|---|
|18.11|717|Decision-List-Learning|
|18.24|734|Back-Prop-Learning|
|18.34|751|AdaBoost|
|19.2|771|Current-Best-Learning|---|
|19.3|773|Version-Space-Learning|---|
|19.8|786|Minimal-Consistent-Det|---|
|19.12|793|FOIL|---|
|21.2|834|Passive-ADP-Agent|
|21.4|837|Passive-TD-Agent|
|21.8|844|Q-Learning-Agent|
|22.1|871|HITS|
|23.5|894|CYK-Parse|
|25.9|982|Monte-Carlo-Localization|

# Index of data structures

Here is a table of the implemented data structures, the figure, name of the implementation in the repository, and the file where they are implemented.

| **Figure** | **Name (in repository)** | **File** |
|:-----------|:-------------------------|:---------|
| 3.2    | romania_map              | |
| 4.9    | vacumm_world             | |
| 4.23   | one_dim_state_space      | |
| 6.1    | australia_map            | |
| 7.13   | wumpus_world_inference   | |
| 7.16   | horn_clauses_KB          | |
| 17.1   | sequential_decision_environment | |
| 18.2   | waiting_decision_tree    | |


================================================
FILE: aima-csharp/App.config
================================================
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>

================================================
FILE: aima-csharp/Program.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace aima_csharp
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}


================================================
FILE: aima-csharp/Properties/AssemblyInfo.cs
================================================
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// General Information about an assembly is controlled through the following 
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("aima-csharp")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("aima-csharp")]
[assembly: AssemblyCopyright("Copyright ©  2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// Setting ComVisible to false makes the types in this assembly not visible 
// to COM components.  If you need to access a type in this assembly from 
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("125f53d5-1ccf-4daf-82fe-4324686cf417")]

// Version information for an assembly consists of the following four values:
//
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
//
// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]


================================================
FILE: aima-csharp/agent/Action.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * Describes an Action that can or has been taken by an Agent via one of its Actuators. 
     *
     * @author Ciaran O'Reilly
     */
     public interface Action
     {
         /**
	  * Indicates whether or not this Action is a 'No Operation'.<br>
	  * Note: AIMA3e - NoOp, or no operation, is the name of an assembly language
	  * instruction that does nothing.
	  * 
	  * @return true if this is a NoOp Action.
	  */
         bool isNoOp();
     }
}

================================================
FILE: aima-csharp/agent/Agent.cs
================================================
using System;
using System.Collections;

namespace aima.core.agent
{
    /**
    * Artificial Intelligence A Modern Approach (3rd Edition): Figure 2.1, page 35.<br>
    * 
    * Figure 2.1 Agents interact with environments through sensors and actuators.
    * 
    * @author Ravi Mohan
    * @author Ciaran O'Reilly
    */
    public interface Agent : EnvironmentObject
    {
        /**
	 * Call the Agent's program, which maps any given percept sequences to an
	 * action.
	 * 
	 * @param percept
	 *            The current percept of a sequence perceived by the Agent.
	 * @return the Action to be taken in response to the currently perceived
	 *         percept.
	 */
        Action execute(Percept percept);

        /**
	 * Life-cycle indicator as to the liveness of an Agent.
	 * 
	 * @return true if the Agent is to be considered alive, false otherwise.
	 */
        bool isAlive();

        /**
	 * Set the current liveness of the Agent.
	 * 
	 * @param alive
	 *            set to true if the Agent is to be considered alive, false
	 *            otherwise.
	 */
        void setAlive(bool alive);
    }
}

================================================
FILE: aima-csharp/agent/AgentProgram.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
    * Artificial Intelligence A Modern Approach (3rd Edition): pg 35.<br>
    * An agent's behavior is described by the 'agent function' that maps any given
    * percept sequence to an action. Internally, the agent function for an
    * artificial agent will be implemented by an agent program.
    * 
    * @author Ravi Mohan
    * @author Ciaran O'Reilly
    */
    public interface AgentProgram
    {
        /**
	 * The Agent's program, which maps any given percept sequences to an action.
	 * 
	 * @param percept
	 *            The current percept of a sequence perceived by the Agent.
	 * @return the Action to be taken in response to the currently perceived
	 *         percept.
	 */
        Action execute(Percept percept);
    }
}

================================================
FILE: aima-csharp/agent/Environment.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * An abstract description of possible discrete Environments in which Agent(s)
     * can perceive and act.
     * 
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
    public interface Environment
    {
        /**
	 * Returns the Agents belonging to this Environment.
	 * 
	 * @return The Agents belonging to this Environment.
	 */
        List<Agent> getAgents();
        
        /**
         * Add an agent to the Environment.
         * 
         * @param agent
         *            the agent to be added.
         */
        void addAgent(Agent agent);
         
        /**
         * Remove an agent from the environment.
         * 
         * @param agent
         *            the agent to be removed.
         */
        void removeAgent(Agent agent);
         
        /**
	 * Returns the EnvironmentObjects that exist in this Environment.
	 * 
	 * @return the EnvironmentObjects that exist in this Environment.
	 */
        List<EnvironmentObject> getEnvironmentObjects();

        /**
	 * Add an EnvironmentObject to the Environment.
	 * 
	 * @param eo
	 *            the EnvironmentObject to be added.
	 */
        void addEnvironmentObject(EnvironmentObject eo);

        /**
         * Remove an EnvironmentObject from the Environment.
         * 
         * @param eo
         *            the EnvironmentObject to be removed.
         */
        void removeEnvironmentObject(EnvironmentObject eo);

        /**
         * Move the Environment one time step forward.
         */
        void step();

        /**
         * Move the Environment n time steps forward.
         * 
         * @param n
         *            the number of time steps to move the Environment forward.
         */
        void step(int n);

        /**
         * Step through time steps until the Environment has no more tasks.
         */
        void stepUntilDone();

        /**
	 * Returns <code>true</code> if the Environment is finished with its current
	 * task(s).
	 * 
	 * @return <code>true</code> if the Environment is finished with its current
	 *         task(s).
	 */
        bool isDone();

        /**
         * Retrieve the performance measure associated with an Agent.
         * 
         * @param forAgent
         *            the Agent for which a performance measure is to be retrieved.
         * @return the performance measure associated with the Agent.
         */
        double getPerformanceMeasure(Agent forAgent);

        /**
         * Add a view on the Environment.
         * 
         * @param ev
         *            the EnvironmentView to be added.
         */
        void addEnvironmentView(EnvironmentView ev);

        /**
         * Remove a view on the Environment.
         * 
         * @param ev
         *            the EnvironmentView to be removed.
         */
        void removeEnvironmentView(EnvironmentView ev);

        /**
         * Notify all registered EnvironmentViews of a message.
         * 
         * @param msg
         *            the message to notify the registered EnvironmentViews with.
         */
        void notifyViews(String msg);
    }
}

================================================
FILE: aima-csharp/agent/EnvironmentObject.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * An interface used to indicate any object that can belong within an
     * Environment.
     * 
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
    public interface EnvironmentObject
    {

    }
}

================================================
FILE: aima-csharp/agent/EnvironmentState.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * An interface used to indicate a possible state of an Environment.
     * 
     * @author Ciaran O'Reilly
     */
    public interface EnvironmentState
    {

    }
}

================================================
FILE: aima-csharp/agent/EnvironmentView.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * Allows external applications/logic to view the interaction of Agent(s) with
     * an Environment.
     * 
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
     public interface EnvironmentView
    {
        /**
	 * A simple notification message from the Environment, from one of its
	 * objects.
	 *   
	 * @param msg
	 *            the message received.
	 */
        void notify(String msg);

        /**
	 * Indicates an Agent has been added to the environment and what it
	 * perceives initially.
	 * 
	 * @param agent
	 *            the Agent just added to the Environment.
	 * @param resultingState
	 *            the EnvironmentState that resulted from the Agent being added
	 *            to the Environment.
	 */
        void agentAdded(Agent agent, EnvironmentState resultingState);

        /**
	 * Indicates the Environment has changed as a result of an Agent's action.
	 * 
	 * @param agent
	 *            the Agent that performed the Action.
	 * @param action
	 *            the Action the Agent performed.
	 * @param resultingState
	 *            the EnvironmentState that resulted from the Agent's Action on
	 *            the Environment.
	 */
        void agentActed(Agent agent, Action action, EnvironmentState resultingState);
    }
}

================================================
FILE: aima-csharp/agent/EnvironmentViewNotifier.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
     public interface EnvironmentViewNotifier
    {
        /**
	 * A simple notification message, to be forwarded to an Environment's
	 * registered EnvironmentViews.
	 * 
	 * @param msg
	 *            the message to be forwarded to the EnvironmentViews.
	 */
        void notifyViews(String msg);
    }
}

================================================
FILE: aima-csharp/agent/Model.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): pg 50.<br>
     * 
     * This knowledge about "how the world works" - whether implemented in simple bool circuits
     * or in complete scientific theories - is called a model of the world. An Agent that uses such a
     * model is called a model-based agent.
     *
     * @author Ciaran O'Reilly
     */
     public interface Model
    {

    }
}

================================================
FILE: aima-csharp/agent/Percept.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{    
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): pg 34.<br>
     * We use the term percept to refer the agent's perceptual inputs at any given instant.
     *
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
    public interface Percept
    {

    }
}

================================================
FILE: aima-csharp/agent/State.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): pg 50.<br>
     * 
     * The most effective way to handle partial observability is for the agent to keep track of the
     * part of the world it can't see now. That is, the agent should maintain some sort of internal
     * state that depends on the percept history and thereby reflects at least some of the unobserved
     * aspects of the current state.
     *
     * @author Ciaran O'Reilly
     */
    public interface State
    {

    }
}

================================================
FILE: aima-csharp/agent/impl/AbstractAgent.cs
================================================
using System;
using aima.core.agent;

namespace aima.core.agent.impl
{
    /**
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
     public abstract class AbstractAgent : Agent
    {
        protected AgentProgram program;
        private bool alive = true;

        public AbstractAgent()
        {

        }

        /**
	 * Constructs an Agent with the specified AgentProgram.
	 * 
	 * @param aProgram
	 *            the Agent's program, which maps any given percept sequences to
	 *            an action.
	 */
        public AbstractAgent(AgentProgram aProgram)
        {
            program = aProgram;
        }

        //START-Agent
        public virtual Action execute(Percept p)
        {
            if(null != program)
            {
                return program.execute(p);
            }
            return NoOpAction.NO_OP;
        }

        public bool isAlive()
        {
            return alive;
        }

        public void setAlive(bool alive)
        {
            this.alive = alive;
        }

        //END-Agent
    }
}

================================================
FILE: aima-csharp/agent/impl/AbstractEnvironment.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;
using aima.core.util;

namespace aima.core.agent.impl
{
    /**
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
    public abstract class AbstractEnvironment : Environment, EnvironmentViewNotifier
    {
        // Note: Use LinkedHashSet's in order to ensure order is respected as
        // provide
        // access to these elements via List interface.
        protected LinkedHashSet<EnvironmentObject> envObjects = new LinkedHashSet<EnvironmentObject>();

        protected LinkedHashSet<Agent> agents = new LinkedHashSet<Agent>();

        protected LinkedHashSet<EnvironmentView> views = new LinkedHashSet<EnvironmentView>();

        protected Dictionary<Agent, Double> performanceMeasures = new Dictionary<Agent, Double>();
                
        // PRUBLIC METHODS
        
        // Methods to be implemented by subclasses.
        public abstract EnvironmentState getCurrentState();

        public abstract EnvironmentState executeAction(Agent agent, Action action);

        public abstract Percept getPerceptSeenBy(Agent anAgent);
        /**
         * Method for implementing dynamic environments in which not all changes
         * are directly caused by agent action execution. The default implementation
         * does nothing.
         */
        public void createExogenousChange() { }
                
        // START-Environment
        public List<Agent> getAgents()
        {
            // Return as a List but also ensures the caller cannot modify
            return new List<Agent>(agents);
        }

        public void addAgent(Agent a)
        {
            addEnvironmentObject(a);
        }

        public void removeAgent(Agent a)
        {
            removeEnvironmentObject(a);
        }

        public List<EnvironmentObject> getEnvironmentObjects()
        {
            // Return as a List but also ensures the caller cannot modify
            return new List<EnvironmentObject>(envObjects);
        }

        public void addEnvironmentObject(EnvironmentObject eo)
        {
            envObjects.Add(eo);
            if (eo is Agent)
            {
                Agent a = (Agent)eo;
                if (!agents.Contains(a))
                {
                    agents.Add(a);
                    this.updateEnvironmentViewsAgentAdded(a);
                }
            }
        }

        public void removeEnvironmentObject(EnvironmentObject eo)
        {
            envObjects.Remove(eo);
            //agents.Remove(eo);
        }

        /**
         * Central template method for controlling agent simulation. The
         * concrete behavior is determined by the primitive operations
         * {@link #getPerceptSeenBy(Agent)}, {@link #executeAction(Agent, Action)},
         * and {@link #createExogenousChange()}.
         */
        public void step()
        {
            foreach (Agent agent in agents)
            {
                if (agent.isAlive())
                {
                    Action anAction = agent.execute(getPerceptSeenBy(agent));
                    EnvironmentState es = executeAction(agent, anAction);
                    updateEnvironmentViewsAgentActed(agent, anAction, es);
                }
            }
            createExogenousChange();
        }

        public void step(int n)
        {
            for (int i = 0; i < n; i++)
            {
                step();
            }
        }

        public void stepUntilDone()
        {
            while (!isDone())
            {
                step();
            }
        }

        public bool isDone()
        {
            foreach (Agent agent in agents)
            {
                if (agent.isAlive())
                {
                    return false;
                }
            }
            return true;
        }

        public double getPerformanceMeasure(Agent forAgent)
        {
            Double pm = performanceMeasures[forAgent];
            if (null == pm)
            {
                pm = 0.0;
                performanceMeasures[forAgent] = pm;
            }

            return pm;
        }

        public void addEnvironmentView(EnvironmentView ev)
        {
            views.Add(ev);
        }

        public void removeEnvironmentView(EnvironmentView ev)
        {
            views.Remove(ev);
        }

        public void notifyViews(String msg)
        {
            foreach (EnvironmentView ev in views)
            {
                ev.notify(msg);
            }
        }

        // END-Environment
      
        // PROTECTED METHODS
       
        protected void updatePerformanceMeasure(Agent forAgent, double addTo)
        {
            performanceMeasures[forAgent] = getPerformanceMeasure(forAgent)
                    + addTo;
        }

        protected void updateEnvironmentViewsAgentAdded(Agent agent)
        {
            foreach (EnvironmentView view in views)
            {
                view.agentAdded(agent, getCurrentState());
            }
        }

        protected void updateEnvironmentViewsAgentActed(Agent agent, Action action,
                EnvironmentState state)
        {
            foreach (EnvironmentView view in views)
            {
                view.agentActed(agent, action, state);
            }
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/DynamicAction.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;

namespace aima.core.agent.impl
{
    /**
     * @author Ciaran O'Reilly
     */
    public class DynamicAction : ObjectWithDynamicAttributes,
            Action
    {
        public const String ATTRIBUTE_NAME = "name";

        public DynamicAction(String name)
        {
            this.setAttribute(ATTRIBUTE_NAME, name);
        }

        /**
	 * Returns the value of the name attribute.
	 * 
	 * @return the value of the name attribute.
	 */
        public String getName()
        {
            return (System.String)getAttribute(ATTRIBUTE_NAME);
        }

        // START-Action
        public bool isNoOp()
        {
            return false;
        }

        // END-Action
        public String describeType()
        {
            return this.GetType().Name;
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/DynamicEnvironmentState.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;

namespace aima.core.agent.impl
{
    /**
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
     public class DynamicEnvironmentState : ObjectWithDynamicAttributes, EnvironmentState
    {
        public DynamicEnvironmentState()
        {

        }

        public String describeType()
        {
            return typeof(EnvironmentState).Name;
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/DynamicPercept.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;
using System.Diagnostics;

namespace aima.core.agent.impl
{
    /**
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
    public class DynamicPercept : ObjectWithDynamicAttributes, Percept
    {
        public DynamicPercept()
        {

        }

        public String describeType()
        {
            return typeof(Percept).Name;
        }

        /**
	 * Constructs a DynamicPercept with one attribute
	 * 
	 * @param key1
	 *            the attribute key
	 * @param value1
	 *            the attribute value
	 */
        public DynamicPercept(Object key1, Object value1)
        {
            setAttribute(key1, value1);
        }


        /**
         * Constructs a DynamicPercept with two attributes
         * 
         * @param key1
         *            the first attribute key
         * @param value1
         *            the first attribute value
         * @param key2
         *            the second attribute key
         * @param value2
         *            the second attribute value
         */
        public DynamicPercept(Object key1, Object value1, Object key2, Object value2)
        {
            setAttribute(key1, value1);
            setAttribute(key2, value2);
        }

        /**
	 * Constructs a DynamicPercept with an array of attributes
	 * 
	 * @param keys
	 *            the array of attribute keys
	 * @param values
	 *            the array of attribute values
	 */
        public DynamicPercept(Object[] keys, Object[] values)
        {
            Debug.Assert(keys.Length == values.Length);

            for(int i = 0; i < keys.Length; i++)
            {
                setAttribute(keys[i], values[i]);
            }
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/DynamicState.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;

namespace aima.core.agent.impl
{
    /**
     * @author Ciaran O'Reilly
     */
    public class DynamicState : ObjectWithDynamicAttributes, State
    {
        public DynamicState()
        {

        }


        public String describeType()
        {
            return typeof(State).Name;
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/NoOpAction.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.agent.impl
{
    public class NoOpAction : DynamicAction
    {
        public static readonly NoOpAction NO_OP = new NoOpAction();

        // START-Action
        public bool isNoOp()
        {
            return true;
        }

        //END-Action
        private NoOpAction() : base("NoOp")
        {
            
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/ObjectWithDynamicAttributes.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;

namespace aima.core.agent.impl
{
    /**
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
     public abstract class ObjectWithDynamicAttributes
    {
        private Dictionary<Object, Object> attributes = new Dictionary<Object, Object>();

        //PUBLIC METHODS

        /**
         * By default, returns the simple name of the underlying class as given in
         * the source code.
         * 
         * @return the simple name of the underlying class
         */
        public String describeType()
        {
            return this.GetType().Name;
        }

        /**
	 * Returns a string representation of the object's current attributes
	 * 
	 * @return a string representation of the object's current attributes
	 */
        public String describeAttributes()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("[");
            bool first = true;
            foreach (Object key in attributes.Keys)
            {
                if (first)
                {
                    first = false;
                }
                else
                {
                    sb.Append(", ");
                }

                sb.Append(key);
                sb.Append("==");
                sb.Append(attributes[key]);
            }
            sb.Append("]");

            return sb.ToString();
        }

        /**
	 * Returns an unmodifiable view of the object's key set
	 * 
	 * @return an unmodifiable view of the object's key set
	 */
        public HashSet<Object> getKeySet()
        {
            return new HashSet<Object>(attributes.Keys);
        }

        /**
	 * Associates the specified value with the specified attribute key. If the
	 * ObjectWithDynamicAttributes previously contained a mapping for the
	 * attribute key, the old value is replaced.
	 * 
	 * @param key
	 *            the attribute key
	 * @param value
	 *            the attribute value
	 */
        public void setAttribute(Object key, Object value)
        {
            attributes[key] = value;
        }

        /**
	 * Returns the value of the specified attribute key, or null if the
	 * attribute was not found.
	 * 
	 * @param key
	 *            the attribute key
	 * 
	 * @return the value of the specified attribute name, or null if not found.
	 */
        public Object getAttribute(Object key)
        {
            return attributes[key];
        }

        /**
	 * Removes the attribute with the specified key from this
	 * ObjectWithDynamicAttributes.
	 * 
	 * @param key
	 *            the attribute key
	 */
        public void removeAttribute(Object key)
        {
            attributes.Remove(key);
        }


        /**
         * Creates and returns a copy of this ObjectWithDynamicAttributes
         */
        public ObjectWithDynamicAttributes copy()
        {
            ObjectWithDynamicAttributes copy = null;

            try
            {
                copy = (ObjectWithDynamicAttributes)this.GetType().GetConstructor(System.Type.EmptyTypes).Invoke(null);
                foreach (object val in attributes)
                {
                    copy.attributes.Add(val, attributes[val]);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
            }

            return copy;
        }

        public override bool Equals(Object o)
        {
            if (o == null || this.GetType() != o.GetType())
            {
                return base.Equals(o);
            }
            return attributes.Equals(((ObjectWithDynamicAttributes)o).attributes);
        }

        public override int GetHashCode()
        {
            return attributes.GetHashCode();
        }

        public override String ToString()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append(describeType());
            sb.Append(describeAttributes());

            return sb.ToString();
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/SimpleEnvironmentView.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;

namespace aima.core.agent.impl
{
    /**
     * Simple environment view which uses the standard output stream to inform about
     * relevant events.
     * 
     * @author Ruediger Lunde
     */
    public class SimpleEnvironmentView : EnvironmentView
    {
        public void agentActed(Agent agent, Action action, EnvironmentState resultingState)
        {
            System.Console.WriteLine("Agent acted: " + action.ToString());
        }

        public void agentAdded(Agent agent, EnvironmentState resultingState)
        {
            System.Console.WriteLine("Agent added.");
        }

        public void notify(string msg)
        {
            System.Console.WriteLine("Message: " + msg);
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/aprog/ModelBasedReflexAgentProgram.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.agent.impl.aprog.simplerule;

namespace aima.core.agent.impl.aprog
{
    /**
 * Artificial Intelligence A Modern Approach (3rd Edition): Figure 2.12, page
 * 51.<br>
 * <br>
 * 
 * <pre>
 * function MODEL-BASED-REFLEX-AGENT(percept) returns an action
 *   persistent: state, the agent's current conception of the world state
 *               model, a description of how the next state depends on current state and action
 *               rules, a set of condition-action rules
 *               action, the most recent action, initially none
 *               
 *   state  <- UPDATE-STATE(state, action, percept, model)
 *   rule   <- RULE-MATCH(state, rules)
 *   action <- rule.ACTION
 *   return action
 * </pre>
 * 
 * Figure 2.12 A model-based reflex agent. It keeps track of the current state
 * of the world using an internal model. It then chooses an action in the same
 * way as the reflex agent.
 * 
 * @author Ciaran O'Reilly
 * @author Mike Stampone
 * 
 */

    public abstract class ModelBasedReflexAgentProgram : AgentProgram
    {
        // persistent: state, the agent's current conception of the world state
        private DynamicState state = null;

        // model, a description of how the next state depends on current state and
        // action
        private Model model = null;

        // rules, a set of condition-action rules
        private HashSet<Rule> rules = null;

        // action, the most recent action, initially none
        private Action action = null;

        public ModelBasedReflexAgentProgram()
        {
            init();
        }

        /**
	 * Set the agent's current conception of the world state.
	 * 
	 * @param state
	 *            the agent's current conception of the world state.
	 */
         public void setState(DynamicState dstate)
        {
            state = dstate;
        }

        /**
	 * Set the program's description of how the next state depends on the state
	 * and action.
	 * 
	 * @param model
	 *            a description of how the next state depends on the current
	 *            state and action.
	 */
         public void setModel(Model mod)
        {
            model = mod;
        }

        /**
	 * Set the program's condition-action rules
	 * 
	 * @param ruleSet
	 *            a set of condition-action rules
	 */
        public void setRules(HashSet<Rule> ruleSet)
        {
            rules = ruleSet;
        }

        //START-AgentProgram

        // function MODEL-BASED-REFLEX-AGENT(percept) returns an action
        public Action execute(Percept percept)
        {
            // state <- UPDATE-STATE(state, action, percept, model)
            state = updateState(state, action, percept, model);
            // rule <- RULE-MATCH(state, rules)
            Rule rule = ruleMatch(state, rules);
            // action <- rule.ACTION
            action = ruleAction(rule);
            // return action
            return action;
        }

        // END-AgentProgram

        // PROTECTED METHODS

        /**
         * Realizations of this class should implement the init() method so that it
	 * calls the setState(), setModel(), and setRules() method.
	 */
        protected abstract void init();

        protected abstract DynamicState updateState(DynamicState state, Action action, Percept percept, Model model);

        protected Rule ruleMatch(DynamicState state, HashSet<Rule> rules)
        {
            foreach (Rule r in rules)
            {
                if (r.evaluate(state))
                {
                    return r;
                }
            }
            return null;
        }

        protected Action ruleAction(Rule r)
        {
            return null == r ? NoOpAction.NO_OP : r.getAction();
        }
    }
}


================================================
FILE: aima-csharp/agent/impl/aprog/SimpleReflexAgentProgram.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;
using aima.core.agent.impl;
using aima.core.agent.impl.aprog.simplerule;

namespace aima.core.agent.impl.aprog
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): Figure 2.10, page
     * 49.<br>
     * <br>
     * 
     * <pre>
     * function SIMPLE-RELEX-AGENT(percept) returns an action
     *   persistent: rules, a set of condition-action rules
     *        
     * state  <- INTERPRET-INPUT(percept);
     * rule   <- RULE-MATCH(state, rules);
     * action <- rule.ACTION;
     * return action
     * </pre>            
     * Figure 2.10 A simple reflex agent. It acts according to a rule whose
     * condition matches the current state, as defined by the percept.
     * 
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     * 
     */
     public class SimpleReflexAgentProgram : AgentProgram
    {
        // persistent: rules, a set of condition-action rules
        private HashSet<Rule> rules;

        /**
	 * Constructs a SimpleReflexAgentProgram with a set of condition-action
	 * rules.
	 * 
	 * @param ruleSet
	 *            a set of condition-action rules
	 */
         public SimpleReflexAgentProgram(HashSet<Rule> ruleSet)
        {
            rules = ruleSet;
        }

        // START-AgentProgram

        // function SIMPLE-RELEX-AGENT(percept) returns an action
        public Action execute(Percept percept)
        {
            // state <- INTERPRET-INPUT(percept);
            ObjectWithDynamicAttributes state = interpretInput(percept);
            // rule <- RULE-MATCH(state, rules);
            Rule rule = ruleMatch(state, rules);
            // action <- rule.ACTION;
            // return action
            return ruleAction(rule);
        }

        // END-AgentProgram

        // PROTECTED METHODS

        protected ObjectWithDynamicAttributes interpretInput(Percept p)
        {
            return (DynamicPercept)p;
        }

        protected Rule ruleMatch(ObjectWithDynamicAttributes state,
                HashSet<Rule> rulesSet)
        {
            foreach (Rule r in rulesSet)
            {
                if (r.evaluate(state))
                {
                    return r;
                }
            }
            return null;
        }

        protected Action ruleAction(Rule r)
        {
            return null == r ? NoOpAction.NO_OP : r.getAction();
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/aprog/TableDrivenAgentProgram.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.agent.impl;
using aima.core.util;

namespace aima.core.agent.impl.aprog
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): Figure 2.7, page 47.<br>
     * <br>
     * 
     * <pre>
     * function TABLE-DRIVEN-AGENT(percept) returns an action
     *   persistent: percepts, a sequence, initially empty
     *               table, a table of actions, indexed by percept sequences, initially fully specified
     *           
     *   append percept to end of percepts
     *   action <- LOOKUP(percepts, table)
     *   return action
     * </pre>
     * 
     * Figure 2.7 The TABLE-DRIVEN-AGENT program is invoked for each new percept and
     * returns an action each time. It retains the complete percept sequence in
     * memory.
     * 
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     * 
     */
    public class TableDrivenAgentProgram : AgentProgram
    {
        private List<Percept> percepts = new List<Percept>();

        private Table<List<Percept>, System.String, Action> table;

        private const System.String ACTION = "action";

        // persistent: percepts, a sequence, initially empty
        // table, a table of actions, indexed by percept sequences, initially fully
        // specified
        /**
         * Constructs a TableDrivenAgentProgram with a table of actions, indexed by
         * percept sequences.
         * 
         * @param perceptSequenceActions
         *            a table of actions, indexed by percept sequences
         */
        public TableDrivenAgentProgram(Dictionary<List<Percept>, Action> perceptSequenceActions)
        {
            List<List<Percept>> rowHeaders = new List<List<Percept>>(perceptSequenceActions.Keys);

            List<System.String> colHeaders = new List<System.String>();
            colHeaders.Add(ACTION);

            table = new Table<List<Percept>, System.String, Action>(rowHeaders, colHeaders);

            foreach (List<Percept> row in rowHeaders)
            {
                table.set(row, ACTION, perceptSequenceActions[row]);
            }
        }

        // START-AgentProgram

        // function TABLE-DRIVEN-AGENT(percept) returns an action
        public Action execute(Percept percept)
        {
            // append percept to end of percepts
            percepts.Add(percept);

            // action <- LOOKUP(percepts, table)
            // return action
            return lookupCurrentAction();
        }

        //END-AgentProgram

        //PRIVATE METHODS
        private Action lookupCurrentAction()
        {
            Action action = null;

            action = table.get(percepts, ACTION);
            if (null == action)
            {
                action = NoOpAction.NO_OP;
            }

            return action;
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/aprog/simplerule/ANDCondition.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using aima.core.agent.impl;

namespace aima.core.agent.impl.aprog.simplerule
{
    /**
     * Implementation of an AND condition.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class ANDCondition : Condition
    {
        private Condition left;

        private Condition right;

        public ANDCondition(Condition leftCon, Condition rightCon)
        {
            Debug.Assert(null != leftCon);
            Debug.Assert(null != rightCon);

            left = leftCon;
            right = rightCon;
        }

        public override bool evaluate(ObjectWithDynamicAttributes p)
        {
            return (left.evaluate(p) && right.evaluate(p));
        }

        public override String ToString()
        {
            StringBuilder sb = new StringBuilder();

            return sb.Append("[").Append(left).Append(" && ").Append(right).Append(
                    "]").ToString();
        }
    }    
}

================================================
FILE: aima-csharp/agent/impl/aprog/simplerule/Condition.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent.impl;

namespace aima.core.agent.impl.aprog.simplerule
{
    /**
     * Base abstract class for describing conditions.
     * 
     * @author Ciaran O'Reilly
     * 
     */
     public abstract class Condition
    {
        public abstract bool evaluate(ObjectWithDynamicAttributes p);

        public bool Equals(Object o)
        {
            if(o == null || !(o is Condition))
            {
                return base.Equals(o);
            }
            return (ToString().Equals(((Condition)o).ToString()));
        }

        public override int GetHashCode()
        {
            return ToString().GetHashCode();
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/aprog/simplerule/EQUALCondition.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using aima.core.agent.impl;

namespace aima.core.agent.impl.aprog.simplerule
{
    /**
     * Implementation of an EQUALity condition.
     * 
     * @author Ciaran O'Reilly
     * 
     */
     public class EQUALCondition : Condition
    {
        private Object key;

        private Object value;

        public EQUALCondition(Object k, Object val)
        {
            Debug.Assert(null != key);
            Debug.Assert(null != value);

            key = k;
            value = val;
        }

        public override bool evaluate(ObjectWithDynamicAttributes p)
        {
            return value.Equals(p.getAttribute(key));
        }

        public override String ToString()
        {
            StringBuilder sb = new StringBuilder();

            return sb.Append(key).Append("==").Append(value).ToString();
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/aprog/simplerule/NOTCondition.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using aima.core.agent.impl;

namespace aima.core.agent.impl.aprog.simplerule
{
    /**
     * Implementation of a NOT condition.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class NOTCondition : Condition
    {
        private Condition con;

        public NOTCondition(Condition c)
        {
            Debug.Assert(null != con);

            con = c;
        }

        public override bool evaluate(ObjectWithDynamicAttributes p)
        {
            return (!con.evaluate(p));
        }

        public override String ToString()
        {
            StringBuilder sb = new StringBuilder();

            return sb.Append("![").Append(con).Append("]").ToString();
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/aprog/simplerule/ORCondition.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using aima.core.agent.impl;

namespace aima.core.agent.impl.aprog.simplerule
{
    /**
     * Implementation of an OR condition.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class ORCondition : Condition
    {
        private Condition left;

        private Condition right;

        public ORCondition(Condition leftCon, Condition rightCon)
        {
            Debug.Assert(null != leftCon);
            Debug.Assert(null != rightCon);

            left = leftCon;
            right = rightCon;
        }

        public override bool evaluate(ObjectWithDynamicAttributes p)
        {
            return (left.evaluate(p) || right.evaluate(p));
        }

        public override String ToString()
        {
            StringBuilder sb = new StringBuilder();

            return sb.Append("[").Append(left).Append(" || ").Append(right).Append(
                    "]").ToString();
        }
    }
}

================================================
FILE: aima-csharp/agent/impl/aprog/simplerule/Rule.cs
================================================
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using aima.core.agent;
using aima.core.agent.impl;

namespace aima.core.agent.impl.aprog.simplerule
{
    /**
     * A simple implementation of a "condition-action rule".
     * 
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
     public class Rule
    {
        private Condition con;

        private Action action;


        /**
         * Constructs a condition-action rule.
         * 
         * @param con
         *            a condition
         * @param action
         *            an action
         */
        public Rule(Condition c, Action act)
        {
            Debug.Assert(null != con);
            Debug.Assert(null != action);

            con = c;
            action = act;
        }

        public bool evaluate(ObjectWithDynamicAttributes p)
        {
            return (con.evaluate(p));
        }

        /**
	 * Returns the action of this condition-action rule.
	 * 
	 * @return the action of this condition-action rule.
	 */
        public Action getAction()
        {
            return action;
        }

        public override bool Equals(System.Object o)
        {
            if (o == null || !(o is Rule))
            {
                return base.Equals(o);
            }
            return (ToString().Equals(((Rule)o).ToString()));
        }

        public override int GetHashCode()
        {
            return ToString().GetHashCode();
        }

        public override System.String ToString()
        {
            StringBuilder sb = new StringBuilder();

            return sb.Append("if ").Append(con).Append(" then ").Append(action)
                    .Append(".").ToString();
        }
    }
}

================================================
FILE: aima-csharp/aima-csharp.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{125F53D5-1CCF-4DAF-82FE-4324686CF417}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>aima_csharp</RootNamespace>
    <AssemblyName>aima-csharp</AssemblyName>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <FileAlignment>512</FileAlignment>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug\</OutputPath>
    <DefineConstants>DEBUG;TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <PlatformTarget>AnyCPU</PlatformTarget>
    <DebugType>pdbonly</DebugType>
    <Optimize>true</Optimize>
    <OutputPath>bin\Release\</OutputPath>
    <DefineConstants>TRACE</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="System" />
    <Reference Include="System.Core" />
    <Reference Include="System.Xml.Linq" />
    <Reference Include="System.Data.DataSetExtensions" />
    <Reference Include="Microsoft.CSharp" />
    <Reference Include="System.Data" />
    <Reference Include="System.Net.Http" />
    <Reference Include="System.Xml" />
  </ItemGroup>
  <ItemGroup>
    <Compile Include="agent\Action.cs" />
    <Compile Include="agent\Agent.cs" />
    <Compile Include="agent\AgentProgram.cs" />
    <Compile Include="agent\Environment.cs" />
    <Compile Include="agent\EnvironmentObject.cs" />
    <Compile Include="agent\EnvironmentState.cs" />
    <Compile Include="agent\EnvironmentView.cs" />
    <Compile Include="agent\EnvironmentViewNotifier.cs" />
    <Compile Include="agent\impl\AbstractAgent.cs" />
    <Compile Include="agent\impl\AbstractEnvironment.cs" />
    <Compile Include="agent\impl\aprog\ModelBasedReflexAgentProgram.cs" />
    <Compile Include="agent\impl\aprog\SimpleReflexAgentProgram.cs" />
    <Compile Include="agent\impl\aprog\simplerule\ANDCondition.cs" />
    <Compile Include="agent\impl\aprog\simplerule\Condition.cs" />
    <Compile Include="agent\impl\aprog\simplerule\EQUALCondition.cs" />
    <Compile Include="agent\impl\aprog\simplerule\NOTCondition.cs" />
    <Compile Include="agent\impl\aprog\simplerule\ORCondition.cs" />
    <Compile Include="agent\impl\aprog\simplerule\Rule.cs" />
    <Compile Include="agent\impl\aprog\TableDrivenAgentProgram.cs" />
    <Compile Include="agent\impl\DynamicAction.cs" />
    <Compile Include="agent\impl\DynamicEnvironmentState.cs" />
    <Compile Include="agent\impl\DynamicPercept.cs" />
    <Compile Include="agent\impl\DynamicState.cs" />
    <Compile Include="agent\impl\NoOpAction.cs" />
    <Compile Include="agent\impl\ObjectWithDynamicAttributes.cs" />
    <Compile Include="agent\impl\SimpleEnvironmentView.cs" />
    <Compile Include="agent\Model.cs" />
    <Compile Include="agent\Percept.cs" />
    <Compile Include="agent\State.cs" />
    <Compile Include="environment\cellworld\Cell.cs" />
    <Compile Include="environment\cellworld\CellWorld.cs" />
    <Compile Include="environment\cellworld\CellWorldAction.cs" />
    <Compile Include="environment\cellworld\CellWorldFactory.cs" />
    <Compile Include="environment\eightpuzzle\BidirectionalEightPuzzleProblem.cs" />
    <Compile Include="environment\eightpuzzle\EightPuzzleBoard.cs" />
    <Compile Include="environment\eightpuzzle\EightPuzzleFunctionFactory.cs" />
    <Compile Include="environment\eightpuzzle\EightPuzzleGoalTest.cs" />
    <Compile Include="environment\eightpuzzle\ManhattanHeuristicFunction.cs" />
    <Compile Include="environment\eightpuzzle\MisplacedTilleHeuristicFunction.cs" />
    <Compile Include="environment\map\AdaptableHeuristicFunction.cs" />
    <Compile Include="environment\map\BidirectionalMapProblem.cs" />
    <Compile Include="environment\map\DynAttributeNames.cs" />
    <Compile Include="environment\map\ExtendableMap.cs" />
    <Compile Include="environment\map\Map.cs" />
    <Compile Include="environment\map\MapAgent.cs" />
    <Compile Include="environment\map\MapEnvironment.cs" />
    <Compile Include="environment\map\MapEnvironmentState.cs" />
    <Compile Include="environment\map\MapFunctionFactory.cs" />
    <Compile Include="environment\map\MapStepCostFunction.cs" />
    <Compile Include="environment\map\MoveToAction.cs" />
    <Compile Include="environment\map\Scenario.cs" />
    <Compile Include="environment\map\SimplifiedRoadMapOfAustralia.cs" />
    <Compile Include="environment\map\SimplifiedRoadMapOfPartOfRomania.cs" />
    <Compile Include="environment\map\StraightLineDistanceHeuristicFunction.cs" />
    <Compile Include="environment\wumpusworld\AgentPercept.cs" />
    <Compile Include="environment\wumpusworld\AgentPosition.cs" />
    <Compile Include="environment\wumpusworld\ManhattanHeuristicFunction.cs" />
    <Compile Include="environment\wumpusworld\Room.cs" />
    <Compile Include="logic\common\Lexer.cs" />
    <Compile Include="logic\common\LexerException.cs" />
    <Compile Include="logic\common\LogicTokenTypes.cs" />
    <Compile Include="logic\common\Parser.cs" />
    <Compile Include="logic\common\ParserException.cs" />
    <Compile Include="logic\common\ParserTreeNode.cs" />
    <Compile Include="logic\common\Token.cs" />
    <Compile Include="logic\fol\CNFConverter.cs" />
    <Compile Include="logic\fol\Connectors.cs" />
    <Compile Include="logic\fol\domain\DomainFactory.cs" />
    <Compile Include="logic\fol\domain\FOLDomain.cs" />
    <Compile Include="logic\fol\domain\FOLDomainAnswerLiteralAddedEvent.cs" />
    <Compile Include="logic\fol\domain\FOLDomainEvent.cs" />
    <Compile Include="logic\fol\domain\FOLDomainListener.cs" />
    <Compile Include="logic\fol\domain\FOLDomainSkolemConstantAddedEvent.cs" />
    <Compile Include="logic\fol\domain\FOLDomainSkolemFunctionAddedEvent.cs" />
    <Compile Include="logic\fol\inference\AbstractModulation.cs" />
    <Compile Include="logic\fol\inference\Demodulation.cs" />
    <Compile Include="logic\fol\inference\FOLBCAsk.cs" />
    <Compile Include="logic\fol\inference\FOLFCAsk.cs" />
    <Compile Include="logic\fol\inference\FOLModelElimination.cs" />
    <Compile Include="logic\fol\inference\FOLOTTERLikeTheoremProver.cs" />
    <Compile Include="logic\fol\inference\FOLTFMResolution.cs" />
    <Compile Include="logic\fol\inference\InferenceProcedure.cs" />
    <Compile Include="logic\fol\inference\InferenceResult.cs" />
    <Compile Include="logic\fol\inference\InferenceResultPrinter.cs" />
    <Compile Include="logic\fol\inference\otter\ClauseFilter.cs" />
    <Compile Include="logic\fol\inference\otter\ClauseSimplifier.cs" />
    <Compile Include="logic\fol\inference\otter\defaultimpl\DefaultClauseFilter.cs" />
    <Compile Include="logic\fol\inference\otter\defaultimpl\DefaultClauseSimplifier.cs" />
    <Compile Include="logic\fol\inference\otter\defaultimpl\DefaultLightestClauseHeuristic.cs" />
    <Compile Include="logic\fol\inference\otter\LightestClauseHeuristic.cs" />
    <Compile Include="logic\fol\inference\Paramodulation.cs" />
    <Compile Include="logic\fol\inference\proof\AbstractProofStep.cs" />
    <Compile Include="logic\fol\inference\proof\Proof.cs" />
    <Compile Include="logic\fol\inference\proof\ProofFinal.cs" />
    <Compile Include="logic\fol\inference\proof\ProofPrinter.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStep.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepBwChGoal.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepChainCancellation.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepChainContrapositive.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepChainDropped.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepChainFromClause.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepChainReduction.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepClauseBinaryResolvent.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepClauseClausifySentence.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepClauseDemodulation.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepClauseFactor.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepClauseParamodulation.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepFoChAlreadyAFact.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepFoChAssertFact.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepGoal.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepPremise.cs" />
    <Compile Include="logic\fol\inference\proof\ProofStepRenaming.cs" />
    <Compile Include="logic\fol\inference\trace\FOLModelEliminationTracer.cs" />
    <Compile Include="logic\fol\inference\trace\FOLTFMResolutiontracer.cs" />
    <Compile Include="logic\fol\kb\data\Chain.cs" />
    <Compile Include="logic\fol\kb\data\Clause.cs" />
    <Compile Include="logic\fol\kb\data\CNF.cs" />
    <Compile Include="logic\fol\kb\data\Literal.cs" />
    <Compile Include="logic\fol\kb\data\ReducedLiteral.cs" />
    <Compile Include="logic\fol\kb\FOLKnowledgeBase.cs" />
    <Compile Include="logic\fol\kb\FOLKnowledgeBaseFactory.cs" />
    <Compile Include="logic\fol\parsing\AbstractFOLVisitor.cs" />
    <Compile Include="logic\fol\parsing\ast\AtomicSentence.cs" />
    <Compile Include="logic\fol\parsing\ast\ConnectedSentence.cs" />
    <Compile Include="logic\fol\parsing\ast\Constant.cs" />
    <Compile Include="logic\fol\parsing\ast\FOLNode.cs" />
    <Compile Include="logic\fol\parsing\ast\Function.cs" />
    <Compile Include="logic\fol\parsing\ast\NotSentence.cs" />
    <Compile Include="logic\fol\parsing\ast\Predicate.cs" />
    <Compile Include="logic\fol\parsing\ast\QuantifiedSentence.cs" />
    <Compile Include="logic\fol\parsing\ast\Sentence.cs" />
    <Compile Include="logic\fol\parsing\ast\Term.cs" />
    <Compile Include="logic\fol\parsing\ast\TermEquality.cs" />
    <Compile Include="logic\fol\parsing\ast\Variable.cs" />
    <Compile Include="logic\fol\parsing\FOLLexer.cs" />
    <Compile Include="logic\fol\parsing\FOLParser.cs" />
    <Compile Include="logic\fol\parsing\FOLVisitor.cs" />
    <Compile Include="logic\fol\PredicateCollector.cs" />
    <Compile Include="logic\fol\Quantifiers.cs" />
    <Compile Include="logic\fol\StandardizeApart.cs" />
    <Compile Include="logic\fol\StandardizeApartIndexical.cs" />
    <Compile Include="logic\fol\StandardizeApartIndexicalFactory.cs" />
    <Compile Include="logic\fol\StandardizeApartInPlace.cs" />
    <Compile Include="logic\fol\StandardizeApartResult.cs" />
    <Compile Include="logic\fol\SubstVisitor.cs" />
    <Compile Include="logic\fol\SubsumptionElimination.cs" />
    <Compile Include="logic\fol\Unifier.cs" />
    <Compile Include="logic\fol\VariableCollector.cs" />
    <Compile Include="logic\propositional\agent\KBAgent.cs" />
    <Compile Include="logic\propositional\kb\KnowledgeBase.cs" />
    <Compile Include="logic\propositional\parsing\ast\AtomicSentence.cs" />
    <Compile Include="logic\propositional\parsing\ast\ComplexSentence.cs" />
    <Compile Include="logic\propositional\parsing\ast\Connective.cs" />
    <Compile Include="logic\propositional\parsing\ast\PropositionSymbol.cs" />
    <Compile Include="logic\propositional\parsing\ast\Sentence.cs" />
    <Compile Include="logic\propositional\parsing\PLVisitor.cs" />
    <Compile Include="Program.cs" />
    <Compile Include="Properties\AssemblyInfo.cs" />
    <Compile Include="search\framework\CutOffIndicatorAction.cs" />
    <Compile Include="search\framework\EvaluationFunction.cs" />
    <Compile Include="search\framework\HeuristicFunction.cs" />
    <Compile Include="search\framework\Metrics.cs" />
    <Compile Include="search\framework\Node.cs" />
    <Compile Include="search\framework\NodeExpander.cs" />
    <Compile Include="search\framework\PathCostFunction.cs" />
    <Compile Include="search\framework\PerceptToStateFunction.cs" />
    <Compile Include="search\framework\problem\ActionsFunction.cs" />
    <Compile Include="search\framework\problem\BidirectionalProblem.cs" />
    <Compile Include="search\framework\problem\DefaultGoalTest.cs" />
    <Compile Include="search\framework\problem\DefaultStepCostFunction.cs" />
    <Compile Include="search\framework\problem\GoalTest.cs" />
    <Compile Include="search\framework\problem\Problem.cs" />
    <Compile Include="search\framework\problem\ResultFunction.cs" />
    <Compile Include="search\framework\problem\StepCostFunction.cs" />
    <Compile Include="search\framework\qsearch\GraphSearch.cs" />
    <Compile Include="search\framework\qsearch\GraphSearchBFS.cs" />
    <Compile Include="search\framework\qsearch\QueueSearch.cs" />
    <Compile Include="search\framework\qsearch\TreeSearch.cs" />
    <Compile Include="search\framework\Search.cs" />
    <Compile Include="search\framework\SearchAgent.cs" />
    <Compile Include="search\framework\SearchForActions.cs" />
    <Compile Include="search\framework\SearchUtils.cs" />
    <Compile Include="search\framework\SimpleProblemSolvingAgent.cs" />
    <Compile Include="search\framework\SolutionChecker.cs" />
    <Compile Include="search\Local\FitnessFunction.cs" />
    <Compile Include="search\Local\Individual.cs" />
    <Compile Include="search\Local\Scheduler.cs" />
    <Compile Include="search\online\LRTAStarAgent.cs" />
    <Compile Include="search\online\OnlineDFSAgent.cs" />
    <Compile Include="search\online\OnlineSearchProblem.cs" />
    <Compile Include="util\ArrayIterator.cs" />
    <Compile Include="util\CSharpRandomizer.cs" />
    <Compile Include="util\DisjointSets.cs" />
    <Compile Include="util\FrequencyCounter.cs" />
    <Compile Include="util\Interval.cs" />
    <Compile Include="util\LabeledGraph.cs" />
    <Compile Include="util\LinkedHashSet.cs" />
    <Compile Include="util\LUDecomposition.cs" />
    <Compile Include="util\Matrix.cs" />
    <Compile Include="util\MixedRadixNumber.cs" />
    <Compile Include="util\MockRandomizer.cs" />
    <Compile Include="util\Pair.cs" />
    <Compile Include="util\Point2D.cs" />
    <Compile Include="util\Randomizer.cs" />
    <Compile Include="util\SetOps.cs" />
    <Compile Include="util\Table.cs" />
    <Compile Include="util\Triplet.cs" />
    <Compile Include="util\TwoKeyHashMap.cs" />
    <Compile Include="util\Util.cs" />
    <Compile Include="util\Vector.cs" />
    <Compile Include="util\XYLocation.cs" />
  </ItemGroup>
  <ItemGroup>
    <None Include="App.config" />
  </ItemGroup>
  <ItemGroup>
    <Folder Include="environment\wumpusworld\action\" />
  </ItemGroup>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets.
  <Target Name="BeforeBuild">
  </Target>
  <Target Name="AfterBuild">
  </Target>
  -->
</Project>

================================================
FILE: aima-csharp/environment/cellworld/Cell.cs
================================================
using System;

namespace aima.core.environment.cellworld
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): page 645.<br>
     * <br>
     * A representation of a Cell in the environment detailed in Figure 17.1.
     * 
     * @param <C>
     *            the content type of the cell.
     * 
     * @author Ciaran O'Reilly
     * @author Ravi Mohan
     */
    public class Cell<C>
    {
	private int x = 1;
	private int y = 1;
	private C content = default(C);

	/**
	 * Construct a Cell.
	 * 
	 * @param x
	 *            the x position of the cell.
	 * @param y
	 *            the y position of the cell.
	 * @param content
	 *            the initial content of the cell.
	 */
	public Cell(int x, int y, C content)
	{
	    this.x = x;
	    this.y = y;
	    this.content = content;
	}

	/**
	 * 
	 * @return the x position of the cell.
	 */
	public int getX()
	{
	    return x;
	}

	/**
	 * 
	 * @return the y position of the cell.
	 */
	public int getY()
	{
	    return y;
	}

	/**
	 * 
	 * @return the content of the cell.
	 */
	public C getContent()
	{
	    return content;
	}

	/**
	 * Set the cell's content.
	 * 
	 * @param content
	 *            the content to be placed in the cell.
	 */
	public void setContent(C content)
	{
	    this.content = content;
	}

	public String toString()
	{
	    return "<x=" + x + ", y=" + y + ", content=" + content + ">";
	}
		
	public bool equals(Object o)
	{
	    if (o is Cell<C>) {
		Cell <C> c = (Cell <C>) o;
		return x == c.x && y == c.y && content.Equals(c.content);
	    }
	    return false;
	}
	
	public int hashCode()
	{
	    return x + 23 + y + 31 * content.GetHashCode();
	}
    }
}

================================================
FILE: aima-csharp/environment/cellworld/CellWorld.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.util;

namespace aima.core.environment.cellworld
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): page 645.<br>
     * <br>
     * 
     * A representation for the environment depicted in figure 17.1.<br>
     * <br>
     * <b>Note:<b> the x and y coordinates are always positive integers starting at
     * 1.<br>
     * <b>Note:<b> If looking at a rectangle - the coordinate (x=1, y=1) will be the
     * bottom left hand corner.<br>
     * 
     * 
     * @param <C>
     *            the type of content for the Cells in the world.
     * 
     * @author Ciaran O'Reilly
     * @author Ravi Mohan
     */
    public class CellWorld<C>
    {
	private LinkedHashSet<Cell<C>> cells = new LinkedHashSet<Cell<C>>();
	private Dictionary<int, Dictionary<int, Cell<C>>> cellLookup = new Dictionary<int, Dictionary<int, Cell<C>>>();
	/**
	 * Construct a Cell World with size xDimension * y Dimension cells, all with
	 * their values set to a default content value.
	 * 
	 * @param xDimension
	 *            the size of the x dimension.
	 * @param yDimension
	 *            the size of the y dimension.
	 * 
	 * @param defaultCellContent
	 *            the default content to assign to each cell created.
	 */
	public CellWorld(int xDimension, int yDimension, C defaultCellContent)
	{
	    for (int x = 1; x <= xDimension; x++)
	    {
		Dictionary<int, Cell<C>> xCol = new Dictionary<int, Cell<C>>();
		for (int y = 1; y <= yDimension; y++)
		{
		    Cell<C> c = new Cell<C>(x, y, defaultCellContent);
		    cells.Add(c);
		    xCol[y] = c;
		}
		cellLookup[x] = xCol;
	    }
	}

	/**
	 * 
	 * @return all the cells in this world.
	 */
	public LinkedHashSet<Cell<C>> getCells()
	{
	    return cells;
	}

	/**
	 * Determine what cell would be moved into if the specified action is
	 * performed in the specified cell. Normally, this will be the cell adjacent
	 * in the appropriate direction. However, if there is no cell in the
	 * adjacent direction of the action then the outcome of the action is to
	 * stay in the same cell as the action was performed in.
	 * 
	 * @param s
	 *            the cell location from which the action is to be performed.
	 * @param a
	 *            the action to perform (Up, Down, Left, or Right).
	 * @return the Cell an agent would end up in if they performed the specified
	 *         action from the specified cell location.
	 */
	public Cell<C> result(Cell<C> s, CellWorldAction a)
	{
	    Cell<C> sDelta = getCellAt(a.getXResult(s.getX()), a.getYResult(s
			    .getY()));
	    if (null == sDelta)
	    {
		// Default to no effect
		// (i.e. bumps back in place as no adjoining cell).
		sDelta = s;
	    }
	    return sDelta;
	}

	/**
	 * Remove the cell at the specified location from this Cell World. This
	 * allows you to introduce barriers into different location.
	 * 
	 * @param x
	 *            the x dimension of the cell to be removed.
	 * @param y
	 *            the y dimension of the cell to be removed.
	 */
	public void removeCell(int x, int y)
	{
	    Dictionary<int, Cell<C>> xCol = cellLookup[x];
	    if (null != xCol)
	    {
		xCol.Remove(y);
		cells.Remove(xCol[y]);
	    }
	}

	/**
	 * Get the cell at the specified x and y locations.
	 * 
	 * @param x
	 *            the x dimension of the cell to be retrieved.
	 * @param y
	 *            the y dimension of the cell to be retrieved.
	 * @return the cell at the specified x,y location, null if no cell exists at
	 *         this location.
	 */
	public Cell<C> getCellAt(int x, int y)
	{
	    Cell<C> c = null;
	    Dictionary<int, Cell<C>> xCol = cellLookup[x];
	    if (null != xCol)
	    {
		c = xCol[y];
	    }
	    return c;
	}
    }
}

================================================
FILE: aima-csharp/environment/cellworld/CellWorldAction.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.util;

namespace aima.core.environment.cellworld
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): page 645.<br>
     * <br>
     * 
     * The actions in every state are Up, Down, Left, and Right.<br>
     * <br>
     * <b>Note:<b> Moving 'North' causes y to increase by 1, 'Down' y to decrease by
     * 1, 'Left' x to decrease by 1, and 'Right' x to increase by 1 within a Cell
     * World.
     * 
     * @author Ciaran O'Reilly
     * 
     */
     public class CellWorldAction : Action
    {
	public CellWorldAction()
	{

	}

	public CellWorldAction(ActionEnum action)
	{
	    this._action = action;
	}


	public enum ActionEnum
	{
	    Up, Down, Left, Right, None
	};

	private ActionEnum _action;

	private static readonly LinkedHashSet<ActionEnum> _actions = new LinkedHashSet<ActionEnum>();


	static CellWorldAction()
	{
	    _actions.Add(ActionEnum.Up);
	    _actions.Add(ActionEnum.Down);
	    _actions.Add(ActionEnum.Left);
	    _actions.Add(ActionEnum.Right);
	    _actions.Add(ActionEnum.None);
	}

	/**
	 * 
	 * @return a set of the actual actions.
	 */
	public static LinkedHashSet<ActionEnum> actions()
	{
	    return _actions;
	}

	// START-Action

	public bool isNoOp()
	{
	    if (this._action == ActionEnum.None)
	    {
		return true;
	    }
	    return false;
	}

	// END-Action
	
	/**
	 * 
	 * @param curX
	 *            the current x position.
	 * @return the result on the x position of applying this action.
	 */
	public int getXResult(int curX)
	{
	    int newX = curX;

	    switch (this._action)
	    {
		case ActionEnum.Left:
		    newX--;
		    break;
		case ActionEnum.Right:
		    newX++;
		    break;
	    }
	    return newX;
	}

	/**
	 * 
	 * @param curY
	 *            the current y position.
	 * @return the result on the y position of applying this action.
	 */
	public int getYResult(int curY)
	{
	    int newY = curY;

	    switch (this._action)
	    {
		case ActionEnum.Up:
		    newY++;
		    break;
		case ActionEnum.Down:
		    newY--;
		    break;
	    }
	    return newY;
	}

	/**
	 * 
	 * @return the first right angled action related to this action.
	 */
	public ActionEnum getFirstRightAngledAction()
	{
	    ActionEnum a = ActionEnum.None;

	    switch (this._action)
	    {
		case ActionEnum.Up:
		case ActionEnum.Down:
		    a = ActionEnum.Left;
		    break;
		case ActionEnum.Left:
		case ActionEnum.Right:
		    a = ActionEnum.Down;
		    break;
		case ActionEnum.None:
		    a = ActionEnum.None;
		    break;
	    }
	    return a;
	}

	/**
	 * 
	 * @return the second right angled action related to this action.
	 */
	public ActionEnum getSecondRightAngledAction()
	{
	    ActionEnum a = ActionEnum.None;

	    switch (this._action)
	    {
		case ActionEnum.Up:
		case ActionEnum.Down:
		    a = ActionEnum.Right;
		    break;
		case ActionEnum.Left:
		case ActionEnum.Right:
		    a = ActionEnum.Up;
		    break;
		case ActionEnum.None:
		    a = ActionEnum.None;
		    break;
	    }
	    return a;
	}
    }
}

================================================
FILE: aima-csharp/environment/cellworld/CellWorldFactory.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.environment.cellworld
{
    /**
     * 
     * @author Ciaran O'Reilly
     * 
     */
     public class CellWorldFactory
    {
	/**
	 * Create the cell world as defined in Figure 17.1 in AIMA3e. (a) A simple 4
	 * x 3 environment that presents the agent with a sequential decision
	 * problem.
	 * 
	 * @return a cell world representation of Fig 17.1 in AIMA3e.
	 */
	public static CellWorld<Double> createCellWorldForFig17_1()
	{
	    CellWorld<Double> cw = new CellWorld<Double>(4, 3, -0.04);

	    cw.removeCell(2, 2);

	    cw.getCellAt(4, 3).setContent(1.0);
	    cw.getCellAt(4, 2).setContent(-1.0);

	    return cw;
	}
    }
}

================================================
FILE: aima-csharp/environment/eightpuzzle/BidirectionalEightPuzzleProblem.cs
================================================
using System.Collections.Generic;
using aima.core.search.framework.problem;

namespace aima.core.environment.eightpuzzle
{
    /**
     * @author Ruediger Lunde
     * 
     */
    public class BidirectionalEightPuzzleProblem : Problem, BidirectionalProblem
    {
	Problem reverseProblem;

	public BidirectionalEightPuzzleProblem(EightPuzzleBoard initialState): base(initialState, EightPuzzleFunctionFactory.getActionsFunction(),
				EightPuzzleFunctionFactory.getResultFunction(),
				new DefaultGoalTest(new EightPuzzleBoard(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 })))
	{
	    reverseProblem = new Problem(new EightPuzzleBoard(new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }),
				EightPuzzleFunctionFactory.getActionsFunction(), EightPuzzleFunctionFactory.getResultFunction(),
				new DefaultGoalTest(initialState));
	}

	public Problem getOriginalProblem()
	{
	    return this;
	}

	public Problem getReverseProblem()
	{
	    return reverseProblem;
	}
    }
}

================================================
FILE: aima-csharp/environment/eightpuzzle/EightPuzzleBoard.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;
using aima.core.agent.impl;
using aima.core.util;

namespace aima.core.environment.eightpuzzle
{
    /**
     * @author Ravi Mohan
     * @author R. Lunde
     */
    public class EightPuzzleBoard
    {
	public static agent.Action LEFT = new DynamicAction("Left");

	public static agent.Action RIGHT = new DynamicAction("Right");

	public static agent.Action UP = new DynamicAction("Up");

	public static agent.Action DOWN = new DynamicAction("Down");

	private int[] state;

	// PUBLIC METHODS

	public EightPuzzleBoard()
	{
	    state = new int[] { 5, 4, 0, 6, 1, 8, 7, 3, 2 };
	}

	public EightPuzzleBoard(int[] state)
	{
	    this.state = new int[state.Length];
	    System.Array.Copy(state, 0, this.state, 0, state.Length);
	}

	public EightPuzzleBoard(EightPuzzleBoard copyBoard): this(copyBoard.getState())
	{
	    
	}

	public int[] getState()
	{
	    return state;
	}

	public int getValueAt(XYLocation loc)
	{
	    return getValueAt(loc.getXCoOrdinate(), loc.getYCoOrdinate());
	}

	public XYLocation getLocationOf(int val)
	{
	    int absPos = getPositionOf(val);
	    return new XYLocation(getXCoord(absPos), getYCoord(absPos));
	}

	public void moveGapRight()
	{
	    int gapPos = getGapPosition();
	    int x = getXCoord(gapPos);
	    int ypos = getYCoord(gapPos);
	    if (!(ypos == 2))
	    {
		int valueOnRight = getValueAt(x, ypos + 1);
		setValue(x, ypos, valueOnRight);
		setValue(x, ypos + 1, 0);
	    }
	}

	public void moveGapLeft()
	{
	    int gapPos = getGapPosition();
	    int x = getXCoord(gapPos);
	    int ypos = getYCoord(gapPos);
	    if (!(ypos == 0))
	    {
		int valueOnLeft = getValueAt(x, ypos - 1);
		setValue(x, ypos, valueOnLeft);
		setValue(x, ypos - 1, 0);
	    }
	}

	public void moveGapDown()
	{
	    int gapPos = getGapPosition();
	    int x = getXCoord(gapPos);
	    int y = getYCoord(gapPos);
	    if (!(x == 2))
	    {
		int valueOnBottom = getValueAt(x + 1, y);
		setValue(x, y, valueOnBottom);
		setValue(x + 1, y, 0);
	    }
	}

	public void moveGapUp()
	{
	    int gapPos = getGapPosition();
	    int x = getXCoord(gapPos);
	    int y = getYCoord(gapPos);
	    if (!(x == 0))
	    {
		int valueOnTop = getValueAt(x - 1, y);
		setValue(x, y, valueOnTop);
		setValue(x - 1, y, 0);
	    }
	}

	public List<XYLocation> getPositions()
	{
	    List<XYLocation> retVal = new List<XYLocation>();
	    for (int i = 0; i < 9; i++)
	    {
		int absPos = getPositionOf(i);
		XYLocation loc = new XYLocation(getXCoord(absPos),
				getYCoord(absPos));
		retVal.Add(loc);

	    }
	    return retVal;
	}

	public void setBoard(List<XYLocation> locs)
	{
	    int count = 0;
	    for (int i = 0; i < locs.Capacity; i++)
	    {
		XYLocation loc = locs[i];
		this.setValue(loc.getXCoOrdinate(), loc.getYCoOrdinate(), count);
		count = count + 1;
	    }
	}

	public bool canMoveGap(agent.Action where)
	{
	    bool retVal = true;
	    int absPos = getPositionOf(0);
	    if (where.Equals(LEFT))
		retVal = (getYCoord(absPos) != 0);
	    else if (where.Equals(RIGHT))
		retVal = (getYCoord(absPos) != 2);
	    else if (where.Equals(UP))
		retVal = (getXCoord(absPos) != 0);
	    else if (where.Equals(DOWN))
		retVal = (getXCoord(absPos) != 2);
	    return retVal;
	}

	public bool equals(Object o)
	{

	    if (this == o)
	    {
		return true;
	    }
	    if ((o == null) || (this.GetType() != o.GetType()))
	    {
		return false;
	    }
	    EightPuzzleBoard aBoard = (EightPuzzleBoard)o;

	    for (int i = 0; i < 8; i++)
	    {
		if (this.getPositionOf(i) != aBoard.getPositionOf(i))
		{
		    return false;
		}
	    }
	    return true;
	}
	
	public int hashCode()
	{
	    int result = 17;
	    for (int i = 0; i < 8; i++)
	    {
		int position = this.getPositionOf(i);
		result = 37 * result + position;
	    }
	    return result;
	}
		
	public String toString()
	{
	    String retVal = state[0] + " " + state[1] + " " + state[2] + "\n"
			    + state[3] + " " + state[4] + " " + state[5] + " " + "\n"
			    + state[6] + " " + state[7] + " " + state[8];
	    return retVal;
	}

	// PRIVATE METHODS

	/**
	 * Note: The graphic representation maps x values on row numbers (x-axis in
	 * vertical direction).
	 */
	private int getXCoord(int absPos)
	{
	    return absPos / 3;
	}

	/**
	 * Note: The graphic representation maps y values on column numbers (y-axis
	 * in horizontal direction).
	 */
	private int getYCoord(int absPos)
	{
	    return absPos % 3;
	}

	private int getAbsPosition(int x, int y)
	{
	    return x * 3 + y;
	}

	private int getValueAt(int x, int y)
	{
	    // refactor this use either case or a div/mod soln
	    return state[getAbsPosition(x, y)];
	}

	private int getGapPosition()
	{
	    return getPositionOf(0);
	}

	private int getPositionOf(int val)
	{
	    int retVal = -1;
	    for (int i = 0; i < 9; i++)
	    {
		if (state[i] == val)
		{
		    retVal = i;
		}
	    }
	    return retVal;
	}

	private void setValue(int x, int y, int val)
	{
	    int absPos = getAbsPosition(x, y);
	    state[absPos] = val;
	}
    }
}

================================================
FILE: aima-csharp/environment/eightpuzzle/EightPuzzleFunctionFactory.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.search.framework.problem;
using aima.core.util;

namespace aima.core.environment.eightpuzzle
{
    /**
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
    public class EightPuzzleFunctionFactory
    {
	private static ActionsFunction _actionsFunction = null;
	private static ResultFunction _resultFunction = null;

	public static ActionsFunction getActionsFunction()
	{
	    if (null == _actionsFunction)
	    {
		_actionsFunction = new EPActionsFunction();
	    }
	    return _actionsFunction;
	}

	public static ResultFunction getResultFunction()
	{
	    if (null == _resultFunction)
	    {
		_resultFunction = new EPResultFunction();
	    }
	    return _resultFunction;
	}

	private class EPActionsFunction : ActionsFunction
	{
	    public HashSet<Action> actions(System.Object state)
	    {
		EightPuzzleBoard board = (EightPuzzleBoard)state;

		HashSet<Action> actions = new HashSet<Action>();

		if (board.canMoveGap(EightPuzzleBoard.UP))
		{
		    actions.Add(EightPuzzleBoard.UP);
		}
		if (board.canMoveGap(EightPuzzleBoard.DOWN))
		{
		    actions.Add(EightPuzzleBoard.DOWN);
		}
		if (board.canMoveGap(EightPuzzleBoard.LEFT))
		{
		    actions.Add(EightPuzzleBoard.LEFT);
		}
		if (board.canMoveGap(EightPuzzleBoard.RIGHT))
		{
		    actions.Add(EightPuzzleBoard.RIGHT);
		}

		return actions;
	    }
	}

	private class EPResultFunction : ResultFunction
	{
	    public System.Object result(System.Object s, Action a)
	    {
		EightPuzzleBoard board = (EightPuzzleBoard) s;

		if (EightPuzzleBoard.UP.Equals(a)
			&& board.canMoveGap(EightPuzzleBoard.UP))
		{
		    EightPuzzleBoard newBoard = new EightPuzzleBoard(board);
		    newBoard.moveGapUp();
		    return newBoard;
		}
		else if (EightPuzzleBoard.DOWN.Equals(a)
		      && board.canMoveGap(EightPuzzleBoard.DOWN))
		{
		    EightPuzzleBoard newBoard = new EightPuzzleBoard(board);
		    newBoard.moveGapDown();
		    return newBoard;
		}
		else if (EightPuzzleBoard.LEFT.Equals(a)
		      && board.canMoveGap(EightPuzzleBoard.LEFT))
		{
		    EightPuzzleBoard newBoard = new EightPuzzleBoard(board);
		    newBoard.moveGapLeft();
		    return newBoard;
		}
		else if (EightPuzzleBoard.RIGHT.Equals(a)
		      && board.canMoveGap(EightPuzzleBoard.RIGHT))
		{
		    EightPuzzleBoard newBoard = new EightPuzzleBoard(board);
		    newBoard.moveGapRight();
		    return newBoard;
		}

		// The Action is not understood or is a NoOp
		// the result will be the current state.
		return s;
	    }
	}
    }
}

================================================
FILE: aima-csharp/environment/eightpuzzle/EightPuzzleGoalTest.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.search.framework.problem;

namespace aima.core.environment.eightpuzzle
{
    /**
     * @author Ravi Mohan
     * 
     */
    public class EightPuzzleGoalTest : GoalTest
    {
	EightPuzzleBoard goal = new EightPuzzleBoard(new int[] { 0, 1, 2, 3, 4, 5,
			6, 7, 8 });

	public bool isGoalState(Object state)
	{
	    EightPuzzleBoard board = (EightPuzzleBoard)state;
	    return board.Equals(goal);
	}
    }
}

================================================
FILE: aima-csharp/environment/eightpuzzle/ManhattanHeuristicFunction.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.search.framework;
using aima.core.util;

namespace aima.core.environment.eightpuzzle
{
    /**
     * @author Ravi Mohan
     * 
     */
    public class ManhattanHeuristicFunction : HeuristicFunction
    {
	public double h(Object state)
	{
	    EightPuzzleBoard board = (EightPuzzleBoard)state;
	    int retVal = 0;
	    for (int i = 1; i < 9; i++)
	    {
		XYLocation loc = board.getLocationOf(i);
		retVal += evaluateManhattanDistanceOf(i, loc);
	    }
	    return retVal;
	}

	public int evaluateManhattanDistanceOf(int i, XYLocation loc)
	{
	    int retVal = -1;
	    int xpos = loc.getXCoOrdinate();
	    int ypos = loc.getYCoOrdinate();
	    switch (i)
	    {

		case 1:
		    retVal = Math.Abs(xpos - 0) + Math.Abs(ypos - 1);
		    break;
		case 2:
		    retVal = Math.Abs(xpos - 0) + Math.Abs(ypos - 2);
		    break;
		case 3:
		    retVal = Math.Abs(xpos - 1) + Math.Abs(ypos - 0);
		    break;
		case 4:
		    retVal = Math.Abs(xpos - 1) + Math.Abs(ypos - 1);
		    break;
		case 5:
		    retVal = Math.Abs(xpos - 1) + Math.Abs(ypos - 2);
		    break;
		case 6:
		    retVal = Math.Abs(xpos - 2) + Math.Abs(ypos - 0);
		    break;
		case 7:
		    retVal = Math.Abs(xpos - 2) + Math.Abs(ypos - 1);
		    break;
		case 8:
		    retVal = Math.Abs(xpos - 2) + Math.Abs(ypos - 2);
		    break;

	    }
	    return retVal;
	}
    }
}

================================================
FILE: aima-csharp/environment/eightpuzzle/MisplacedTilleHeuristicFunction.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.search.framework;
using aima.core.util;

namespace aima.core.environment.eightpuzzle
{
    /**
     * @author Ravi Mohan
     * 
     */
    public class MisplacedTilleHeuristicFunction : HeuristicFunction
    {
	public double h(Object state)
	{
	    EightPuzzleBoard board = (EightPuzzleBoard)state;
	    return getNumberOfMisplacedTiles(board);
	}

	private int getNumberOfMisplacedTiles(EightPuzzleBoard board)
	{
	    int numberOfMisplacedTiles = 0;
	    if (!(board.getLocationOf(0).Equals(new XYLocation(0, 0))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(1).Equals(new XYLocation(0, 1))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(2).Equals(new XYLocation(0, 2))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(3).Equals(new XYLocation(1, 0))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(4).Equals(new XYLocation(1, 1))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(5).Equals(new XYLocation(1, 2))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(6).Equals(new XYLocation(2, 0))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(7).Equals(new XYLocation(2, 1))))
	    {
		numberOfMisplacedTiles++;
	    }
	    if (!(board.getLocationOf(8).Equals(new XYLocation(2, 2))))
	    {
		numberOfMisplacedTiles++;
	    }
	    return numberOfMisplacedTiles;
	}
    }
}

================================================
FILE: aima-csharp/environment/map/AdaptableHeuristicFunction.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.search.framework;

namespace aima.core.environment.map
{
    /**
     * This class extends heuristic functions in two ways: It maintains a goal and a
     * map to estimate distance to goal for states in route planning problems, and
     * it provides a method to adapt to different goals.
     * 
     * @author Ruediger Lunde
     */
    public abstract class AdaptableHeuristicFunction
    {
	/** The Current Goal. */
	protected Object goal;
	/** The map to be used for distance to goal estimates. */
	protected Map map;

	/**
	 * Modifies goal and map information and returns the modified heuristic
	 * function.
	 */
	public AdaptableHeuristicFunction adaptToGoal(Object goal, Map map)
	{
	    this.goal = goal;
	    this.map = map;
	    return this;
	}

	// when subclassing: Don't forget to implement the most important method
	// public double h(Object state)
    }
}

================================================
FILE: aima-csharp/environment/map/BidirectionalMapProblem.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.search.framework.problem;

namespace aima.core.environment.map
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class BidirectionalMapProblem : Problem, BidirectionalProblem
    {
	Map map;

	Problem reverseProblem;

	public BidirectionalMapProblem(Map map, String initialState, String goalState): this(map, initialState, goalState, new DefaultGoalTest(goalState))
	{
	    
	}

	public BidirectionalMapProblem(Map map, String initialState, String goalState, GoalTest goalTest) :  base(initialState, MapFunctionFactory.getActionsFunction(map), MapFunctionFactory.getResultFunction(),
			    goalTest, new MapStepCostFunction(map))
	{ 
	    this.map = map;

	    reverseProblem = new Problem(goalState, MapFunctionFactory.getReverseActionsFunction(map),
			    MapFunctionFactory.getResultFunction(), new DefaultGoalTest(initialState),
			    new MapStepCostFunction(map));
	}

	// START Interface BidrectionalProblem
	public Problem getOriginalProblem()
	{
	    return this;
	}

	public Problem getReverseProblem()
	{
	    return reverseProblem;
	}
	// END Interface BirectionalProblem
    }
}

================================================
FILE: aima-csharp/environment/map/DynAttributeNames.cs
================================================
using System;

namespace aima.core.environment.map
{
    /**
     * The AIMA framework uses dynamic attributes to make implementations of agents
     * and environments completely independent of each other. The disadvantage of
     * this concept is, that it's error-prone. This set of constants is designed to
     * make information exchange more reliable for map agents. Two kinds of
     * attributes are distinguished. Percept attributes are attached to percepts.
     * They are generated by the environment and read by by the agent.
     * EnvironmentState attributes are attached to the EnvironmentState of the
     * Environment.
     * 
     * @author Ruediger Lunde
     */
    public class DynAttributeNames
    {
	/**
	 * Name of a dynamic attribute, which contains the current location of the
	 * agent. Expected value type: String.
	 */
	public static readonly String AGENT_LOCATION = "location";
	/**
	 * Name of a dynamic attribute, which tells the agent where it is. Expected
	 * value type: String.
	 */
	public static readonly String PERCEPT_IN = "in";
    }
}

================================================
FILE: aima-csharp/environment/map/ExtendableMap.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.util;

namespace aima.core.environment.map
{
    /**
     * Implements a map with locations, distance labeled links between the
     * locations, straight line distances, and 2d-placement positions of locations.
     * Locations are represented by strings and travel distances by double values.
     * Locations and links can be added dynamically and removed after creation. This
     * enables to read maps from file or to modify them with respect to newly
     * obtained knowledge.
     * 
     * @author Ruediger Lunde
     */
    public class ExtendableMap : Map
    {
	/**
	 * Stores map data. Locations are represented as vertices and connections
	 * (links) as directed edges labeled with corresponding travel distances.
	 */
	private readonly LabeledGraph<String, Double> links;

	/** Stores xy-coordinates for each location. */
	private readonly Dictionary<String, Point2D> locationPositions;

	/** Creates an empty map. */
	public ExtendableMap()
	{
	    links = new LabeledGraph<String, Double>();
	    locationPositions = new Dictionary<String, Point2D>();
	}

	/** Removes everything. */
	public void clear()
	{
	    links.clear();
	    locationPositions.Clear();
	}

	/** Clears all connections but keeps location position informations. */
	public void clearLinks()
	{
	    links.clear();
	}

	/** Returns a list of all locations. */
	public List<String> getLocations()
	{
	    return links.getVertexLabels();
	}

	/** Checks whether the given string is the name of a location. */
	public bool isLocation(String str)
	{
	    return links.isVertexLabel(str);
	}

	/**
	 * Answers to the question: Where can I get, following one of the
	 * connections starting at the specified location?
	 */
	public List<String> getPossibleNextLocations(String location)
	{
	    List<String> result = links.getSuccessors(location);
	    result.Sort();
	    return result;
	}

	/**
	 * Answers to the question: From where can I reach a specified location,
	 * following one of the map connections? This implementation just calls
	 * {@link #getPossibleNextLocations(String)} as the underlying graph structure
	 * cannot be traversed efficiently in reverse order.
	 */
	public List<String> getPossiblePrevLocations(String location)
	{
	    return getPossibleNextLocations(location);
	}

	/**
	 * Returns the travel distance between the two specified locations if they
	 * are linked by a connection and null otherwise.
	 */
	public Double getDistance(String fromLocation, String toLocation)
	{
	    return links.get(fromLocation, toLocation);
	}

	/** Adds a one-way connection to the map. */
	public void addUnidirectionalLink(String fromLocation, String toLocation, Double distance)
	{
	    links.set(fromLocation, toLocation, distance);
	}

	/**
	 * Adds a connection which can be traveled in both direction. Internally,
	 * such a connection is represented as two one-way connections.
	 */
	public void addBidirectionalLink(String fromLocation, String toLocation, Double distance)
	{
	    links.set(fromLocation, toLocation, distance);
	    links.set(toLocation, fromLocation, distance);
	}

	/**
	 * Returns a location which is selected by random.
	 */
	public String randomlyGenerateDestination()
	{
	    return Util.selectRandomlyFromList(getLocations());
	}

	/** Removes a one-way connection. */
	public void removeUnidirectionalLink(String fromLocation, String toLocation)
	{
	    links.remove(fromLocation, toLocation);
	}

	/** Removes the two corresponding one-way connections. */
	public void removeBidirectionalLink(String fromLocation, String toLocation)
	{
	    links.remove(fromLocation, toLocation);
	    links.remove(toLocation, fromLocation);
	}

	/**
	 * Defines the position of a location as with respect to an orthogonal
	 * coordinate system.
	 */
	public void setPosition(String loc, double x, double y)
	{
	    locationPositions.Add(loc, new Point2D(x, y));
	}

	/**
	 * Defines the position of a location within the map.Using this method, one
	 * location should be selected as reference position (<code>dist= 0 </ code >
	 *and < code > dir = 0 </ code >) and all the other location should be placed
	 * relative to it.
	 * 
	 * @param loc
	 *            location name
	 * @param dist
	 *            distance to a reference position
	 * @param dir
	 *            bearing (compass direction) in which the location is seen from
	 *            the reference position
	 */
	public void setDistAndDirToRefLocation(String loc, double dist, int dir)
	{
	    Point2D coords = new Point2D(-Math.Sin(dir * Math.PI / 180.0) * dist, Math.Cos(dir * Math.PI / 180.0) * dist);
	    links.addVertex(loc);
	    locationPositions.Add(loc, coords);
	}

	/**
	 * Returns the position of the specified location as with respect to an
	 * orthogonal coordinate system.
	 */
	public Point2D getPosition(String loc)
	{
	    return locationPositions[loc];
	}
    }
}

================================================
FILE: aima-csharp/environment/map/Map.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.util;

namespace aima.core.environment.map
{
    /**
     * Provides a general interface for maps.
     * 
     * @author Ruediger Lunde
     */
    public interface Map
    {
	/** Returns a list of all locations. */
	List<String> getLocations();

	/**
	 * Answers to the question: Where can I get, following one of the
	 * connections starting at the specified location?
	 */
	List<String> getPossibleNextLocations(String location);

	/**
	 * Answers to the question: From where can I reach a specified location,
	 * following one of the map connections?
	 */
	List<String> getPossiblePrevLocations(String location);

	/**
	 * Returns the travel distance between the two specified locations if they
	 * are linked by a connection and null otherwise.
	 */
	Double getDistance(String fromLocation, String toLocation);

	/**
	 * Returns the position of the specified location. The position is
	 * represented by two coordinates, e.g. latitude and longitude values.
	 */
	Point2D getPosition(String loc);

	/**
	 * Returns a location which is selected by random.
	 */
	String randomlyGenerateDestination();
    }
}

================================================
FILE: aima-csharp/environment/map/MapAgent.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent;
using aima.core.agent.impl;
using aima.core.search.framework;
using aima.core.search.framework.problem;

namespace aima.core.environment.map
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class MapAgent : SimpleProblemSolvingAgent
    {
	protected Map map = null;
	protected DynamicState state = new DynamicState();

	private EnvironmentViewNotifier notifier = null;
	private Search _search = null;
	private String[] goals = null;
	private int goalTestPos = 0;

	public MapAgent(Map map, EnvironmentViewNotifier notifier, Search search)
	{
	    this.map = map;
	    this.notifier = notifier;
	    this._search = search;
	}

	public MapAgent(Map map, EnvironmentViewNotifier notifier, Search search,
			int maxGoalsToFormulate): base(maxGoalsToFormulate)
	{	    
	    this.map = map;
	    this.notifier = notifier;
	    this._search = search;
	}

	public MapAgent(Map map, EnvironmentViewNotifier notifier, Search search,
			String[] goals): base(goals.Length)
	{	    
	    this.map = map;
	    this.notifier = notifier;
	    this._search = search;
	    this.goals = new String[goals.Length];
	    Array.Copy(goals, 0, this.goals, 0, goals.Length);
	}

	// PROTECTED METHODS
	
	protected override State updateState(Percept p)
	{
	    DynamicPercept dp = (DynamicPercept)p;

	    state.setAttribute(DynAttributeNames.AGENT_LOCATION,
			    dp.getAttribute(DynAttributeNames.PERCEPT_IN));
	    return state;
	}

	protected override Object formulateGoal()
	{
	    Object goal = null;
	    if (null == goals)
	    {
		goal = map.randomlyGenerateDestination();
	    }
	    else
	    {
		goal = goals[goalTestPos];
		goalTestPos++;
	    }
	    notifier.notifyViews("CurrentLocation=In("
			    + state.getAttribute(DynAttributeNames.AGENT_LOCATION)
			    + "), Goal=In(" + goal + ")");
	    return goal;
	}

	protected override Problem formulateProblem(Object goal)
	{
	    return new BidirectionalMapProblem(map,
			    (String)state.getAttribute(DynAttributeNames.AGENT_LOCATION),
			    (String)goal);
	}
	
	protected override List<agent.Action> search(Problem problem)
	{
	    List<agent.Action> actions = new List<agent.Action>();
	    try
	    {
		List<agent.Action> sactions = _search.search(problem);
		foreach (agent.Action action in sactions)
		{
		    actions.Add(action);
		}
	    }
	    catch (Exception ex)
	    {
		System.Diagnostics.Debug.WriteLine(ex.ToString());
	    }
	    return actions;
	}

	protected override void notifyViewOfMetrics()
	{
	    HashSet<String> keys = _search.getMetrics().keySet();
	    foreach (String key in keys)
	    {
		notifier.notifyViews("METRIC[" + key + "]="
				+ _search.getMetrics().get(key));
	    }
	}

    }
}

================================================
FILE: aima-csharp/environment/map/MapEnvironment.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.agent.impl;

namespace aima.core.environment.map
{
    /**
     * Represents the environment a MapAgent can navigate.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class MapEnvironment : AbstractEnvironment
    {
	private Map map = null;
	private MapEnvironmentState state = new MapEnvironmentState();

	public MapEnvironment(Map map)
	{
	    this.map = map;
	}

	public void addAgent(Agent a, string startLocation)
	{
	    // Ensure the agent state information is tracked before
	    // adding to super, as super will notify the registered
	    // EnvironmentViews that is was added.
	    state.setAgentLocationAndTravelDistance(a, startLocation, 0.0);
	    base.addAgent(a);
	}

	public string getAgentLocation(Agent a)
	{
	    return state.getAgentLocation(a);
	}

	public double getAgentTravelDistance(Agent a)
	{
	    return state.getAgentTravelDistance(a);
	}

	public override EnvironmentState getCurrentState()
	{
	    return state;
	}

	public override EnvironmentState executeAction(Agent agent, Action a)
	{

	    if (!a.isNoOp())
	    {
		MoveToAction act = (MoveToAction)a;

		string currLoc = getAgentLocation(agent);
		double distance = map.getDistance(currLoc, act.getToLocation());
		if (distance != null)
		{
		    double currTD = getAgentTravelDistance(agent);
		    state.setAgentLocationAndTravelDistance(agent,
				    act.getToLocation(), currTD + distance);
		}
	    }
	    return state;
	}

	public override Percept getPerceptSeenBy(Agent anAgent)
	{
	    return new DynamicPercept(DynAttributeNames.PERCEPT_IN,
			    getAgentLocation(anAgent));
	}

	public Map getMap()
	{
	    return map;
	}
    }
}

================================================
FILE: aima-csharp/environment/map/MapEnvironmentState.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.util;

namespace aima.core.environment.map
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class MapEnvironmentState : EnvironmentState
    {
	private Dictionary<Agent, Pair<string, double>> agentLocationAndTravelDistance = new Dictionary<Agent, Pair<string, double>>();

	public MapEnvironmentState()
	{

	}

	public string getAgentLocation(Agent a)
	{
	    Pair<string, double> locAndTDistance = agentLocationAndTravelDistance[a];
	    if (null == locAndTDistance)
	    {
		return null;
	    }
	    return locAndTDistance.getFirst();
	}

	public double getAgentTravelDistance(Agent a)
	{
	    Pair<string, double> locAndTDistance = agentLocationAndTravelDistance[a];
	    if (null == locAndTDistance)
	    {
		return double.MinValue;
	    }
	    return locAndTDistance.getSecond();
	}

	public void setAgentLocationAndTravelDistance(Agent a, string location,
			double travelDistance)
	{
	    agentLocationAndTravelDistance.Add(a, new Pair<string, double>(
			    location, travelDistance));
	}
    }
}

================================================
FILE: aima-csharp/environment/map/MapFunctionFactory.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.agent.impl;
using aima.core.search.framework;
using aima.core.search.framework.problem;
using aima.core.util;

namespace aima.core.environment.map
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class MapFunctionFactory
    {
	private static ResultFunction resultFunction;
	private static PerceptToStateFunction perceptToStateFunction;

	public static ActionsFunction getActionsFunction(Map map)
	{
	    return new MapActionsFunction(map, false);
	}

	public static ActionsFunction getReverseActionsFunction(Map map)
	{
	    return new MapActionsFunction(map, true);
	}

	public static ResultFunction getResultFunction()
	{
	    if (null == resultFunction)
	    {
		resultFunction = new MapResultFunction();
	    }
	    return resultFunction;
	}

	private class MapActionsFunction : ActionsFunction
	{
	    private Map map = null;
	    private bool reverseMode;

	    public MapActionsFunction(Map map, bool reverseMode)
	    {
		this.map = map;
		this.reverseMode = reverseMode;
	    }

	    public HashSet<Action> actions(System.Object state)
	    {
		HashSet<Action> actions = new HashSet<Action>();
		System.String location = state.ToString();

		List<System.String> linkedLocations = reverseMode ? map.getPossiblePrevLocations(location)
					: map.getPossibleNextLocations(location);
		foreach (System.String linkLoc in linkedLocations)
		{
		    actions.Add(new MoveToAction(linkLoc));
		}
		return actions;
	    }
	}

	public static PerceptToStateFunction getPerceptToStateFunction()
	{
	    if (null == perceptToStateFunction)
	    {
		perceptToStateFunction = new MapPerceptToStateFunction();
	    }
	    return perceptToStateFunction;
	}

	private class MapResultFunction : ResultFunction
	{
	    public MapResultFunction()
	    {
	    }

	    public System.Object result(System.Object s, Action a)
	    {

		if (a is MoveToAction)
		{
		    MoveToAction mta = (MoveToAction)a;

		    return mta.getToLocation();
		}

		// The Action is not understood or is a NoOp
		// the result will be the current state.
		return s;
	    }
	}

	private class MapPerceptToStateFunction :
		PerceptToStateFunction
	{
	    public System.Object getState(Percept p)
	    {
		return ((DynamicPercept)p)
			.getAttribute(DynAttributeNames.PERCEPT_IN);
	    }
	}
    }
}

================================================
FILE: aima-csharp/environment/map/MapStepCostFunction.cs
================================================
using System.Collections.Generic;
using aima.core.agent;
using aima.core.search.framework.problem;

namespace aima.core.environment.map
{
    /**
     * Implementation of StepCostFunction interface that uses the distance between
     * locations to calculate the cost in addition to a constant cost, so that it
     * may be used in conjunction with a Uniform-cost search.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class MapStepCostFunction : StepCostFunction
    {
	private Map map = null;
		
	// Used by Uniform-cost search to ensure every step is greater than or equal
	// to some small positive constant
	private static double constantCost = 1.0;

	public MapStepCostFunction(Map map)
	{
	    this.map = map;
	}

	//
	// START-StepCostFunction
	public double c(object fromCurrentState, Action action, object toNextState)
	{

	    string fromLoc = fromCurrentState.ToString();
	    string toLoc = toNextState.ToString();

	    double distance = map.getDistance(fromLoc, toLoc);

	    if (distance == null || distance <= 0)
	    {
		return constantCost;
	    }

	    return distance;
	}

	// END-StepCostFunction
    }
}

================================================
FILE: aima-csharp/environment/map/MoveToAction.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.agent.impl;

namespace aima.core.environment.map
{ 
    public class MoveToAction : DynamicAction
    {
	public const String ATTRIBUTE_MOVE_TO_LOCATION = "location";

	public MoveToAction(String location) : base("moveTo")
	{
	    setAttribute(ATTRIBUTE_MOVE_TO_LOCATION, location);
	}

	public String getToLocation()
	{
	    return (String)getAttribute(ATTRIBUTE_MOVE_TO_LOCATION);
	}
    }
}


================================================
FILE: aima-csharp/environment/map/Scenario.cs
================================================
using System;

namespace aima.core.environment.map
{
    /**
     * A scenario specifies an environment, the agent's knowledge about the
     * environment, and the agents initial location. It can be used to specify
     * settings for route planning agent applications.
     * 
     * @author Ruediger Lunde
     */
    public class Scenario
    {
	/**
	 * A map-based environment. Note that the contained map must be of type
	 * {@link ExtendableMap}.
	 */
	private readonly MapEnvironment env;
	/** A map reflecting the knowledge of the agent about the environment. */
	private readonly Map agentMap;
	/** Initial location of the agent. */
	private readonly String initAgentLoc;

	/**
	 * Creates a scenario.
	 * 
	 * @param env
	 *            a map-based environment. Note that the contained map must be
	 *            of type {@link ExtendableMap}
	 * @param agentMap
	 *            a map reflecting the knowledge of the agent about the
	 *            environment
	 * @param agentLoc
	 *            initial location of the agent
	 */
	public Scenario(MapEnvironment env, Map agentMap, String agentLoc)
	{
	    this.agentMap = agentMap;
	    this.env = env;
	    this.initAgentLoc = agentLoc;
	}

	public MapEnvironment getEnv()
	{
	    return env;
	}

	public Map getEnvMap()
	{
	    return env.getMap();
	}

	public Map getAgentMap()
	{
	    return agentMap;
	}

	public String getInitAgentLocation()
	{
	    return initAgentLoc;
	}
    }
}

================================================
FILE: aima-csharp/environment/map/SimplifiedRoadMapOfAustralia.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.environment.map
{
    /**
     * Represents a simplified road map of Australia. The initialization method is
     * declared static. So it can also be used to initialize other specialized
     * subclasses of {@link ExtendableMap} with road map data from Australia. The
     * data was extracted from a class developed by Felix Knittel.
     * 
     * @author Ruediger Lunde
     */
    public class SimplifiedRoadMapOfAustralia : ExtendableMap
    {
	public SimplifiedRoadMapOfAustralia()
	{
	    initMap(this);
	}

	// Locations
	public const String ADELAIDE = "Adelaide";
	public const String ALBANY = "Albany";
	public const String ALICE_SPRINGS = "AliceSprings";
	public const String BRISBANE = "Brisbane";
	public const String BROKEN_HILL = "BrokenHill";
	public const String BROOME = "Broome";
	public const String CAIRNS = "Cairns";
	public const String CAMARVON = "Camarvon";
	public const String CANBERRA = "Canberra";
	public const String CHARLEVILLE = "Charleville";
	public const String COOBER_PEDY = "CooberPedy";
	public const String DARWIN = "Darwin";
	public const String DUBBO = "Dubbo";
	public const String ESPERANCE = "Esperance";
	public const String GERALDTON = "Geraldton";
	public const String HALLS_CREEK = "HallsCreek";
	public const String HAY = "Hay";
	public const String KALGOORLIE = "Kalgoorlie";
	public const String KATHERINE = "Katherine";
	public const String LAKES_ENTRANCE = "LakesEntrance";
	public const String LONGREACH = "Longreach";
	public const String MACKAY = "Mackay";
	public const String MELBOURNE = "Melbourne";
	public const String MOUNT_GAMBIER = "MountGambier";
	public const String MT_ISA = "MtIsa";
	public const String NEWCASTLE = "Newcastle";
	public const String NORSEMAN = "Norseman";
	public const String NYNGAN = "Nyngan";
	public const String PERTH = "Perth";
	public const String PORT_AUGUSTA = "PortAugusta";
	public const String PORT_HEDLAND = "PortHedland";
	public const String PORT_LINCOLN = "PortLincoln";
	public const String PORT_MACQUARIE = "PortMacquarie";
	public const String ROCKHAMPTON = "Rockhampton";
	public const String SYDNEY = "Sydney";
	public const String TAMWORTH = "Tamworth";
	public const String TENNANT_CREEK = "TennantCreek";
	public const String TOWNSVILLE = "Townsville";
	public const String WAGGA_WAGGA = "WaggaWagga";
	public const String WARNAMBOOL = "Warnambool";
	public const String WYNDHAM = "Wyndham";

	/**
         * Initializes a map with a simplified road map of Australia.
         */
	public static void initMap(ExtendableMap map)
	{
	    map.clear();
	    // Add links
	    // Distances from http://maps.google.com
	    map.addBidirectionalLink(PERTH, ALBANY, 417.0);
	    map.addBidirectionalLink(PERTH, KALGOORLIE, 593.0);
	    map.addBidirectionalLink(PERTH, GERALDTON, 424.0);
	    map.addBidirectionalLink(PERTH, PORT_HEDLAND, 1637.0);
	    map.addBidirectionalLink(ALBANY, ESPERANCE, 478.0);
	    map.addBidirectionalLink(KALGOORLIE, NORSEMAN, 187.0);
	    map.addBidirectionalLink(ESPERANCE, NORSEMAN, 204.0);
	    map.addBidirectionalLink(NORSEMAN, PORT_AUGUSTA, 1668.0);
	    map.addBidirectionalLink(GERALDTON, CAMARVON, 479.0);
	    map.addBidirectionalLink(CAMARVON, PORT_HEDLAND, 872.0);
	    map.addBidirectionalLink(PORT_HEDLAND, BROOME, 589.0);
	    map.addBidirectionalLink(BROOME, HALLS_CREEK, 685.0);
	    map.addBidirectionalLink(HALLS_CREEK, WYNDHAM, 370.0);
	    map.addBidirectionalLink(HALLS_CREEK, KATHERINE, 874.0);
	    map.addBidirectionalLink(WYNDHAM, KATHERINE, 613.0);
	    map.addBidirectionalLink(KATHERINE, DARWIN, 317.0);
	    map.addBidirectionalLink(KATHERINE, TENNANT_CREEK, 673.0);
	    map.addBidirectionalLink(TENNANT_CREEK, MT_ISA, 663.0);
	    map.addBidirectionalLink(TENNANT_CREEK, ALICE_SPRINGS, 508.0);
	    map.addBidirectionalLink(ALICE_SPRINGS, COOBER_PEDY, 688.0);
	    map.addBidirectionalLink(COOBER_PEDY, PORT_AUGUSTA, 539.0);
	    map.addBidirectionalLink(MT_ISA, TOWNSVILLE, 918.0);
	    map.addBidirectionalLink(TOWNSVILLE, CAIRNS, 346.0);
	    map.addBidirectionalLink(MT_ISA, LONGREACH, 647.0);
	    map.addBidirectionalLink(TOWNSVILLE, MACKAY, 388.0);
	    map.addBidirectionalLink(MACKAY, ROCKHAMPTON, 336.0);
	    map.addBidirectionalLink(LONGREACH, ROCKHAMPTON, 687.0);
	    map.addBidirectionalLink(ROCKHAMPTON, BRISBANE, 616.0);
	    map.addBidirectionalLink(LONGREACH, CHARLEVILLE, 515.0);
	    map.addBidirectionalLink(CHARLEVILLE, BRISBANE, 744.0);
	    map.addBidirectionalLink(CHARLEVILLE, NYNGAN, 657.0);
	    map.addBidirectionalLink(NYNGAN, BROKEN_HILL, 588.0);
	    map.addBidirectionalLink(BROKEN_HILL, PORT_AUGUSTA, 415.0);
	    map.addBidirectionalLink(NYNGAN, DUBBO, 166.0);
	    map.addBidirectionalLink(DUBBO, BRISBANE, 860.0);
	    map.addBidirectionalLink(DUBBO, SYDNEY, 466.0);
	    map.addBidirectionalLink(BRISBANE, TAMWORTH, 576.0);
	    map.addBidirectionalLink(BRISBANE, PORT_MACQUARIE, 555.0);
	    map.addBidirectionalLink(PORT_MACQUARIE, NEWCASTLE, 245.0);
	    map.addBidirectionalLink(TAMWORTH, NEWCASTLE, 284.0);
	    map.addBidirectionalLink(NEWCASTLE, SYDNEY, 159.0);
	    map.addBidirectionalLink(SYDNEY, CANBERRA, 287.0);
	    map.addBidirectionalLink(CANBERRA, WAGGA_WAGGA, 243.0);
	    map.addBidirectionalLink(DUBBO, WAGGA_WAGGA, 400.0);
	    map.addBidirectionalLink(SYDNEY, LAKES_ENTRANCE, 706.0);
	    map.addBidirectionalLink(LAKES_ENTRANCE, MELBOURNE, 317.0);
	    map.addBidirectionalLink(WAGGA_WAGGA, MELBOURNE, 476.0);
	    map.addBidirectionalLink(WAGGA_WAGGA, HAY, 269.0);
	    map.addBidirectionalLink(MELBOURNE, WARNAMBOOL, 269.0);
	    map.addBidirectionalLink(WARNAMBOOL, MOUNT_GAMBIER, 185.0);
	    map.addBidirectionalLink(MOUNT_GAMBIER, ADELAIDE, 449.0);
	    map.addBidirectionalLink(HAY, ADELAIDE, 655.0);
	    map.addBidirectionalLink(PORT_AUGUSTA, ADELAIDE, 306.0);
	    map.addBidirectionalLink(MELBOURNE, ADELAIDE, 728.0);
	    map.addBidirectionalLink(PORT_AUGUSTA, PORT_LINCOLN, 341.0);

	    // Locations coordinates
	    // Alice Springs is taken as central point with coordinates (0|0)
	    // Therefore x and y coordinates refer to Alice Springs. Note that
	    // the coordinates are not very precise and partly modified to
	    // get a more real shape of Australia.
	    map.setPosition(ADELAIDE, 417, 1289);
	    map.setPosition(ALBANY, -1559, 1231);
	    map.setPosition(ALICE_SPRINGS, 0, 0);
	    map.setPosition(BRISBANE, 1882, 415);
	    map.setPosition(BROKEN_HILL, 709, 873);
	    map.setPosition(BROOME, -1189, -645);
	    map.setPosition(CAIRNS, 1211, -791);
	    map.setPosition(CAMARVON, -2004, -34);
	    map.setPosition(CANBERRA, 1524, 1189);
	    map.setPosition(CHARLEVILLE, 1256, 268);
	    map.setPosition(COOBER_PEDY, 86, 593);
	    map.setPosition(DARWIN, -328, -1237);
	    map.setPosition(DUBBO, 1474, 881);
	    map.setPosition(ESPERANCE, -1182, 1132);
	    map.setPosition(GERALDTON, -1958, 405);
	    map.setPosition(HALLS_CREEK, -630, -624);
	    map.setPosition(HAY, 985, 1143);
	    map.setPosition(KALGOORLIE, -1187, 729);
	    map.setPosition(KATHERINE, -183, -1025);
	    map.setPosition(LAKES_ENTRANCE, 1412, 1609);
	    map.setPosition(LONGREACH, 1057, -49);
	    map.setPosition(MACKAY, 1553, -316);
	    map.setPosition(MELBOURNE, 1118, 1570);
	    map.setPosition(MOUNT_GAMBIER, 602, 1531);
	    map.setPosition(MT_ISA, 563, -344);
	    map.setPosition(NEWCASTLE, 1841, 979);
	    map.setPosition(NORSEMAN, -1162, 881);
	    map.setPosition(NYNGAN, 1312, 781);
	    map.setPosition(PERTH, -1827, 814);
	    map.setPosition(PORT_AUGUSTA, 358, 996);
	    map.setPosition(PORT_HEDLAND, -1558, -438);
	    map.setPosition(PORT_LINCOLN, 169, 1205);
	    map.setPosition(PORT_MACQUARIE, 1884, 849);
	    map.setPosition(ROCKHAMPTON, 1693, -59);
	    map.setPosition(SYDNEY, 1778, 1079);
	    map.setPosition(TAMWORTH, 1752, 722);
	    map.setPosition(TENNANT_CREEK, 30, -445);
	    map.setPosition(TOWNSVILLE, 1318, -520);
	    map.setPosition(WAGGA_WAGGA, 1322, 1125);
	    map.setPosition(WARNAMBOOL, 761, 1665);
	    map.setPosition(WYNDHAM, -572, -932);
	}
    }
}

================================================
FILE: aima-csharp/environment/map/SimplifiedRoadMapOfPartOfRomania.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.environment.map
{
    /**
     * Represents a simplified road map of Romania. The initialization method is
     * declared static. So it can also be used to initialize other specialized
     * subclasses of {@link ExtendableMap} with road map data from Romania. Location
     * names, road distances and directions have been extracted from Artificial
     * Intelligence A Modern Approach (2nd Edition), Figure 3.2, page 63. The
     * straight-line distances to Bucharest have been taken from Artificial
     * Intelligence A Modern Approach (2nd Edition), Figure 4.1, page 95.
     * 
     * @author Ruediger Lunde
     */
    public class SimplifiedRoadMapOfPartOfRomania : ExtendableMap
    {
	public SimplifiedRoadMapOfPartOfRomania()
	{
	    initMap(this);
	}

	// The different locations in the simplified map of part of Romania
	public const String ORADEA = "Oradea";
	public const String ZERIND = "Zerind";
	public const String ARAD = "Arad";
	public const String TIMISOARA = "Timisoara";
	public const String LUGOJ = "Lugoj";
	public const String MEHADIA = "Mehadia";
	public const String DOBRETA = "Dobreta";
	public const String SIBIU = "Sibiu";
	public const String RIMNICU_VILCEA = "RimnicuVilcea";
	public const String CRAIOVA = "Craiova";
	public const String FAGARAS = "Fagaras";
	public const String PITESTI = "Pitesti";
	public const String GIURGIU = "Giurgiu";
	public const String BUCHAREST = "Bucharest";
	public const String NEAMT = "Neamt";
	public const String URZICENI = "Urziceni";
	public const String IASI = "Iasi";
	public const String VASLUI = "Vaslui";
	public const String HIRSOVA = "Hirsova";
	public const String EFORIE = "Eforie";

	/**
         * Initializes a map with a simplified road map of Romania.
         */
	public static void initMap(ExtendableMap map)
	{
	    // mapOfRomania
	    map.clear();
	    map.addBidirectionalLink(ORADEA, ZERIND, 71.0);
	    map.addBidirectionalLink(ORADEA, SIBIU, 151.0);
	    map.addBidirectionalLink(ZERIND, ARAD, 75.0);
	    map.addBidirectionalLink(ARAD, TIMISOARA, 118.0);
	    map.addBidirectionalLink(ARAD, SIBIU, 140.0);
	    map.addBidirectionalLink(TIMISOARA, LUGOJ, 111.0);
	    map.addBidirectionalLink(LUGOJ, MEHADIA, 70.0);
	    map.addBidirectionalLink(MEHADIA, DOBRETA, 75.0);
	    map.addBidirectionalLink(DOBRETA, CRAIOVA, 120.0);
	    map.addBidirectionalLink(SIBIU, FAGARAS, 99.0);
	    map.addBidirectionalLink(SIBIU, RIMNICU_VILCEA, 80.0);
	    map.addBidirectionalLink(RIMNICU_VILCEA, PITESTI, 97.0);
	    map.addBidirectionalLink(RIMNICU_VILCEA, CRAIOVA, 146.0);
	    map.addBidirectionalLink(CRAIOVA, PITESTI, 138.0);
	    map.addBidirectionalLink(FAGARAS, BUCHAREST, 211.0);
	    map.addBidirectionalLink(PITESTI, BUCHAREST, 101.0);
	    map.addBidirectionalLink(GIURGIU, BUCHAREST, 90.0);
	    map.addBidirectionalLink(BUCHAREST, URZICENI, 85.0);
	    map.addBidirectionalLink(NEAMT, IASI, 87.0);
	    map.addBidirectionalLink(URZICENI, VASLUI, 142.0);
	    map.addBidirectionalLink(URZICENI, HIRSOVA, 98.0);
	    map.addBidirectionalLink(IASI, VASLUI, 92.0);
	    // addBidirectionalLink(VASLUI - already all linked
	    map.addBidirectionalLink(HIRSOVA, EFORIE, 86.0);
	    // addBidirectionalLink(EFORIE - already all linked

	    // distances and directions
	    // reference location: Bucharest
	    map.setDistAndDirToRefLocation(ARAD, 366, 117);
	    map.setDistAndDirToRefLocation(BUCHAREST, 0, 360);
	    map.setDistAndDirToRefLocation(CRAIOVA, 160, 74);
	    map.setDistAndDirToRefLocation(DOBRETA, 242, 82);
	    map.setDistAndDirToRefLocation(EFORIE, 161, 282);
	    map.setDistAndDirToRefLocation(FAGARAS, 176, 142);
	    map.setDistAndDirToRefLocation(GIURGIU, 77, 25);
	    map.setDistAndDirToRefLocation(HIRSOVA, 151, 260);
	    map.setDistAndDirToRefLocation(IASI, 226, 202);
	    map.setDistAndDirToRefLocation(LUGOJ, 244, 102);
	    map.setDistAndDirToRefLocation(MEHADIA, 241, 92);
	    map.setDistAndDirToRefLocation(NEAMT, 234, 181);
	    map.setDistAndDirToRefLocation(ORADEA, 380, 131);
	    map.setDistAndDirToRefLocation(PITESTI, 100, 116);
	    map.setDistAndDirToRefLocation(RIMNICU_VILCEA, 193, 115);
	    map.setDistAndDirToRefLocation(SIBIU, 253, 123);
	    map.setDistAndDirToRefLocation(TIMISOARA, 329, 105);
	    map.setDistAndDirToRefLocation(URZICENI, 80, 247);
	    map.setDistAndDirToRefLocation(VASLUI, 199, 222);
	    map.setDistAndDirToRefLocation(ZERIND, 374, 125);
	}
    }
}

================================================
FILE: aima-csharp/environment/map/StraightLineDistanceHeuristicFunction.cs
================================================
using System;
using aima.core.util;

namespace aima.core.environment.map
{
    /**
     * @author Ruediger Lunde
     */
    public class StraightLineDistanceHeuristicFunction : AdaptableHeuristicFunction
    {
	public StraightLineDistanceHeuristicFunction(Object goal, Map map)
	{
	    this.goal = goal;
	    this.map = map;
	}

	public double h(Object state)
	{
	    Double result = 0.0;
	    Point2D pt1 = map.getPosition((String)state);
	    Point2D pt2 = map.getPosition((String)goal);
	    if (pt1 != null && pt2 != null)
	    {
		result = pt1.distance(pt2);
	    }
	    return result;
	}
    }
}

================================================
FILE: aima-csharp/environment/wumpusworld/AgentPercept.cs
================================================
using System.Collections.Generic;
using aima.core.agent;

namespace aima.core.environment.wumpusworld
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): page 237.<br>
     * <br>
     * The agent has five sensors, each of which gives a single bit of information:
     * <ul>
     * <li>In the square containing the wumpus and in the directly (not diagonally)
     * adjacent squares, the agent will perceive a Stench.</li>
     * <li>In the squares directly adjacent to a pit, the agent will perceive a
     * Breeze.</li>
     * <li>In the square where the gold is, the agent will perceive a Glitter.</li>
     * <li>When an agent walks into a wall, it will perceive a Bump.</li>
     * <li>When the wumpus is killed, it emits a woeful Scream that can be perceived
     * anywhere in the cave.</li>
     * </ul>
     * 
     * @author Federico Baron
     * @author Alessandro Daniele
     * @author Ciaran O'Reilly
     */
    public class AgentPercept : Percept
    {
	private bool stench;
	private bool breeze;
	private bool glitter;
	private bool bump;
	private bool scream;

	/**
	 * Default Constructor. All sensor inputs are considered false.
	 */
	public AgentPercept()
	{
	    setStench(false);
	    setBreeze(false);
	    setGlitter(false);
	    setBump(false);
	    setScream(false);
	}

	/**
	 * Constructor with all 5 sensor inputs explicitly set.
	 * 
	 * @param stench
	 * @param breeze
	 * @param glitter
	 * @param bump
	 * @param scream
	 */
	public AgentPercept(bool stench, bool breeze, bool glitter,
			bool bump, bool scream)
	{
	    setStench(stench);
	    setBreeze(breeze);
	    setGlitter(glitter);
	    setBump(bump);
	    setScream(scream);
	}

	public bool isStench()
	{
	    return stench;
	}

	public void setStench(bool stench)
	{
	    this.stench = stench;
	}

	public bool isBreeze()
	{
	    return breeze;
	}

	public void setBreeze(bool breeze)
	{
	    this.breeze = breeze;
	}

	public bool isGlitter()
	{
	    return glitter;
	}

	public void setGlitter(bool glitter)
	{
	    this.glitter = glitter;
	}

	public bool isBump()
	{
	    return bump;
	}

	public void setBump(bool bump)
	{
	    this.bump = bump;
	}

	public bool isScream()
	{
	    return scream;
	}

	public void setScream(bool scream)
	{
	    this.scream = scream;
	}

	public string toString()
	{
	    return "[" + ((stench) ? "Stench" : "None") + ", "
			      + ((breeze) ? "Breeze" : "None") + ", "
			      + ((glitter) ? "Glitter" : "None") + ", "
			      + ((bump) ? "Bump" : "None") + ", "
			      + ((scream) ? "Scream" : "None") + "]";
	}
    }
}


================================================
FILE: aima-csharp/environment/wumpusworld/AgentPosition.cs
================================================
using System;

namespace aima.core.environment.wumpusworld
{
    internal class AgentPosition
    {
        internal int getX()
        {
            throw new NotImplementedException();
        }

        internal int getY()
        {
            throw new NotImplementedException();
        }
    }
}

================================================
FILE: aima-csharp/environment/wumpusworld/ManhattanHeuristicFunction.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.search.framework;

namespace aima.core.environment.wumpusworld
{
    /**
     * Heuristic for calculating the Manhattan distance between two rooms within a Wumpus World cave.
     * 
     * @author Federico Baron
     * @author Alessandro Daniele
     * @author Ciaran O'Reilly
     */
    public class ManhattanHeuristicFunction : HeuristicFunction
    {
	List<Room> goals = new List<Room>();

	public ManhattanHeuristicFunction(HashSet<Room> goals)
	{
	    this.goals.AddRange(goals);
	}

	public double h(Object state)
	{
	    AgentPosition pos = (AgentPosition)state;
	    int nearestGoalDist = int.MaxValue;
	    foreach (Room g in goals)
	    {
		int tmp = evaluateManhattanDistanceOf(pos.getX(), pos.getY(), g.getX(), g.getY());

		if (tmp < nearestGoalDist)
		{
		    nearestGoalDist = tmp;
		}
	    }
	    return nearestGoalDist;
	}

	// PRIVATE

	private int evaluateManhattanDistanceOf(int x1, int y1, int x2, int y2)
	{
	    return Math.Abs(x1 - x2) + Math.Abs(y1 - y2);
	}
    }
}

================================================
FILE: aima-csharp/environment/wumpusworld/Room.cs
================================================
using System.Collections.Generic;

namespace aima.core.environment.wumpusworld
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): page 236.<br>
     * <br>
     * The <b>wumpus world</b> is a cave consisting of rooms connected by
     * passageways. Rooms are labeled [x,y], for example [1,1] would indicate the
     * room in the bottom left, and is also the room the agent always starts in. See
     * Figure 7.2 for an example room layout representing a wumpus's cave.
     * 
     * @author Ciaran O'Reilly
     */
    public class Room
    {
	private int x = 1;
	private int y = 1;

	/**
	 * Constructor.
	 * 
	 * @param x
	 *            the room's x location.
	 * @param y
	 *            the room's y location.
	 */
	public Room(int x, int y)
	{
	    this.x = x;
	    this.y = y;
	}

	/**
	 * 
	 * @return the room's x location.
	 */
	public int getX()
	{
	    return x;
	}

	/**
	 *
	 * @return the room's y location.
	 */
	public int getY()
	{
	    return y;
	}

	public string toString()
	{
	    return "[" + x + "," + y + "]";	    
	}
	
	public bool equals(object o)
	{
	    if (o != null && o is Room) {
		Room r = (Room)o;
		if (x == r.x && y == r.y)
		{
		    return true;
		}
		return false;
	    }
	    return false;
	}

	public int hashCode()
	{
	    int result = 17;
	    result = 37 * result + getX();
	    result = 43 * result + getY();
	    return result;
	}
    }
}

================================================
FILE: aima-csharp/logic/common/Lexer.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;

namespace aima.core.logic.common
{
    /**
     * An abstract base class for constructing lexical analyzers for knowledge
     * representation languages. It provides a mechanism for converting a sequence
     * of characters to a sequence of tokens that are meaningful in the
     * representation language of interest.
     * 
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
    public abstract class Lexer
    {
	protected int lookAheadBufferSize = 1;
	//
	private static readonly int END_OF_INPUT = -1;
	//
	private StringReader input;
	public int[] lookAheadBuffer;
	private int currentPositionInInput;

	/**
	 * Sets the character stream of the lexical analyzer.
	 * 
	 * @param inputString
	 *            a sequence of characters to be converted into a sequence of
	 *            tokens.
	 */
	public void setInput(String inputString)
	{
	    this.input = new StringReader(inputString);
	}

	/**
	 * Set the character stream reader of the lexical analyzer.
	 * 
	 * @param inputReader
	 *            a reader on a sequence of characters to be converted into a
	 *            sequence of tokens.
	 */
	public void setInput(StringReader inputReader)
	{
	    input = inputReader;
	    lookAheadBuffer = new int[lookAheadBufferSize];
	    currentPositionInInput = 0;
	    initializeLookAheadBuffer();
	}

	/**
	 * To be implemented by concrete implementations
	 * 
	 * @return the next token from the input.
	 */
	public abstract Token nextToken();

	// PROTECTED
	
	protected int getCurrentPositionInInput()
	{
	    return currentPositionInInput;
	}

	/*
	 * Returns the character at the specified position in the lookahead buffer.
	 */
	protected char lookAhead(int position)
	{
	    return (char)lookAheadBuffer[position - 1];
	}

	/**
	 * Consume 1 character from the input.
	 */
	protected void consume()
	{
	    currentPositionInInput++;
	    loadNextCharacterFromInput();
	}

	// PRIVATE
	
	/**
	 * Returns true if the end of the stream has been reached.
	 */
	private bool isEndOfInput(int i)
	{
	    return (END_OF_INPUT == i);
	}

	/**
	 * Initialize the look ahead buffer from the input.
	 */
	private void initializeLookAheadBuffer()
	{
	    for (int i = 0; i < lookAheadBufferSize; i++)
	    {
		// Mark th entire buffer as being end of input.
		lookAheadBuffer[i] = END_OF_INPUT;
	    }
	    for (int i = 0; i < lookAheadBufferSize; i++)
	    {
		// Now fill the buffer (if possible) from the input.
		lookAheadBuffer[i] = readInput();
		if (isEndOfInput(lookAheadBuffer[i]))
		{
		    // The input is smaller than the buffer size
		    break;
		}
	    }
	}

	/**
	 * Loads the next character into the lookahead buffer if the end of the
	 * stream has not already been reached.
	 */
	private void loadNextCharacterFromInput()
	{
	    bool eoiEncountered = false;
	    for (int i = 0; i < lookAheadBufferSize - 1; i++)
	    {
		lookAheadBuffer[i] = lookAheadBuffer[i + 1];
		if (isEndOfInput(lookAheadBuffer[i]))
		{
		    eoiEncountered = true;
		    break;
		}
	    }
	    if (!eoiEncountered)
	    {
		lookAheadBuffer[lookAheadBufferSize - 1] = readInput();
	    }
	}

	private int readInput()
	{
	    int read = -1;

	    try
	    {
		read = input.Read();
	    }
	    catch (IOException ioe)
	    {
		throw new LexerException("IOException thrown reading input.",
				currentPositionInInput, ioe);
	    }
	    return read;
	}
    }
}

================================================
FILE: aima-csharp/logic/common/LexerException.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.logic.common
{
    /**
     * A runtime exception to be used to describe Lexer exceptions. In particular it
     * provides information to help in identifying where in the input character
     * sequence the exception occurred.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class LexerException : SystemException
    {
	private static readonly long serialVersionUID = 1L;

	private int currentPositionInInput;

	public LexerException(String message, int currentPositionInInput): base(message)
	{	    
	    this.currentPositionInInput = currentPositionInInput;
	}

	public LexerException(String message, int currentPositionInInput,
			Exception cause): base(message, cause)
	{
	    
	    this.currentPositionInInput = currentPositionInInput;
	}

	/**
	 * 
	 * @return the current position in the input character stream that the lexer
	 *         was at before the exception was encountered.
	 */
	public int getCurrentPositionInInputExceptionThrown()
	{
	    return currentPositionInInput;
	}
    }
}

================================================
FILE: aima-csharp/logic/common/LogicTokenTypes.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.logic.common
{
    /**
     * @author Ravi Mohan
     * 
     */
    public enum LogicTokenTypes : int
    {
	SYMBOL = 1,

	LPAREN = 2,

	RPAREN = 3,

	COMMA = 4,

	CONNECTOR = 5,

	QUANTIFIER = 6,

	PREDICATE = 7,

	FUNCTION = 8,

	VARIABLE = 9,

	CONSTANT = 10,

	TRUE = 11,

	FALSE = 12,

	EQUALS = 13,

	WHITESPACE = 1000,

	EOI = 9999 // End of Input.
    }
}

================================================
FILE: aima-csharp/logic/common/Parser.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;

namespace aima.core.logic.common
{

    /**
     * An abstract base class for constructing parsers for knowledge representation
     * languages. It provides a mechanism for converting a sequence of tokens
     * (derived from an appropriate lexer) into a syntactically correct abstract
     * syntax tree of the representation language.
     * 
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     * 
     * @param <S> the root type of the abstract syntax tree being parsed.
     */
    public abstract class Parser<S>
    {
	protected int lookAheadBufferSize = 1;
	
	private Token[] lookAheadBuffer = null;
	private StringReader input;

	/**
	 * 
	 * @return an instance of the Lexer to be used by a concrete implementation
	 *         of this class.
	 */
	public abstract Lexer getLexer();

	/**
	 * Parse the input concrete syntax into an abstract syntax tree.
	 * 
	 * @param input
	 *            a string representation of the concrete syntax to be parsed.
	 * @return the root node of an abstract syntax tree representation of the
	 *         the concrete input syntax that was parsed.
	 */
	public S parse(String input)
	{
	    return parse(new StringReader(input));
	}

	/**
	 * Parse the input concrete syntax into an abstract syntax tree.
	 * 
	 * @param inputReader
	 *            a Reader of the concrete syntax to be parsed.
	 * @return the root node of an abstract syntax tree representation of the
	 *         the concrete input syntax that was parsed.
	 */
	public S parse(StringReader inputReader)
	{
	    S result;

	    try
	    {
		getLexer().setInput(inputReader);
		initializeLookAheadBuffer();

		result = parse();
	    }
	    catch (LexerException le)
	    {
		throw new ParserException("Lexer Exception thrown during parsing at position " + le.getCurrentPositionInInputExceptionThrown(), le);
	    }
	    return default(S);
	}

	// PROTECTED
	
	/**
	 * To be implemented by concrete implementations of this class.
	 * 
	 * @return the root node of an abstract syntax tree representation of the
	 *         the concrete input syntax that was parsed.
	 */
	protected abstract S parse();

	/**
	 * @return the token at the specified position in the lookahead buffer.
	 */
	protected Token lookAhead(int i)
	{
	    return lookAheadBuffer[i - 1];
	}

	/**
	 * Consume 1 token from the input.
	 */
	protected void consume()
	{
	    loadNextTokenFromInput();
	}

	/**
	 * Consume the given match symbol if it matches the current input token. If
	 * it does not match throws a ParserException detailing the match error.
	 * 
	 * @param toMatchSymbol
	 *            the symbol to match before consuming it.
	 */
	protected void match(String toMatchSymbol)
	{
	    if (lookAhead(1).getText().Equals(toMatchSymbol))
	    {
		consume();
	    }
	    else
	    {
		throw new ParserException(
				"Parser: Syntax error detected at match. Expected "
						+ toMatchSymbol + " but got "
						+ lookAhead(1).getText(), lookAhead(1));
	    }

	}
		
	// PRIVATE
	
	private void initializeLookAheadBuffer()
	{
	    lookAheadBuffer = new Token[lookAheadBufferSize];
	    for (int i = 0; i < lookAheadBufferSize; i++)
	    {
		// Now fill the buffer (if possible) from the input.
		lookAheadBuffer[i] = getLexer().nextToken();
		if (isEndOfInput(lookAheadBuffer[i]))
		{
		    // The input is smaller than the buffer size
		    break;
		}
	    }
	}

	/*
	 * Loads the next token into the lookahead buffer if the end of the stream
	 * has not already been reached.
	 */
	private void loadNextTokenFromInput()
	{
	    bool eoiEncountered = false;
	    for (int i = 0; i < lookAheadBufferSize - 1; i++)
	    {
		lookAheadBuffer[i] = lookAheadBuffer[i + 1];
		if (isEndOfInput(lookAheadBuffer[i]))
		{
		    eoiEncountered = true;
		    break;
		}
	    }
	    if (!eoiEncountered)
	    {
		lookAheadBuffer[lookAheadBufferSize - 1] = getLexer().nextToken();
	    }
	}

	/*
	 * Returns true if the end of the stream has been reached.
	 */
	private bool isEndOfInput(Token t)
	{
	    return (t == null || EqualityComparer<Token>.Equals(t.getType(), LogicTokenTypes.EOI));
	}
    }
}

================================================
FILE: aima-csharp/logic/common/ParserException.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.logic.common
{
    /**
     * A runtime exception to be used to describe Parser exceptions. In particular
     * it provides information to help in identifying which tokens proved
     * problematic in the parse.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class ParserException : SystemException
    {
	private static readonly long serialVersionUID = 1L;

	private List<Token> problematicTokens = new List<Token>();

	public ParserException(String message, params Token[] problematicTokens): base(message)
	{	    
	    if (problematicTokens != null)
	    {
		foreach (Token pt in problematicTokens)
		{
		    this.problematicTokens.Add(pt);
		}
	    }
	}

	public ParserException(String message, Exception cause, params Token[] problematicTokens): base(message, cause)
	{	    
	    if (problematicTokens != null)
	    {
		foreach (Token pt in problematicTokens)
		{
		    this.problematicTokens.Add(pt);
		}
	    }
	}

	/**
	 * 
	 * @return a list of 0 or more tokens from the input stream that are
	 *         believed to have contributed to the parse exception.
	 */
	public List<Token> getProblematicTokens()
	{
	    return problematicTokens;
	}
    }
}

================================================
FILE: aima-csharp/logic/common/ParserTreeNode.cs
================================================
namespace aima.core.logic.common
{
    /**
     * @author Ravi Mohan
     * 
     */
    public interface ParseTreeNode
    {

    }
}

================================================
FILE: aima-csharp/logic/common/Token.cs
================================================
using System;
using System.Collections.Generic;

namespace aima.core.logic.common
{
    /**
     * A token generated by a lexer from a sequence of characters.
     * 
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
    public class Token
    {
	private int type;
	private String text;
	private int startCharPositionInInput;

	/**
	 * Constructs a token from the specified token-name and attribute-value
	 * 
	 * @param type
	 *            the token-name
	 * @param text
	 *            the attribute-value
	 * @param startCharPositionInInput
	 *            the position (starting from 0) at which this token 
	 *            starts in  the input.
	 */
	public Token(int type, String text, int startCharPositionInInput)
	{
	    this.type = type;
	    this.text = text;
	    this.startCharPositionInInput = startCharPositionInInput;
	}

	/**
	 * Returns the attribute-value of this token.
	 * 
	 * @return the attribute-value of this token.
	 */
	public String getText()
	{
	    return text;
	}

	/**
	 * Returns the token-name of this token.
	 * 
	 * @return the token-name of this token.
	 */
	public int getType()
	{
	    return type;
	}

	/**
	 * @return the position (starting from 0) at which this token starts in the
	 *         input.
	 */
	public int getStartCharPositionInInput()
	{
	    return startCharPositionInInput;
	}

	public  override bool Equals(Object o)
	{

	    if (this == o)
	    {
		return true;
	    }
	    if ((o == null) || !(o is Token))
	    {
		return false;
	    }

	    Token other = (Token)o;
	    return ((other.type == type) && (other.text.Equals(text)) && (other.startCharPositionInInput == startCharPositionInInput));
	}

	public override int GetHashCode()
	{
	    int result = 17;
	    result = 37 * result + type;
	    result = 37 * result + text.GetHashCode();
	    result = 37 * result + startCharPositionInInput;
	    return result;
	}

	public override String ToString()
	{
	    return "[ " + type + " " + text + " " + startCharPositionInInput + " ]";
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/CNFConverter.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.logic.fol.kb.data;
using aima.core.logic.fol.parsing;
using aima.core.logic.fol.parsing.ast;
using aima.core.util;

namespace aima.core.logic.fol
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): page 345.<br>
     * <br>
     * Every sentence of first-order logic can be converted into an inferentially
     * equivalent CNF sentence.<br>
     * <br>
     * <b>Note:</b> Transformation rules extracted from 346 and 347, which are
     * essentially the INSEADO method outlined in: <a
     * href="http://logic.stanford.edu/classes/cs157/2008/lectures/lecture09.pdf"
     * >INSEADO Rules</a>
     * 
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
     public class CNFConverter
    {
	private FOLParser parser = null;
	private SubstVisitor substVisitor;

	public CNFConverter(FOLParser parser)
	{
	    this.parser = parser;

	    this.substVisitor = new SubstVisitor();
	}

	/**
	 * Returns the specified sentence as a list of clauses, where each clause is
	 * a disjunction of literals.
	 * 
	 * @param aSentence
	 *            a sentence in first order logic (predicate calculus)
	 * 
	 * @return the specified sentence as a list of clauses, where each clause is
	 *         a disjunction of literals.
	 */
	public CNF convertToCNF(Sentence aSentence)
	{
	    // I)mplications Out:
	    Sentence implicationsOut = (Sentence)aSentence.accept(
			    new ImplicationsOut(), null);

	    // N)egations In:
	    Sentence negationsIn = (Sentence)implicationsOut.accept(
			    new NegationsIn(), null);

	    // S)tandardize variables:
	    // For sentences like:
	    // (FORALL x P(x)) V (EXISTS x Q(x)),
	    // which use the same variable name twice, change the name of one of the
	    // variables.
	    Sentence saQuantifiers = (Sentence)negationsIn.accept(
			    new StandardizeQuantiferVariables(substVisitor),
			    new LinkedHashSet<Variable>());

	    // Remove explicit quantifiers, by skolemizing existentials
	    // and dropping universals:
	    // E)xistentials Out
	    // A)lls Out:
	    Sentence andsAndOrs = (Sentence)saQuantifiers.accept(
			    new RemoveQuantifiers(parser), new LinkedHashSet<Variable>());

	    // D)istribution
	    // V over ^:
	    Sentence orDistributedOverAnd = (Sentence)andsAndOrs.accept(
			    new DistributeOrOverAnd(), null);

	    // O)perators Out
	    return (new CNFConstructor()).construct(orDistributedOverAnd);
	}
    }

    class ImplicationsOut : FOLVisitor
    {
	public ImplicationsOut()
	{

	}

	public Object visitPredicate(Predicate p, Object arg)
	{
	    return p;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    return equality;
	}

	public Object visitVariable(Variable variable, Object arg)
	{
	    return variable;
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    return constant;
	}

	public Object visitFunction(Function function, Object arg)
	{
	    return function;
	}

	public Object visitNotSentence(NotSentence notSentence, Object arg)
	{
	    Sentence negated = notSentence.getNegated();

	    return new NotSentence((Sentence)negated.accept(this, arg));
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    Sentence alpha = (Sentence)sentence.getFirst().accept(this, arg);
	    Sentence beta = (Sentence)sentence.getSecond().accept(this, arg);

	    // Eliminate <=>, bi-conditional elimination,
	    // replace (alpha <=> beta) with (~alpha V beta) ^ (alpha V ~beta).
	    if (Connectors.isBICOND(sentence.getConnector()))
	    {
		Sentence first = new ConnectedSentence(Connectors.OR,
			new NotSentence(alpha), beta);
		Sentence second = new ConnectedSentence(Connectors.OR, alpha,
			new NotSentence(beta));

		return new ConnectedSentence(Connectors.AND, first, second);
	    }

	    // Eliminate =>, implication elimination,
	    // replacing (alpha => beta) with (~alpha V beta)
	    if (Connectors.isIMPLIES(sentence.getConnector()))
	    {
		return new ConnectedSentence(Connectors.OR, new NotSentence(alpha),
			beta);
	    }

	    return new ConnectedSentence(sentence.getConnector(), alpha, beta);
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{

	    return new QuantifiedSentence(sentence.getQuantifier(), sentence
		    .getVariables(), (Sentence)sentence.getQuantified().accept(
		    this, arg));
	}
    }

    class NegationsIn : FOLVisitor
    {
	public NegationsIn()
	{

	}

	public Object visitPredicate(Predicate p, Object arg)
	{
	    return p;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    return equality;
	}

	public Object visitVariable(Variable variable, Object arg)
	{
	    return variable;
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    return constant;
	}

	public Object visitFunction(Function function, Object arg)
	{
	    return function;
	}

	public Object visitNotSentence(NotSentence notSentence, Object arg)
	{
	    // CNF requires NOT (~) to appear only in literals, so we 'move ~
	    // inwards' by repeated application of the following equivalences:
	    Sentence negated = notSentence.getNegated();

	    // ~(~alpha) equivalent to alpha (double negation elimination)
	    if (negated is NotSentence)
	    {
		return ((NotSentence)negated).getNegated().accept(this, arg);
	    }

	    if (negated is ConnectedSentence)
	    {
		ConnectedSentence negConnected = (ConnectedSentence)negated;
		Sentence alpha = negConnected.getFirst();
		Sentence beta = negConnected.getSecond();
		// ~(alpha ^ beta) equivalent to (~alpha V ~beta) (De Morgan)
		if (Connectors.isAND(negConnected.getConnector()))
		{
		    // I need to ensure the ~s are moved in deeper
		    Sentence notAlpha = (Sentence)(new NotSentence(alpha)).accept(
			    this, arg);
		    Sentence notBeta = (Sentence)(new NotSentence(beta)).accept(
			    this, arg);
		    return new ConnectedSentence(Connectors.OR, notAlpha, notBeta);
		}

		// ~(alpha V beta) equivalent to (~alpha ^ ~beta) (De Morgan)
		if (Connectors.isOR(negConnected.getConnector()))
		{
		    // I need to ensure the ~s are moved in deeper
		    Sentence notAlpha = (Sentence)(new NotSentence(alpha)).accept(
			    this, arg);
		    Sentence notBeta = (Sentence)(new NotSentence(beta)).accept(
			    this, arg);
		    return new ConnectedSentence(Connectors.AND, notAlpha, notBeta);
		}
	    }

	    // in addition, rules for negated quantifiers:
	    if (negated is QuantifiedSentence)
	    {
		QuantifiedSentence negQuantified = (QuantifiedSentence)negated;
		// I need to ensure the ~ is moved in deeper
		Sentence notP = (Sentence)(new NotSentence(negQuantified
			.getQuantified())).accept(this, arg);

		// ~FORALL x p becomes EXISTS x ~p
		if (Quantifiers.isFORALL(negQuantified.getQuantifier()))
		{
		    return new QuantifiedSentence(Quantifiers.EXISTS, negQuantified
			    .getVariables(), notP);
		}

		// ~EXISTS x p becomes FORALL x ~p
		if (Quantifiers.isEXISTS(negQuantified.getQuantifier()))
		{
		    return new QuantifiedSentence(Quantifiers.FORALL, negQuantified
			    .getVariables(), notP);
		}
	    }

	    return new NotSentence((Sentence)negated.accept(this, arg));
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    return new ConnectedSentence(sentence.getConnector(),
		    (Sentence)sentence.getFirst().accept(this, arg),
		    (Sentence)sentence.getSecond().accept(this, arg));
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{

	    return new QuantifiedSentence(sentence.getQuantifier(), sentence
		    .getVariables(), (Sentence)sentence.getQuantified().accept(
		    this, arg));
	}
    }

    class StandardizeQuantiferVariables : FOLVisitor
    {
	// Just use a localized indexical here.
	private ApartIndexical quantifiedIndexical = new ApartIndexical();

	private class ApartIndexical : StandardizeApartIndexical
	{
	    private int index = 0;

	    public String getPrefix()
	    {
		return "q";
	    }

	    public int getNextIndex()
	    {
		return index++;
	    }
	}

	private SubstVisitor substVisitor = null;

	public StandardizeQuantiferVariables(SubstVisitor substVisitor)
	{
	    this.substVisitor = substVisitor;
	}

	public Object visitPredicate(Predicate p, Object arg)
	{
	    return p;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    return equality;
	}

	public Object visitVariable(Variable variable, Object arg)
	{
	    return variable;
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    return constant;
	}

	public Object visitFunction(Function function, Object arg)
	{
	    return function;
	}

	public Object visitNotSentence(NotSentence sentence, Object arg)
	{
	    return new NotSentence((Sentence)sentence.getNegated().accept(this,
		    arg));
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    return new ConnectedSentence(sentence.getConnector(),
		    (Sentence)sentence.getFirst().accept(this, arg),
		    (Sentence)sentence.getSecond().accept(this, arg));
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{
	    List<Variable> seenSoFar = (List<Variable>)arg;

	    // Keep track of what I have to subst locally and
	    // what my renamed variables will be.
	    Dictionary<Variable, Term> localSubst = new Dictionary<Variable, Term>();
	    List<Variable> replVariables = new List<Variable>();
	    foreach (Variable v in sentence.getVariables())
	    {
		// If local variable has be renamed already
		// then I need to come up with own name
		if (seenSoFar.Contains(v))
		{
		    Variable sV = new Variable(quantifiedIndexical.getPrefix()
			    + quantifiedIndexical.getNextIndex());
		    localSubst.Add(v, sV);
		    // Replacement variables should contain new name for variable
		    replVariables.Add(sV);
		}
		else
		{
		    // Not already replaced, this name is good
		    replVariables.Add(v);
		}
	    }

	    // Apply the local subst
	    Sentence subst = substVisitor.subst(localSubst, sentence
		    .getQuantified());

	    // Ensure all my existing and replaced variable
	    // names are tracked
	    seenSoFar.AddRange(replVariables);

	    Sentence sQuantified = (Sentence)subst.accept(this, arg);

	    return new QuantifiedSentence(sentence.getQuantifier(), replVariables,
		    sQuantified);
	}
    }

    class RemoveQuantifiers : FOLVisitor
    {

	private FOLParser parser = null;
	private SubstVisitor substVisitor = null;

	public RemoveQuantifiers(FOLParser parser)
	{
	    this.parser = parser;

	    substVisitor = new SubstVisitor();
	}

	public Object visitPredicate(Predicate p, Object arg)
	{
	    return p;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    return equality;
	}

	public Object visitVariable(Variable variable, Object arg)
	{
	    return variable;
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    return constant;
	}

	public Object visitFunction(Function function, Object arg)
	{
	    return function;
	}

	public Object visitNotSentence(NotSentence sentence, Object arg)
	{
	    return new NotSentence((Sentence)sentence.getNegated().accept(this,
		    arg));
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    return new ConnectedSentence(sentence.getConnector(),
		    (Sentence)sentence.getFirst().accept(this, arg),
		    (Sentence)sentence.getSecond().accept(this, arg));
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{
	    Sentence quantified = sentence.getQuantified();
	    List<Variable> universalScope = (List<Variable>)arg;

	    // Skolemize: Skolemization is the process of removing existential
	    // quantifiers by elimination. This is done by introducing Skolem
	    // functions. The general rule is that the arguments of the Skolem
	    // function are all the universally quantified variables in whose
	    // scope the existential quantifier appears.
	    if (Quantifiers.isEXISTS(sentence.getQuantifier()))
	    {
		Dictionary<Variable, Term> skolemSubst = new Dictionary<Variable, Term>();
		foreach (Variable eVar in sentence.getVariables())
		{
		    if (universalScope.Count > 0)
		    {
			// Replace with a Skolem Function
			String skolemFunctionName = parser.getFOLDomain()
				.addSkolemFunction();
			skolemSubst.Add(eVar, new Function(skolemFunctionName,
				new List<Term>(universalScope)));
		    }
		    else
		    {
			// Replace with a Skolem Constant
			String skolemConstantName = parser.getFOLDomain()
				.addSkolemConstant();
			skolemSubst.Add(eVar, new Constant(skolemConstantName));
		    }
		}

		Sentence skolemized = substVisitor.subst(skolemSubst, quantified);
		return skolemized.accept(this, arg);
	    }

	    // Drop universal quantifiers.
	    if (Quantifiers.isFORALL(sentence.getQuantifier()))
	    {
		// Add to the universal scope so that
		// existential skolemization may be done correctly
		universalScope.AddRange(sentence.getVariables());

		Sentence droppedUniversal = (Sentence)quantified.accept(this, arg);

		// Enusre my scope is removed before moving back up
		// the call stack when returning
		foreach (Variable s in sentence.getVariables())
		{
		    universalScope.Remove(s);
		}

		return droppedUniversal;
	    }

	    // Should not reach here as have already
	    // handled the two quantifiers.
	    throw new ApplicationException("Unhandled Quantifier:"
		    + sentence.getQuantifier());
	}
    }

    class DistributeOrOverAnd : FOLVisitor
    {

	public DistributeOrOverAnd()
	{

	}

	public Object visitPredicate(Predicate p, Object arg)
	{
	    return p;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    return equality;
	}

	public Object visitVariable(Variable variable, Object arg)
	{
	    return variable;
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    return constant;
	}

	public Object visitFunction(Function function, Object arg)
	{
	    return function;
	}

	public Object visitNotSentence(NotSentence sentence, Object arg)
	{
	    return new NotSentence((Sentence)sentence.getNegated().accept(this,
		    arg));
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    // Distribute V over ^:

	    // This will cause flattening out of nested ^s and Vs
	    Sentence alpha = (Sentence)sentence.getFirst().accept(this, arg);
	    Sentence beta = (Sentence)sentence.getSecond().accept(this, arg);

	    // (alpha V (beta ^ gamma)) equivalent to
	    // ((alpha V beta) ^ (alpha V gamma))
	    if (Connectors.isOR(sentence.getConnector())
		    && beta is ConnectedSentence)
	    {
		ConnectedSentence betaAndGamma = (ConnectedSentence)beta;
		if (Connectors.isAND(betaAndGamma.getConnector()))
		{
		    beta = betaAndGamma.getFirst();
		    Sentence gamma = betaAndGamma.getSecond();
		    return new ConnectedSentence(Connectors.AND,
			    (Sentence)(new ConnectedSentence(Connectors.OR, alpha,
				    beta)).accept(this, arg),
			    (Sentence)(new ConnectedSentence(Connectors.OR, alpha,
				    gamma)).accept(this, arg));
		}
	    }

	    // ((alpha ^ gamma) V beta) equivalent to
	    // ((alpha V beta) ^ (gamma V beta))
	    if (Connectors.isOR(sentence.getConnector())
		    && alpha is ConnectedSentence)
	    {
		ConnectedSentence alphaAndGamma = (ConnectedSentence)alpha;
		if (Connectors.isAND(alphaAndGamma.getConnector()))
		{
		    alpha = alphaAndGamma.getFirst();
		    Sentence gamma = alphaAndGamma.getSecond();
		    return new ConnectedSentence(Connectors.AND,
			    (Sentence)(new ConnectedSentence(Connectors.OR, alpha,
				    beta)).accept(this, arg),
			    (Sentence)(new ConnectedSentence(Connectors.OR, gamma,
				    beta)).accept(this, arg));
		}
	    }

	    return new ConnectedSentence(sentence.getConnector(), alpha, beta);
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{
	    // This should not be called as should have already
	    // removed all of the quantifiers.
	    throw new NotImplementedException(
		    "All quantified sentences should have already been removed.");
	}
    }

    class CNFConstructor : FOLVisitor
    {
	public CNFConstructor()
	{

	}

	public CNF construct(Sentence orDistributedOverAnd)
	{
	    ArgData ad = new ArgData();

	    orDistributedOverAnd.accept(this, ad);

	    return new CNF(ad.clauses);
	}

	public Object visitPredicate(Predicate p, Object arg)
	{
	    ArgData ad = (ArgData)arg;
	    if (ad.negated)
	    {
		ad.clauses[ad.clauses.Count - 1].addNegativeLiteral(p);
	    }
	    else
	    {
		ad.clauses[ad.clauses.Count - 1].addPositiveLiteral(p);
	    }
	    return p;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    ArgData ad = (ArgData)arg;
	    if (ad.negated)
	    {
		ad.clauses[ad.clauses.Count - 1].addNegativeLiteral(equality);
	    }
	    else
	    {
		ad.clauses[ad.clauses.Count - 1].addPositiveLiteral(equality);
	    }
	    return equality;
	}

	public Object visitVariable(Variable variable, Object arg)
	{
	    // This should not be called
	    throw new NotImplementedException("visitVariable() should not be called.");
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    // This should not be called
	    throw new NotImplementedException("visitConstant() should not be called.");
	}

	public Object visitFunction(Function function, Object arg)
	{
	    // This should not be called
	    throw new NotImplementedException("visitFunction() should not be called.");
	}

	public Object visitNotSentence(NotSentence sentence, Object arg)
	{
	    ArgData ad = (ArgData)arg;
	    // Indicate that the enclosed predicate is negated
	    ad.negated = true;
	    sentence.getNegated().accept(this, arg);
	    ad.negated = false;

	    return sentence;
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    ArgData ad = (ArgData)arg;
	    Sentence first = sentence.getFirst();
	    Sentence second = sentence.getSecond();

	    first.accept(this, arg);
	    if (Connectors.isAND(sentence.getConnector()))
	    {
		ad.clauses.Add(new Clause());
	    }
	    second.accept(this, arg);

	    return sentence;
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{
	    // This should not be called as should have already
	    // removed all of the quantifiers.
	    throw new NotImplementedException(
		    "All quantified sentences should have already been removed.");
	}

	class ArgData
	{
	    public List<Clause> clauses = new List<Clause>();
	    public bool negated = false;

	    public ArgData()
	    {
		clauses.Add(new Clause());
	    }
	}
    }
}


================================================
FILE: aima-csharp/logic/fol/Connectors.cs
================================================
using System;

namespace aima.core.logic.fol
{
    /**
     * @author Ravi Mohan
     * 
     */
    public class Connectors
    {
	public static readonly String AND = "AND";

	public static readonly String OR = "OR";

	public static readonly String NOT = "NOT";

	public static readonly String IMPLIES = "=>";

	public static readonly String BICOND = "<=>";

	public static bool isAND(String connector)
	{
	    return AND.Equals(connector);
	}

	public static bool isOR(String connector)
	{
	    return OR.Equals(connector);
	}

	public static bool isNOT(String connector)
	{
	    return NOT.Equals(connector);
	}

	public static bool isIMPLIES(String connector)
	{
	    return IMPLIES.Equals(connector);
	}

	public static bool isBICOND(String connector)
	{
	    return BICOND.Equals(connector);
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/PredicateCollector.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.logic.fol.parsing;
using aima.core.logic.fol.parsing.ast;

namespace aima.core.logic.fol
{
    /**
     * @author Ravi Mohan
     * 
     */
    public class PredicateCollector : FOLVisitor
    {
	public PredicateCollector()
	{

	}

	public List<Predicate> getPredicates(Sentence s)
	{
	    return (List<Predicate>)s.accept(this, new List<Predicate>());
	}

	public Object visitPredicate(Predicate p, Object arg)
	{
	    List<Predicate> predicates = (List<Predicate>)arg;
	    predicates.Add(p);
	    return predicates;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    return arg;
	}

	public Object visitVariable(Variable variable, Object arg)
	{
	    return arg;
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    return arg;
	}

	public Object visitFunction(Function function, Object arg)
	{
	    return arg;
	}

	public Object visitNotSentence(NotSentence sentence, Object arg)
	{
	    sentence.getNegated().accept(this, arg);
	    return arg;
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    sentence.getFirst().accept(this, arg);
	    sentence.getSecond().accept(this, arg);
	    return arg;
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{
	    sentence.getQuantified().accept(this, arg);
	    return arg;
	}
    }
}


================================================
FILE: aima-csharp/logic/fol/Quantifiers.cs
================================================
using System;

namespace aima.core.logic.fol
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class Quantifiers
    {
	public static readonly String FORALL = "FORALL";
	public static readonly String EXISTS = "EXISTS";

	public static bool isFORALL(String quantifier)
	{
	    return FORALL.Equals(quantifier);
	}

	public static bool isEXISTS(String quantifier)
	{
	    return EXISTS.Equals(quantifier);
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/StandardizeApart.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.logic.fol.inference.proof;
using aima.core.logic.fol.kb.data;
using aima.core.logic.fol.parsing.ast;

namespace aima.core.logic.fol
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class StandardizeApart
    {
	private VariableCollector variableCollector = null;
	private SubstVisitor substVisitor = null;

	public StandardizeApart()
	{
	    variableCollector = new VariableCollector();
	    substVisitor = new SubstVisitor();
	}

	public StandardizeApart(VariableCollector variableCollector,
			SubstVisitor substVisitor)
	{
	    this.variableCollector = variableCollector;
	    this.substVisitor = substVisitor;
	}

	// Note: see page 327.
	public StandardizeApartResult standardizeApart(Sentence sentence,
			StandardizeApartIndexical standardizeApartIndexical)
	{
	    List<Variable> toRename = variableCollector.collectAllVariables(sentence);
	    Dictionary<Variable, Term> renameSubstitution = new Dictionary<Variable, Term>();
	    Dictionary<Variable, Term> reverseSubstitution = new Dictionary<Variable, Term>();

	    foreach (Variable var in toRename)
	    {
		Variable v = null;
		do
		{
		    v = new Variable(standardizeApartIndexical.getPrefix()
				    + standardizeApartIndexical.getNextIndex());
		    // Ensure the new variable name is not already
		    // accidentally used in the sentence
		} while (toRename.Contains(v));

		renameSubstitution.Add(var, v);
		reverseSubstitution.Add(v, var);
	    }
	    Sentence standardized = substVisitor.subst(renameSubstitution,
			    sentence);

	    return new StandardizeApartResult(sentence, standardized,
			    renameSubstitution, reverseSubstitution);
	}

	public Clause standardizeApart(Clause clause,
			StandardizeApartIndexical standardizeApartIndexical)
	{

	    List<Variable> toRename = variableCollector.collectAllVariables(clause);
	    Dictionary<Variable, Term> renameSubstitution = new Dictionary<Variable, Term>();

	    foreach (Variable var in toRename)
	    {
		Variable v = null;
		do
		{
		    v = new Variable(standardizeApartIndexical.getPrefix()
				    + standardizeApartIndexical.getNextIndex());
		    // Ensure the new variable name is not already
		    // accidentally used in the sentence
		} while (toRename.Contains(v));

		renameSubstitution.Add(var, v);
	    }

	    if (renameSubstitution.Count > 0)
	    {
		List<Literal> literals = new List<Literal>();

		foreach (Literal l in clause.getLiterals())
		{
		    literals.Add(substVisitor.subst(renameSubstitution, l));
		}
		Clause renamed = new Clause(literals);
		renamed.setProofStep(new ProofStepRenaming(renamed, clause
				.getProofStep()));
		return renamed;
	    }
	    return clause;
	}

	public Chain standardizeApart(Chain chain,
			StandardizeApartIndexical standardizeApartIndexical)
	{

	    List<Variable> toRename = variableCollector.collectAllVariables(chain);
	    Dictionary<Variable, Term> renameSubstitution = new Dictionary<Variable, Term>();

	    foreach (Variable var in toRename)
	    {
		Variable v = null;
		do
		{
		    v = new Variable(standardizeApartIndexical.getPrefix()
				    + standardizeApartIndexical.getNextIndex());
		    // Ensure the new variable name is not already
		    // accidentally used in the sentence
		} while (toRename.Contains(v));

		renameSubstitution.Add(var, v);
	    }

	    if (renameSubstitution.Count > 0)
	    {
		List<Literal> lits = new List<Literal>();

		foreach (Literal l in chain.getLiterals())
		{
		    AtomicSentence atom = (AtomicSentence)substVisitor.subst(
				    renameSubstitution, l.getAtomicSentence());
		    lits.Add(l.newInstance(atom));
		}

		Chain renamed = new Chain(lits);

		renamed.setProofStep(new ProofStepRenaming(renamed, chain
				.getProofStep()));

		return renamed;
	    }
	    return chain;
	}

	public Dictionary<Variable, Term> standardizeApart(List<Literal> l1Literals,
			List<Literal> l2Literals,
			StandardizeApartIndexical standardizeApartIndexical)
	{
	    List<Variable> toRename = new List<Variable>();

	    foreach (Literal pl in l1Literals)
	    {
		toRename.AddRange(variableCollector.collectAllVariables(pl
				.getAtomicSentence()));
	    }
	    foreach (Literal nl in l2Literals)
	    {
		toRename.AddRange(variableCollector.collectAllVariables(nl
				.getAtomicSentence()));
	    }

	    Dictionary<Variable, Term> renameSubstitution = new Dictionary<Variable, Term>();

	    foreach (Variable var in toRename)
	    {
		Variable v = null;
		do
		{
		    v = new Variable(standardizeApartIndexical.getPrefix()
				    + standardizeApartIndexical.getNextIndex());
		    // Ensure the new variable name is not already
		    // accidentally used in the sentence
		} while (toRename.Contains(v));

		renameSubstitution.Add(var, v);
	    }

	    List<Literal> posLits = new List<Literal>();
	    List<Literal> negLits = new List<Literal>();

	    foreach (Literal pl in l1Literals)
	    {
		posLits.Add(substVisitor.subst(renameSubstitution, pl));
	    }
	    foreach (Literal nl in l2Literals)
	    {
		negLits.Add(substVisitor.subst(renameSubstitution, nl));
	    }

	    l1Literals.Clear();
	    l1Literals.AddRange(posLits);
	    l2Literals.Clear();
	    l2Literals.AddRange(negLits);

	    return renameSubstitution;
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/StandardizeApartInPlace.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.logic.fol.kb.data;
using aima.core.logic.fol.parsing;
using aima.core.logic.fol.parsing.ast;

namespace aima.core.logic.fol
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class StandardizeApartInPlace
    {
	private static CollectAllVariables _collectAllVariables = new CollectAllVariables();

	public static int standardizeApart(Chain c, int saIdx)
	{
	    List<Variable> variables = new List<Variable>();
	    foreach (Literal l in c.getLiterals())
	    {
		collectAllVariables(l.getAtomicSentence(), variables);
	    }
	    return standardizeApart(variables, c, saIdx);
	}

	public static int standardizeApart(Clause c, int saIdx)
	{
	    List<Variable> variables = new List<Variable>();
	    foreach (Literal l in c.getLiterals())
	    {
		collectAllVariables(l.getAtomicSentence(), variables);
	    }

	    return standardizeApart(variables, c, saIdx);
	}

	// PRIVATE METHODS

	private static int standardizeApart(List<Variable> variables, Object expr,
		int saIdx)
	{
	    Dictionary<String, int> indexicals = new Dictionary<String, int>();
	    foreach (Variable v in variables)
	    {
		if (!indexicals.ContainsKey(v.getIndexedValue()))
		{
		    indexicals.Add(v.getIndexedValue(), saIdx++);
		}
	    }
	    foreach (Variable v in variables)
	    {
		int i = indexicals[v.getIndexedValue()];
		if (null == i)
		{
		    throw new ApplicationException("ERROR: duplicate var=" + v
			    + ", expr=" + expr);
		}
		else
		{
		    v.setIndexical(i);
		}
	    }
	    return saIdx;
	}

	private static void collectAllVariables(Sentence s, List<Variable> vars)
	{
	    s.accept(_collectAllVariables, vars);
	}
    }

    class CollectAllVariables : FOLVisitor
    {
	public CollectAllVariables()
	{

	}

	public Object visitVariable(Variable var, Object arg)
	{
	    List<Variable> variables = (List<Variable>)arg;
	    variables.Add(var);
	    return var;
	}

	public Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{
	    // Ensure I collect quantified variables too
	    List<Variable> variables = (List<Variable>)arg;
	    variables.AddRange(sentence.getVariables());

	    sentence.getQuantified().accept(this, arg);

	    return sentence;
	}

	public Object visitPredicate(Predicate predicate, Object arg)
	{
	    foreach (Term t in predicate.getTerms())
	    {
		t.accept(this, arg);
	    }
	    return predicate;
	}

	public Object visitTermEquality(TermEquality equality, Object arg)
	{
	    equality.getTerm1().accept(this, arg);
	    equality.getTerm2().accept(this, arg);
	    return equality;
	}

	public Object visitConstant(Constant constant, Object arg)
	{
	    return constant;
	}

	public Object visitFunction(Function function, Object arg)
	{
	    foreach (Term t in function.getTerms())
	    {
		t.accept(this, arg);
	    }
	    return function;
	}

	public Object visitNotSentence(NotSentence sentence, Object arg)
	{
	    sentence.getNegated().accept(this, arg);
	    return sentence;
	}

	public Object visitConnectedSentence(ConnectedSentence sentence, Object arg)
	{
	    sentence.getFirst().accept(this, arg);
	    sentence.getSecond().accept(this, arg);
	    return sentence;
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/StandardizeApartIndexical.cs
================================================
using System;

namespace aima.core.logic.fol
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public interface StandardizeApartIndexical
    {
	String getPrefix();

	int getNextIndex();
    }
}

================================================
FILE: aima-csharp/logic/fol/StandardizeApartIndexicalFactory.cs
================================================
using System;
using System.Collections.Generic;
using System.Text;

namespace aima.core.logic.fol
{
    /**
     * This class ensures unique standardize apart indexicals are created.
     * 
     * @author Ciaran O'Reilly
     * 
     */
    public class StandardizeApartIndexicalFactory
    {
	private static Dictionary<char, int> _assignedIndexicals = new Dictionary<char, int>();

	// For use in test cases, where predictable behavior is expected.
	public static void flush()
	{
	    lock (_assignedIndexicals)
	    {
		_assignedIndexicals.Clear();
	    }
	}

	public static StandardizeApartIndexical newStandardizeApartIndexical(
		Char preferredPrefix)
	{
	    char ch = preferredPrefix;
	    if (!(Char.IsLetter(ch) && Char.IsLower(ch)))
	    {
		throw new ArgumentException("Preferred prefix :"
				+ preferredPrefix + " must be a valid a lower case letter.");
	    }

	    StringBuilder sb = new StringBuilder();
	    lock (_assignedIndexicals)
	    {
		int currentPrefixCnt = -1;
		if (!_assignedIndexicals.ContainsKey(preferredPrefix))
		{
		    currentPrefixCnt = 0;
		    _assignedIndexicals.Add(preferredPrefix, currentPrefixCnt);
		}
		else
		{
		    currentPrefixCnt += 1;
		    _assignedIndexicals[preferredPrefix] = currentPrefixCnt;
		}

		sb.Append(preferredPrefix);
		for (int i = 0; i < currentPrefixCnt; i++)
		{
		    sb.Append(preferredPrefix);
		}
	    }

	    return new StandardizeApartIndexicalImpl(sb.ToString());
	}
    }

    class StandardizeApartIndexicalImpl : StandardizeApartIndexical
    {
	private String prefix = null;
	private int index = 0;

	public StandardizeApartIndexicalImpl(String prefix)
	{
	    this.prefix = prefix;
	}

	// START-StandardizeApartIndexical
	public String getPrefix()
	{
	    return prefix;
	}

	public int getNextIndex()
	{
	    return index++;
	}
	// END-StandardizeApartIndexical	
    }
}

================================================
FILE: aima-csharp/logic/fol/StandardizeApartResult.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.logic.fol.parsing.ast;

namespace aima.core.logic.fol
{
    /**
     * @author Ciaran O'Reilly
     * 
     */
    public class StandardizeApartResult
    {
	private Sentence originalSentence = null;
	private Sentence standardized = null;
	private Dictionary<Variable, Term> forwardSubstitution = null;
	private Dictionary<Variable, Term> reverseSubstitution = null;

	public StandardizeApartResult(Sentence originalSentence,
		Sentence standardized, Dictionary<Variable, Term> forwardSubstitution,
		Dictionary<Variable, Term> reverseSubstitution)
	{
	    this.originalSentence = originalSentence;
	    this.standardized = standardized;
	    this.forwardSubstitution = forwardSubstitution;
	    this.reverseSubstitution = reverseSubstitution;
	}

	public Sentence getOriginalSentence()
	{
	    return originalSentence;
	}

	public Sentence getStandardized()
	{
	    return standardized;
	}

	public Dictionary<Variable, Term> getForwardSubstitution()
	{
	    return forwardSubstitution;
	}

	public Dictionary<Variable, Term> getReverseSubstitution()
	{
	    return reverseSubstitution;
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/SubstVisitor.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.logic.fol.kb.data;
using aima.core.logic.fol.parsing;
using aima.core.logic.fol.parsing.ast;

namespace aima.core.logic.fol
{
    /**
     * @author Ravi Mohan
     * @author Ciaran O'Reilly
     */
    public class SubstVisitor : AbstractFOLVisitor
    {
	public SubstVisitor()
	{

	}

	/**
	 * Note: Refer to Artificial Intelligence A Modern Approach (3rd Edition):
	 * page 323.
	 * 
	 * @param theta
	 *            a substitution.
	 * @param sentence
	 *            the substitution has been applied to.
	 * @return a new Sentence representing the result of applying the
	 *         substitution theta to aSentence.
	 * 
	 */
	public Sentence subst(Dictionary<Variable, Term> theta, Sentence sentence)
	{
	    return (Sentence)sentence.accept(this, theta);
	}

	public Term subst(Dictionary<Variable, Term> theta, Term aTerm)
	{
	    return (Term)aTerm.accept(this, theta);
	}

	public Function subst(Dictionary<Variable, Term> theta, Function function)
	{
	    return (Function)function.accept(this, theta);
	}

	public Literal subst(Dictionary<Variable, Term> theta, Literal literal)
	{
	    return literal.newInstance((AtomicSentence)literal
			    .getAtomicSentence().accept(this, theta));
	}

	public override Object visitVariable(Variable variable, Object arg)
	{
	    Dictionary<Variable, Term> substitution = (Dictionary<Variable, Term>)arg;
	    if (substitution.ContainsKey(variable))
	    {
		return substitution[variable].copy();
	    }
	    return variable.copy();
	}

	public override Object visitQuantifiedSentence(QuantifiedSentence sentence,
		Object arg)
	{

	    Dictionary<Variable, Term> substitution = (Dictionary<Variable, Term>)arg;

	    Sentence quantified = sentence.getQuantified();
	    Sentence quantifiedAfterSubs = (Sentence)quantified.accept(this, arg);

	    List<Variable> variables = new List<Variable>();
	    foreach (Variable v in sentence.getVariables())
	    {
		if (substitution.ContainsKey(v))
		{
		    Term st = substitution[v];
		    if (st is Variable)
		    {
			// Only if it is a variable to I replace it, otherwise
			// I drop it.
			variables.Add((Variable)st.copy());
		    }
		}
		else
		{
		    // No substitution for the quantified variable, so
		    // keep it.
		    variables.Add((Variable)v.copy());
		}
	    }

	    // If not variables remaining on the quantifier, then drop it
	    if (variables.Count == 0)
	    {
		return quantifiedAfterSubs;
	    }

	    return new QuantifiedSentence(sentence.getQuantifier(), variables,
			    quantifiedAfterSubs);
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/SubsumptionElimination.cs
================================================
using System;
using System.Collections.Generic;
using aima.core.logic.fol.kb.data;

namespace aima.core.logic.fol
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): page 356.<br>
     * <br>
     * The subsumption method eliminates all sentences that are subsumed by (that
     * is, more specific than) an existing sentence in the KB. For example, P(x) is
     * in the KB, then there is no sense in adding P(A) and even less sense in
     * adding P(A) V Q(B). Subsumption helps keep the KB small and thus helps keep
     * the search space small.<br>
     * <br>
     * <b>Note:</b> <a
     * href="http://logic.stanford.edu/classes/cs157/2008/lectures/lecture12.pdf"
     * >From slide 17.</a> <br>
     * <br>
     * Relational Subsumption<br>
     * <br>
     * A relational clause &Phi; subsumes &Psi; if and only if there is a
     * substitution &delta; that, when applied to &Phi;, produces a clause &Phi;'
     * that is a subset of &Psi;.
     * 
     * @author Ciaran O'Reilly
     * @author Mike Stampone
     */
    public class SubsumptionElimination
    {
	/**
	 * Returns the clauses that are subsumed by (that is, more specific than) an
	 * existing clause in the specified set of clauses.
	 * 
	 * @param clauses
	 *            a set of clauses in first order logic
	 * 
	 * @return the clauses that are subsumed by (that is, more specific than) an
	 *         existing clause in the specified set of clauses.
	 */
	public static List<Clause> findSubsumedClauses(List<Clause> clauses)
	{
	    List<Clause> subsumed = new List<Clause>();

	    // Group the clauses by their # of literals.
	    // Keep track of the min and max # of literals.
	    int min = int.MaxValue;
	    int max = 0;
	    Dictionary<int, List<Clause>> clausesGroupedBySize = new Dictionary<int, List<Clause>>();
	    foreach (Clause c in clauses)
	    {
		int size = c.getNumberLiterals();
		if (size < min)
		{
		    min = size;
		}
		if (size > max)
		{
		    max = size;
		}
		List<Clause> cforsize = null;
		if (clausesGroupedBySize.ContainsKey(size))
		{
		    cforsize = clausesGroupedBySize[size];
		}
		if (null == cforsize)
		{
		    cforsize = new List<Clause>();
		    clausesGroupedBySize.Add(size, cforsize);
		}
		cforsize.Add(c);
	    }
	    // Check if each smaller clause
	    // subsumes any of the larger clauses.
	    for (int i = min; i < max; i++)
	    {
		List<Clause> scs = clausesGroupedBySize[i];
		// Ensure there are clauses with this # of literals
		if (null != scs)
		{
		    for (int j = i + 1; j <= max; j++)
		    {

			// Ensure there are clauses with this # of literals
			if (clausesGroupedBySize.ContainsKey(j))
			{
			    List<Clause> lcs = clausesGroupedBySize[j];
			    foreach (Clause sc in scs)
			    {
				// Don't bother checking clauses
				// that are already subsumed.
				if (!subsumed.Contains(sc))
				{
				    foreach (Clause lc in lcs)
				    {
					if (!subsumed.Contains(lc))
					{
					    if (sc.subsumes(lc))
					    {
						subsumed.Add(lc);
					    }
					}
				    }
				}
			    }
			}
		    }
		}
	    }
	    return subsumed;
	}
    }
}

================================================
FILE: aima-csharp/logic/fol/Unifier.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using aima.core.logic.fol.parsing.ast;

namespace aima.core.logic.fol
{
    /**
     * Artificial Intelligence A Modern Approach (3rd Edition): Figure 9.1, page
     * 328.<br>
     * <br>
     * 
     * <pre>
     * function UNIFY(x, y, theta) returns a substitution to make x and y identical
     *   inputs: x, a variable, constant, list, or compound
     *           y, a variable, constant, list, or compound
     *           theta, the substitution built up so far (optional, defaults to empty)
     *           
     *   if theta = failure then return failure
     *   else if x = y the return theta
     *   else if VARIABLE?(x) then return UNIVY-VAR(x, y, theta)
     *   else if VARIABLE?(y) then return UNIFY-VAR(y, x, theta)
     *   else if COMPOUND?(x) and COMPOUND?(y) then
     *       return UNIFY(x.ARGS, y.ARGS, UNIFY(x.OP, y.OP, theta))
     *   else if LIST?(x) and LIST?(y) then
     *       return UNIFY(x.REST, y.REST, UNIFY(x.FIRST, y.FIRST, theta))
     *   else return failure
     *   
     * ---------------------------------------------------------------------------------------------------
     * 
     * function UNIFY-VAR(var, x, theta) returns a substitution
     *            
     *   if {var/val} E theta then return UNIFY(val, x, theta)
     *   else if {x/val} E theta then return UNIFY(var, val, theta)
     *   else if OCCUR-CHECK?(var, x) then return failure
     *   else return add {var/x} to theta
     * </pre>
     * 
     * Figure 9.1 The unification algorithm. The algorithm works by comparing the
     * structures of the inputs, elements by element. The substitution theta that is
     * the argument to UNIFY is built up along the way and is used to make sure that
     *
Download .txt
gitextract_gi623cc4/

├── .gitattributes
├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── aima-csharp/
│   ├── App.config
│   ├── Program.cs
│   ├── Properties/
│   │   └── AssemblyInfo.cs
│   ├── agent/
│   │   ├── Action.cs
│   │   ├── Agent.cs
│   │   ├── AgentProgram.cs
│   │   ├── Environment.cs
│   │   ├── EnvironmentObject.cs
│   │   ├── EnvironmentState.cs
│   │   ├── EnvironmentView.cs
│   │   ├── EnvironmentViewNotifier.cs
│   │   ├── Model.cs
│   │   ├── Percept.cs
│   │   ├── State.cs
│   │   └── impl/
│   │       ├── AbstractAgent.cs
│   │       ├── AbstractEnvironment.cs
│   │       ├── DynamicAction.cs
│   │       ├── DynamicEnvironmentState.cs
│   │       ├── DynamicPercept.cs
│   │       ├── DynamicState.cs
│   │       ├── NoOpAction.cs
│   │       ├── ObjectWithDynamicAttributes.cs
│   │       ├── SimpleEnvironmentView.cs
│   │       └── aprog/
│   │           ├── ModelBasedReflexAgentProgram.cs
│   │           ├── SimpleReflexAgentProgram.cs
│   │           ├── TableDrivenAgentProgram.cs
│   │           └── simplerule/
│   │               ├── ANDCondition.cs
│   │               ├── Condition.cs
│   │               ├── EQUALCondition.cs
│   │               ├── NOTCondition.cs
│   │               ├── ORCondition.cs
│   │               └── Rule.cs
│   ├── aima-csharp.csproj
│   ├── environment/
│   │   ├── cellworld/
│   │   │   ├── Cell.cs
│   │   │   ├── CellWorld.cs
│   │   │   ├── CellWorldAction.cs
│   │   │   └── CellWorldFactory.cs
│   │   ├── eightpuzzle/
│   │   │   ├── BidirectionalEightPuzzleProblem.cs
│   │   │   ├── EightPuzzleBoard.cs
│   │   │   ├── EightPuzzleFunctionFactory.cs
│   │   │   ├── EightPuzzleGoalTest.cs
│   │   │   ├── ManhattanHeuristicFunction.cs
│   │   │   └── MisplacedTilleHeuristicFunction.cs
│   │   ├── map/
│   │   │   ├── AdaptableHeuristicFunction.cs
│   │   │   ├── BidirectionalMapProblem.cs
│   │   │   ├── DynAttributeNames.cs
│   │   │   ├── ExtendableMap.cs
│   │   │   ├── Map.cs
│   │   │   ├── MapAgent.cs
│   │   │   ├── MapEnvironment.cs
│   │   │   ├── MapEnvironmentState.cs
│   │   │   ├── MapFunctionFactory.cs
│   │   │   ├── MapStepCostFunction.cs
│   │   │   ├── MoveToAction.cs
│   │   │   ├── Scenario.cs
│   │   │   ├── SimplifiedRoadMapOfAustralia.cs
│   │   │   ├── SimplifiedRoadMapOfPartOfRomania.cs
│   │   │   └── StraightLineDistanceHeuristicFunction.cs
│   │   └── wumpusworld/
│   │       ├── AgentPercept.cs
│   │       ├── AgentPosition.cs
│   │       ├── ManhattanHeuristicFunction.cs
│   │       └── Room.cs
│   ├── logic/
│   │   ├── common/
│   │   │   ├── Lexer.cs
│   │   │   ├── LexerException.cs
│   │   │   ├── LogicTokenTypes.cs
│   │   │   ├── Parser.cs
│   │   │   ├── ParserException.cs
│   │   │   ├── ParserTreeNode.cs
│   │   │   └── Token.cs
│   │   ├── fol/
│   │   │   ├── CNFConverter.cs
│   │   │   ├── Connectors.cs
│   │   │   ├── PredicateCollector.cs
│   │   │   ├── Quantifiers.cs
│   │   │   ├── StandardizeApart.cs
│   │   │   ├── StandardizeApartInPlace.cs
│   │   │   ├── StandardizeApartIndexical.cs
│   │   │   ├── StandardizeApartIndexicalFactory.cs
│   │   │   ├── StandardizeApartResult.cs
│   │   │   ├── SubstVisitor.cs
│   │   │   ├── SubsumptionElimination.cs
│   │   │   ├── Unifier.cs
│   │   │   ├── VariableCollector.cs
│   │   │   ├── domain/
│   │   │   │   ├── DomainFactory.cs
│   │   │   │   ├── FOLDomain.cs
│   │   │   │   ├── FOLDomainAnswerLiteralAddedEvent.cs
│   │   │   │   ├── FOLDomainEvent.cs
│   │   │   │   ├── FOLDomainListener.cs
│   │   │   │   ├── FOLDomainSkolemConstantAddedEvent.cs
│   │   │   │   └── FOLDomainSkolemFunctionAddedEvent.cs
│   │   │   ├── inference/
│   │   │   │   ├── AbstractModulation.cs
│   │   │   │   ├── Demodulation.cs
│   │   │   │   ├── FOLBCAsk.cs
│   │   │   │   ├── FOLFCAsk.cs
│   │   │   │   ├── FOLModelElimination.cs
│   │   │   │   ├── FOLOTTERLikeTheoremProver.cs
│   │   │   │   ├── FOLTFMResolution.cs
│   │   │   │   ├── InferenceProcedure.cs
│   │   │   │   ├── InferenceResult.cs
│   │   │   │   ├── InferenceResultPrinter.cs
│   │   │   │   ├── Paramodulation.cs
│   │   │   │   ├── otter/
│   │   │   │   │   ├── ClauseFilter.cs
│   │   │   │   │   ├── ClauseSimplifier.cs
│   │   │   │   │   ├── LightestClauseHeuristic.cs
│   │   │   │   │   └── defaultimpl/
│   │   │   │   │       ├── DefaultClauseFilter.cs
│   │   │   │   │       ├── DefaultClauseSimplifier.cs
│   │   │   │   │       └── DefaultLightestClauseHeuristic.cs
│   │   │   │   ├── proof/
│   │   │   │   │   ├── AbstractProofStep.cs
│   │   │   │   │   ├── Proof.cs
│   │   │   │   │   ├── ProofFinal.cs
│   │   │   │   │   ├── ProofPrinter.cs
│   │   │   │   │   ├── ProofStep.cs
│   │   │   │   │   ├── ProofStepBwChGoal.cs
│   │   │   │   │   ├── ProofStepChainCancellation.cs
│   │   │   │   │   ├── ProofStepChainContrapositive.cs
│   │   │   │   │   ├── ProofStepChainDropped.cs
│   │   │   │   │   ├── ProofStepChainFromClause.cs
│   │   │   │   │   ├── ProofStepChainReduction.cs
│   │   │   │   │   ├── ProofStepClauseBinaryResolvent.cs
│   │   │   │   │   ├── ProofStepClauseClausifySentence.cs
│   │   │   │   │   ├── ProofStepClauseDemodulation.cs
│   │   │   │   │   ├── ProofStepClauseFactor.cs
│   │   │   │   │   ├── ProofStepClauseParamodulation.cs
│   │   │   │   │   ├── ProofStepFoChAlreadyAFact.cs
│   │   │   │   │   ├── ProofStepFoChAssertFact.cs
│   │   │   │   │   ├── ProofStepGoal.cs
│   │   │   │   │   ├── ProofStepPremise.cs
│   │   │   │   │   └── ProofStepRenaming.cs
│   │   │   │   └── trace/
│   │   │   │       ├── FOLModelEliminationTracer.cs
│   │   │   │       └── FOLTFMResolutiontracer.cs
│   │   │   ├── kb/
│   │   │   │   ├── FOLKnowledgeBase.cs
│   │   │   │   ├── FOLKnowledgeBaseFactory.cs
│   │   │   │   └── data/
│   │   │   │       ├── CNF.cs
│   │   │   │       ├── Chain.cs
│   │   │   │       ├── Clause.cs
│   │   │   │       ├── Literal.cs
│   │   │   │       └── ReducedLiteral.cs
│   │   │   └── parsing/
│   │   │       ├── AbstractFOLVisitor.cs
│   │   │       ├── FOLLexer.cs
│   │   │       ├── FOLParser.cs
│   │   │       ├── FOLVisitor.cs
│   │   │       └── ast/
│   │   │           ├── AtomicSentence.cs
│   │   │           ├── ConnectedSentence.cs
│   │   │           ├── Constant.cs
│   │   │           ├── FOLNode.cs
│   │   │           ├── Function.cs
│   │   │           ├── NotSentence.cs
│   │   │           ├── Predicate.cs
│   │   │           ├── QuantifiedSentence.cs
│   │   │           ├── Sentence.cs
│   │   │           ├── Term.cs
│   │   │           ├── TermEquality.cs
│   │   │           └── Variable.cs
│   │   └── propositional/
│   │       ├── agent/
│   │       │   └── KBAgent.cs
│   │       ├── kb/
│   │       │   └── KnowledgeBase.cs
│   │       └── parsing/
│   │           ├── PLVisitor.cs
│   │           └── ast/
│   │               ├── AtomicSentence.cs
│   │               ├── ComplexSentence.cs
│   │               ├── Connective.cs
│   │               ├── PropositionSymbol.cs
│   │               └── Sentence.cs
│   ├── search/
│   │   ├── Local/
│   │   │   ├── FitnessFunction.cs
│   │   │   ├── Individual.cs
│   │   │   └── Scheduler.cs
│   │   ├── framework/
│   │   │   ├── CutOffIndicatorAction.cs
│   │   │   ├── EvaluationFunction.cs
│   │   │   ├── HeuristicFunction.cs
│   │   │   ├── Metrics.cs
│   │   │   ├── Node.cs
│   │   │   ├── NodeExpander.cs
│   │   │   ├── PathCostFunction.cs
│   │   │   ├── PerceptToStateFunction.cs
│   │   │   ├── Search.cs
│   │   │   ├── SearchAgent.cs
│   │   │   ├── SearchForActions.cs
│   │   │   ├── SearchUtils.cs
│   │   │   ├── SimpleProblemSolvingAgent.cs
│   │   │   ├── SolutionChecker.cs
│   │   │   ├── problem/
│   │   │   │   ├── ActionsFunction.cs
│   │   │   │   ├── BidirectionalProblem.cs
│   │   │   │   ├── DefaultGoalTest.cs
│   │   │   │   ├── DefaultStepCostFunction.cs
│   │   │   │   ├── GoalTest.cs
│   │   │   │   ├── Problem.cs
│   │   │   │   ├── ResultFunction.cs
│   │   │   │   └── StepCostFunction.cs
│   │   │   └── qsearch/
│   │   │       ├── GraphSearch.cs
│   │   │       ├── GraphSearchBFS.cs
│   │   │       ├── QueueSearch.cs
│   │   │       └── TreeSearch.cs
│   │   └── online/
│   │       ├── LRTAStarAgent.cs
│   │       ├── OnlineDFSAgent.cs
│   │       └── OnlineSearchProblem.cs
│   └── util/
│       ├── ArrayIterator.cs
│       ├── CSharpRandomizer.cs
│       ├── DisjointSets.cs
│       ├── FrequencyCounter.cs
│       ├── Interval.cs
│       ├── LUDecomposition.cs
│       ├── LabeledGraph.cs
│       ├── LinkedHashSet.cs
│       ├── Matrix.cs
│       ├── MixedRadixNumber.cs
│       ├── MockRandomizer.cs
│       ├── Pair.cs
│       ├── Point2D.cs
│       ├── Randomizer.cs
│       ├── SetOps.cs
│       ├── Table.cs
│       ├── Triplet.cs
│       ├── TwoKeyHashMap.cs
│       ├── Util.cs
│       ├── Vector.cs
│       └── XYLocation.cs
├── aima-csharp-unity/
│   ├── .gitignore
│   └── README.md
└── aima-csharp.sln
Download .txt
SYMBOL INDEX (1704 symbols across 210 files)

FILE: aima-csharp/Program.cs
  class Program (line 9) | class Program
    method Main (line 11) | static void Main(string[] args)

FILE: aima-csharp/agent/Action.cs
  type Action (line 11) | public interface Action
    method isNoOp (line 20) | bool isNoOp();

FILE: aima-csharp/agent/Agent.cs
  type Agent (line 14) | public interface Agent : EnvironmentObject
    method execute (line 25) | Action execute(Percept percept);
    method isAlive (line 32) | bool isAlive();
    method setAlive (line 41) | void setAlive(bool alive);

FILE: aima-csharp/agent/AgentProgram.cs
  type AgentProgram (line 15) | public interface AgentProgram
    method execute (line 25) | Action execute(Percept percept);

FILE: aima-csharp/agent/Environment.cs
  type Environment (line 14) | public interface Environment
    method getAgents (line 21) | List<Agent> getAgents();
    method addAgent (line 29) | void addAgent(Agent agent);
    method removeAgent (line 37) | void removeAgent(Agent agent);
    method getEnvironmentObjects (line 44) | List<EnvironmentObject> getEnvironmentObjects();
    method addEnvironmentObject (line 52) | void addEnvironmentObject(EnvironmentObject eo);
    method removeEnvironmentObject (line 60) | void removeEnvironmentObject(EnvironmentObject eo);
    method step (line 65) | void step();
    method step (line 73) | void step(int n);
    method stepUntilDone (line 78) | void stepUntilDone();
    method isDone (line 87) | bool isDone();
    method getPerformanceMeasure (line 96) | double getPerformanceMeasure(Agent forAgent);
    method addEnvironmentView (line 104) | void addEnvironmentView(EnvironmentView ev);
    method removeEnvironmentView (line 112) | void removeEnvironmentView(EnvironmentView ev);
    method notifyViews (line 120) | void notifyViews(String msg);

FILE: aima-csharp/agent/EnvironmentObject.cs
  type EnvironmentObject (line 13) | public interface EnvironmentObject

FILE: aima-csharp/agent/EnvironmentState.cs
  type EnvironmentState (line 11) | public interface EnvironmentState

FILE: aima-csharp/agent/EnvironmentView.cs
  type EnvironmentView (line 14) | public interface EnvironmentView
    method notify (line 23) | void notify(String msg);
    method agentAdded (line 35) | void agentAdded(Agent agent, EnvironmentState resultingState);
    method agentActed (line 48) | void agentActed(Agent agent, Action action, EnvironmentState resulting...

FILE: aima-csharp/agent/EnvironmentViewNotifier.cs
  type EnvironmentViewNotifier (line 10) | public interface EnvironmentViewNotifier
    method notifyViews (line 19) | void notifyViews(String msg);

FILE: aima-csharp/agent/Model.cs
  type Model (line 15) | public interface Model

FILE: aima-csharp/agent/Percept.cs
  type Percept (line 13) | public interface Percept

FILE: aima-csharp/agent/State.cs
  type State (line 16) | public interface State

FILE: aima-csharp/agent/impl/AbstractAgent.cs
  class AbstractAgent (line 11) | public abstract class AbstractAgent : Agent
    method AbstractAgent (line 16) | public AbstractAgent()
    method AbstractAgent (line 28) | public AbstractAgent(AgentProgram aProgram)
    method execute (line 34) | public virtual Action execute(Percept p)
    method isAlive (line 43) | public bool isAlive()
    method setAlive (line 48) | public void setAlive(bool alive)

FILE: aima-csharp/agent/impl/AbstractEnvironment.cs
  class AbstractEnvironment (line 12) | public abstract class AbstractEnvironment : Environment, EnvironmentView...
    method getCurrentState (line 28) | public abstract EnvironmentState getCurrentState();
    method executeAction (line 30) | public abstract EnvironmentState executeAction(Agent agent, Action act...
    method getPerceptSeenBy (line 32) | public abstract Percept getPerceptSeenBy(Agent anAgent);
    method createExogenousChange (line 38) | public void createExogenousChange() { }
    method getAgents (line 41) | public List<Agent> getAgents()
    method addAgent (line 47) | public void addAgent(Agent a)
    method removeAgent (line 52) | public void removeAgent(Agent a)
    method getEnvironmentObjects (line 57) | public List<EnvironmentObject> getEnvironmentObjects()
    method addEnvironmentObject (line 63) | public void addEnvironmentObject(EnvironmentObject eo)
    method removeEnvironmentObject (line 77) | public void removeEnvironmentObject(EnvironmentObject eo)
    method step (line 89) | public void step()
    method step (line 103) | public void step(int n)
    method stepUntilDone (line 111) | public void stepUntilDone()
    method isDone (line 119) | public bool isDone()
    method getPerformanceMeasure (line 131) | public double getPerformanceMeasure(Agent forAgent)
    method addEnvironmentView (line 143) | public void addEnvironmentView(EnvironmentView ev)
    method removeEnvironmentView (line 148) | public void removeEnvironmentView(EnvironmentView ev)
    method notifyViews (line 153) | public void notifyViews(String msg)
    method updatePerformanceMeasure (line 165) | protected void updatePerformanceMeasure(Agent forAgent, double addTo)
    method updateEnvironmentViewsAgentAdded (line 171) | protected void updateEnvironmentViewsAgentAdded(Agent agent)
    method updateEnvironmentViewsAgentActed (line 179) | protected void updateEnvironmentViewsAgentActed(Agent agent, Action ac...

FILE: aima-csharp/agent/impl/DynamicAction.cs
  class DynamicAction (line 10) | public class DynamicAction : ObjectWithDynamicAttributes,
    method DynamicAction (line 15) | public DynamicAction(String name)
    method getName (line 25) | public String getName()
    method isNoOp (line 31) | public bool isNoOp()
    method describeType (line 37) | public String describeType()

FILE: aima-csharp/agent/impl/DynamicEnvironmentState.cs
  class DynamicEnvironmentState (line 11) | public class DynamicEnvironmentState : ObjectWithDynamicAttributes, Envi...
    method DynamicEnvironmentState (line 13) | public DynamicEnvironmentState()
    method describeType (line 18) | public String describeType()

FILE: aima-csharp/agent/impl/DynamicPercept.cs
  class DynamicPercept (line 12) | public class DynamicPercept : ObjectWithDynamicAttributes, Percept
    method DynamicPercept (line 14) | public DynamicPercept()
    method describeType (line 19) | public String describeType()
    method DynamicPercept (line 32) | public DynamicPercept(Object key1, Object value1)
    method DynamicPercept (line 50) | public DynamicPercept(Object key1, Object value1, Object key2, Object ...
    method DynamicPercept (line 64) | public DynamicPercept(Object[] keys, Object[] values)

FILE: aima-csharp/agent/impl/DynamicState.cs
  class DynamicState (line 10) | public class DynamicState : ObjectWithDynamicAttributes, State
    method DynamicState (line 12) | public DynamicState()
    method describeType (line 18) | public String describeType()

FILE: aima-csharp/agent/impl/NoOpAction.cs
  class NoOpAction (line 6) | public class NoOpAction : DynamicAction
    method isNoOp (line 11) | public bool isNoOp()
    method NoOpAction (line 17) | private NoOpAction() : base("NoOp")

FILE: aima-csharp/agent/impl/ObjectWithDynamicAttributes.cs
  class ObjectWithDynamicAttributes (line 12) | public abstract class ObjectWithDynamicAttributes
    method describeType (line 24) | public String describeType()
    method describeAttributes (line 34) | public String describeAttributes()
    method getKeySet (line 65) | public HashSet<Object> getKeySet()
    method setAttribute (line 80) | public void setAttribute(Object key, Object value)
    method getAttribute (line 94) | public Object getAttribute(Object key)
    method removeAttribute (line 106) | public void removeAttribute(Object key)
    method copy (line 115) | public ObjectWithDynamicAttributes copy()
    method Equals (line 135) | public override bool Equals(Object o)
    method GetHashCode (line 144) | public override int GetHashCode()
    method ToString (line 149) | public override String ToString()

FILE: aima-csharp/agent/impl/SimpleEnvironmentView.cs
  class SimpleEnvironmentView (line 13) | public class SimpleEnvironmentView : EnvironmentView
    method agentActed (line 15) | public void agentActed(Agent agent, Action action, EnvironmentState re...
    method agentAdded (line 20) | public void agentAdded(Agent agent, EnvironmentState resultingState)
    method notify (line 25) | public void notify(string msg)

FILE: aima-csharp/agent/impl/aprog/ModelBasedReflexAgentProgram.cs
  class ModelBasedReflexAgentProgram (line 34) | public abstract class ModelBasedReflexAgentProgram : AgentProgram
    method ModelBasedReflexAgentProgram (line 49) | public ModelBasedReflexAgentProgram()
    method setState (line 60) | public void setState(DynamicState dstate)
    method setModel (line 73) | public void setModel(Model mod)
    method setRules (line 84) | public void setRules(HashSet<Rule> ruleSet)
    method execute (line 92) | public Action execute(Percept percept)
    method init (line 112) | protected abstract void init();
    method updateState (line 114) | protected abstract DynamicState updateState(DynamicState state, Action...
    method ruleMatch (line 116) | protected Rule ruleMatch(DynamicState state, HashSet<Rule> rules)
    method ruleAction (line 128) | protected Action ruleAction(Rule r)

FILE: aima-csharp/agent/impl/aprog/SimpleReflexAgentProgram.cs
  class SimpleReflexAgentProgram (line 30) | public class SimpleReflexAgentProgram : AgentProgram
    method SimpleReflexAgentProgram (line 42) | public SimpleReflexAgentProgram(HashSet<Rule> ruleSet)
    method execute (line 50) | public Action execute(Percept percept)
    method interpretInput (line 65) | protected ObjectWithDynamicAttributes interpretInput(Percept p)
    method ruleMatch (line 70) | protected Rule ruleMatch(ObjectWithDynamicAttributes state,
    method ruleAction (line 83) | protected Action ruleAction(Rule r)

FILE: aima-csharp/agent/impl/aprog/TableDrivenAgentProgram.cs
  class TableDrivenAgentProgram (line 30) | public class TableDrivenAgentProgram : AgentProgram
    method TableDrivenAgentProgram (line 48) | public TableDrivenAgentProgram(Dictionary<List<Percept>, Action> perce...
    method execute (line 66) | public Action execute(Percept percept)
    method lookupCurrentAction (line 79) | private Action lookupCurrentAction()

FILE: aima-csharp/agent/impl/aprog/simplerule/ANDCondition.cs
  class ANDCondition (line 15) | public class ANDCondition : Condition
    method ANDCondition (line 21) | public ANDCondition(Condition leftCon, Condition rightCon)
    method evaluate (line 30) | public override bool evaluate(ObjectWithDynamicAttributes p)
    method ToString (line 35) | public override String ToString()

FILE: aima-csharp/agent/impl/aprog/simplerule/Condition.cs
  class Condition (line 13) | public abstract class Condition
    method evaluate (line 15) | public abstract bool evaluate(ObjectWithDynamicAttributes p);
    method Equals (line 17) | public bool Equals(Object o)
    method GetHashCode (line 26) | public override int GetHashCode()

FILE: aima-csharp/agent/impl/aprog/simplerule/EQUALCondition.cs
  class EQUALCondition (line 15) | public class EQUALCondition : Condition
    method EQUALCondition (line 21) | public EQUALCondition(Object k, Object val)
    method evaluate (line 30) | public override bool evaluate(ObjectWithDynamicAttributes p)
    method ToString (line 35) | public override String ToString()

FILE: aima-csharp/agent/impl/aprog/simplerule/NOTCondition.cs
  class NOTCondition (line 15) | public class NOTCondition : Condition
    method NOTCondition (line 19) | public NOTCondition(Condition c)
    method evaluate (line 26) | public override bool evaluate(ObjectWithDynamicAttributes p)
    method ToString (line 31) | public override String ToString()

FILE: aima-csharp/agent/impl/aprog/simplerule/ORCondition.cs
  class ORCondition (line 15) | public class ORCondition : Condition
    method ORCondition (line 21) | public ORCondition(Condition leftCon, Condition rightCon)
    method evaluate (line 30) | public override bool evaluate(ObjectWithDynamicAttributes p)
    method ToString (line 35) | public override String ToString()

FILE: aima-csharp/agent/impl/aprog/simplerule/Rule.cs
  class Rule (line 15) | public class Rule
    method Rule (line 30) | public Rule(Condition c, Action act)
    method evaluate (line 39) | public bool evaluate(ObjectWithDynamicAttributes p)
    method getAction (line 49) | public Action getAction()
    method Equals (line 54) | public override bool Equals(System.Object o)
    method GetHashCode (line 63) | public override int GetHashCode()
    method ToString (line 68) | public override System.String ToString()

FILE: aima-csharp/environment/cellworld/Cell.cs
  class Cell (line 16) | public class Cell<C>
    method Cell (line 32) | public Cell(int x, int y, C content)
    method getX (line 43) | public int getX()
    method getY (line 52) | public int getY()
    method getContent (line 61) | public C getContent()
    method setContent (line 72) | public void setContent(C content)
    method toString (line 77) | public String toString()
    method equals (line 82) | public bool equals(Object o)
    method hashCode (line 91) | public int hashCode()

FILE: aima-csharp/environment/cellworld/CellWorld.cs
  class CellWorld (line 25) | public class CellWorld<C>
    method CellWorld (line 41) | public CellWorld(int xDimension, int yDimension, C defaultCellContent)
    method getCells (line 60) | public LinkedHashSet<Cell<C>> getCells()
    method result (line 79) | public Cell<C> result(Cell<C> s, CellWorldAction a)
    method removeCell (line 101) | public void removeCell(int x, int y)
    method getCellAt (line 121) | public Cell<C> getCellAt(int x, int y)

FILE: aima-csharp/environment/cellworld/CellWorldAction.cs
  class CellWorldAction (line 20) | public class CellWorldAction : Action
    method CellWorldAction (line 22) | public CellWorldAction()
    method CellWorldAction (line 27) | public CellWorldAction(ActionEnum action)
    type ActionEnum (line 33) | public enum ActionEnum
    method CellWorldAction (line 43) | static CellWorldAction()
    method actions (line 56) | public static LinkedHashSet<ActionEnum> actions()
    method isNoOp (line 63) | public bool isNoOp()
    method getXResult (line 80) | public int getXResult(int curX)
    method getYResult (line 102) | public int getYResult(int curY)
    method getFirstRightAngledAction (line 122) | public ActionEnum getFirstRightAngledAction()
    method getSecondRightAngledAction (line 147) | public ActionEnum getSecondRightAngledAction()

FILE: aima-csharp/environment/cellworld/CellWorldFactory.cs
  class CellWorldFactory (line 11) | public class CellWorldFactory
    method createCellWorldForFig17_1 (line 20) | public static CellWorld<Double> createCellWorldForFig17_1()

FILE: aima-csharp/environment/eightpuzzle/BidirectionalEightPuzzleProblem.cs
  class BidirectionalEightPuzzleProblem (line 10) | public class BidirectionalEightPuzzleProblem : Problem, BidirectionalPro...
    method BidirectionalEightPuzzleProblem (line 14) | public BidirectionalEightPuzzleProblem(EightPuzzleBoard initialState):...
    method getOriginalProblem (line 23) | public Problem getOriginalProblem()
    method getReverseProblem (line 28) | public Problem getReverseProblem()

FILE: aima-csharp/environment/eightpuzzle/EightPuzzleBoard.cs
  class EightPuzzleBoard (line 13) | public class EightPuzzleBoard
    method EightPuzzleBoard (line 27) | public EightPuzzleBoard()
    method EightPuzzleBoard (line 32) | public EightPuzzleBoard(int[] state)
    method EightPuzzleBoard (line 38) | public EightPuzzleBoard(EightPuzzleBoard copyBoard): this(copyBoard.ge...
    method getState (line 43) | public int[] getState()
    method getValueAt (line 48) | public int getValueAt(XYLocation loc)
    method getLocationOf (line 53) | public XYLocation getLocationOf(int val)
    method moveGapRight (line 59) | public void moveGapRight()
    method moveGapLeft (line 72) | public void moveGapLeft()
    method moveGapDown (line 85) | public void moveGapDown()
    method moveGapUp (line 98) | public void moveGapUp()
    method getPositions (line 111) | public List<XYLocation> getPositions()
    method setBoard (line 125) | public void setBoard(List<XYLocation> locs)
    method canMoveGap (line 136) | public bool canMoveGap(agent.Action where)
    method equals (line 151) | public bool equals(Object o)
    method hashCode (line 174) | public int hashCode()
    method toString (line 185) | public String toString()
    method getXCoord (line 199) | private int getXCoord(int absPos)
    method getYCoord (line 208) | private int getYCoord(int absPos)
    method getAbsPosition (line 213) | private int getAbsPosition(int x, int y)
    method getValueAt (line 218) | private int getValueAt(int x, int y)
    method getGapPosition (line 224) | private int getGapPosition()
    method getPositionOf (line 229) | private int getPositionOf(int val)
    method setValue (line 242) | private void setValue(int x, int y, int val)

FILE: aima-csharp/environment/eightpuzzle/EightPuzzleFunctionFactory.cs
  class EightPuzzleFunctionFactory (line 12) | public class EightPuzzleFunctionFactory
    method getActionsFunction (line 17) | public static ActionsFunction getActionsFunction()
    method getResultFunction (line 26) | public static ResultFunction getResultFunction()
    class EPActionsFunction (line 35) | private class EPActionsFunction : ActionsFunction
      method actions (line 37) | public HashSet<Action> actions(System.Object state)
    class EPResultFunction (line 64) | private class EPResultFunction : ResultFunction
      method result (line 66) | public System.Object result(System.Object s, Action a)

FILE: aima-csharp/environment/eightpuzzle/EightPuzzleGoalTest.cs
  class EightPuzzleGoalTest (line 11) | public class EightPuzzleGoalTest : GoalTest
    method isGoalState (line 16) | public bool isGoalState(Object state)

FILE: aima-csharp/environment/eightpuzzle/ManhattanHeuristicFunction.cs
  class ManhattanHeuristicFunction (line 12) | public class ManhattanHeuristicFunction : HeuristicFunction
    method h (line 14) | public double h(Object state)
    method evaluateManhattanDistanceOf (line 26) | public int evaluateManhattanDistanceOf(int i, XYLocation loc)

FILE: aima-csharp/environment/eightpuzzle/MisplacedTilleHeuristicFunction.cs
  class MisplacedTilleHeuristicFunction (line 12) | public class MisplacedTilleHeuristicFunction : HeuristicFunction
    method h (line 14) | public double h(Object state)
    method getNumberOfMisplacedTiles (line 20) | private int getNumberOfMisplacedTiles(EightPuzzleBoard board)

FILE: aima-csharp/environment/map/AdaptableHeuristicFunction.cs
  class AdaptableHeuristicFunction (line 14) | public abstract class AdaptableHeuristicFunction
    method adaptToGoal (line 25) | public AdaptableHeuristicFunction adaptToGoal(Object goal, Map map)

FILE: aima-csharp/environment/map/BidirectionalMapProblem.cs
  class BidirectionalMapProblem (line 11) | public class BidirectionalMapProblem : Problem, BidirectionalProblem
    method BidirectionalMapProblem (line 17) | public BidirectionalMapProblem(Map map, String initialState, String go...
    method BidirectionalMapProblem (line 22) | public BidirectionalMapProblem(Map map, String initialState, String go...
    method getOriginalProblem (line 33) | public Problem getOriginalProblem()
    method getReverseProblem (line 38) | public Problem getReverseProblem()

FILE: aima-csharp/environment/map/DynAttributeNames.cs
  class DynAttributeNames (line 17) | public class DynAttributeNames

FILE: aima-csharp/environment/map/ExtendableMap.cs
  class ExtendableMap (line 17) | public class ExtendableMap : Map
    method ExtendableMap (line 29) | public ExtendableMap()
    method clear (line 36) | public void clear()
    method clearLinks (line 43) | public void clearLinks()
    method getLocations (line 49) | public List<String> getLocations()
    method isLocation (line 55) | public bool isLocation(String str)
    method getPossibleNextLocations (line 64) | public List<String> getPossibleNextLocations(String location)
    method getPossiblePrevLocations (line 77) | public List<String> getPossiblePrevLocations(String location)
    method getDistance (line 86) | public Double getDistance(String fromLocation, String toLocation)
    method addUnidirectionalLink (line 92) | public void addUnidirectionalLink(String fromLocation, String toLocati...
    method addBidirectionalLink (line 101) | public void addBidirectionalLink(String fromLocation, String toLocatio...
    method randomlyGenerateDestination (line 110) | public String randomlyGenerateDestination()
    method removeUnidirectionalLink (line 116) | public void removeUnidirectionalLink(String fromLocation, String toLoc...
    method removeBidirectionalLink (line 122) | public void removeBidirectionalLink(String fromLocation, String toLoca...
    method setPosition (line 132) | public void setPosition(String loc, double x, double y)
    method setDistAndDirToRefLocation (line 151) | public void setDistAndDirToRefLocation(String loc, double dist, int dir)
    method getPosition (line 162) | public Point2D getPosition(String loc)

FILE: aima-csharp/environment/map/Map.cs
  type Map (line 12) | public interface Map
    method getLocations (line 15) | List<String> getLocations();
    method getPossibleNextLocations (line 21) | List<String> getPossibleNextLocations(String location);
    method getPossiblePrevLocations (line 27) | List<String> getPossiblePrevLocations(String location);
    method getDistance (line 33) | Double getDistance(String fromLocation, String toLocation);
    method getPosition (line 39) | Point2D getPosition(String loc);
    method randomlyGenerateDestination (line 44) | String randomlyGenerateDestination();

FILE: aima-csharp/environment/map/MapAgent.cs
  class MapAgent (line 14) | public class MapAgent : SimpleProblemSolvingAgent
    method MapAgent (line 24) | public MapAgent(Map map, EnvironmentViewNotifier notifier, Search search)
    method MapAgent (line 31) | public MapAgent(Map map, EnvironmentViewNotifier notifier, Search search,
    method MapAgent (line 39) | public MapAgent(Map map, EnvironmentViewNotifier notifier, Search search,
    method updateState (line 51) | protected override State updateState(Percept p)
    method formulateGoal (line 60) | protected override Object formulateGoal()
    method formulateProblem (line 78) | protected override Problem formulateProblem(Object goal)
    method search (line 85) | protected override List<agent.Action> search(Problem problem)
    method notifyViewOfMetrics (line 103) | protected override void notifyViewOfMetrics()

FILE: aima-csharp/environment/map/MapEnvironment.cs
  class MapEnvironment (line 13) | public class MapEnvironment : AbstractEnvironment
    method MapEnvironment (line 18) | public MapEnvironment(Map map)
    method addAgent (line 23) | public void addAgent(Agent a, string startLocation)
    method getAgentLocation (line 32) | public string getAgentLocation(Agent a)
    method getAgentTravelDistance (line 37) | public double getAgentTravelDistance(Agent a)
    method getCurrentState (line 42) | public override EnvironmentState getCurrentState()
    method executeAction (line 47) | public override EnvironmentState executeAction(Agent agent, Action a)
    method getPerceptSeenBy (line 66) | public override Percept getPerceptSeenBy(Agent anAgent)
    method getMap (line 72) | public Map getMap()

FILE: aima-csharp/environment/map/MapEnvironmentState.cs
  class MapEnvironmentState (line 11) | public class MapEnvironmentState : EnvironmentState
    method MapEnvironmentState (line 15) | public MapEnvironmentState()
    method getAgentLocation (line 20) | public string getAgentLocation(Agent a)
    method getAgentTravelDistance (line 30) | public double getAgentTravelDistance(Agent a)
    method setAgentLocationAndTravelDistance (line 40) | public void setAgentLocationAndTravelDistance(Agent a, string location,

FILE: aima-csharp/environment/map/MapFunctionFactory.cs
  class MapFunctionFactory (line 14) | public class MapFunctionFactory
    method getActionsFunction (line 19) | public static ActionsFunction getActionsFunction(Map map)
    method getReverseActionsFunction (line 24) | public static ActionsFunction getReverseActionsFunction(Map map)
    method getResultFunction (line 29) | public static ResultFunction getResultFunction()
    class MapActionsFunction (line 38) | private class MapActionsFunction : ActionsFunction
      method MapActionsFunction (line 43) | public MapActionsFunction(Map map, bool reverseMode)
      method actions (line 49) | public HashSet<Action> actions(System.Object state)
    method getPerceptToStateFunction (line 64) | public static PerceptToStateFunction getPerceptToStateFunction()
    class MapResultFunction (line 73) | private class MapResultFunction : ResultFunction
      method MapResultFunction (line 75) | public MapResultFunction()
      method result (line 79) | public System.Object result(System.Object s, Action a)
    class MapPerceptToStateFunction (line 95) | private class MapPerceptToStateFunction :
      method getState (line 98) | public System.Object getState(Percept p)

FILE: aima-csharp/environment/map/MapStepCostFunction.cs
  class MapStepCostFunction (line 15) | public class MapStepCostFunction : StepCostFunction
    method MapStepCostFunction (line 23) | public MapStepCostFunction(Map map)
    method c (line 30) | public double c(object fromCurrentState, Action action, object toNextS...

FILE: aima-csharp/environment/map/MoveToAction.cs
  class MoveToAction (line 7) | public class MoveToAction : DynamicAction
    method MoveToAction (line 11) | public MoveToAction(String location) : base("moveTo")
    method getToLocation (line 16) | public String getToLocation()

FILE: aima-csharp/environment/map/Scenario.cs
  class Scenario (line 12) | public class Scenario
    method Scenario (line 36) | public Scenario(MapEnvironment env, Map agentMap, String agentLoc)
    method getEnv (line 43) | public MapEnvironment getEnv()
    method getEnvMap (line 48) | public Map getEnvMap()
    method getAgentMap (line 53) | public Map getAgentMap()
    method getInitAgentLocation (line 58) | public String getInitAgentLocation()

FILE: aima-csharp/environment/map/SimplifiedRoadMapOfAustralia.cs
  class SimplifiedRoadMapOfAustralia (line 14) | public class SimplifiedRoadMapOfAustralia : ExtendableMap
    method SimplifiedRoadMapOfAustralia (line 16) | public SimplifiedRoadMapOfAustralia()
    method initMap (line 67) | public static void initMap(ExtendableMap map)

FILE: aima-csharp/environment/map/SimplifiedRoadMapOfPartOfRomania.cs
  class SimplifiedRoadMapOfPartOfRomania (line 17) | public class SimplifiedRoadMapOfPartOfRomania : ExtendableMap
    method SimplifiedRoadMapOfPartOfRomania (line 19) | public SimplifiedRoadMapOfPartOfRomania()
    method initMap (line 49) | public static void initMap(ExtendableMap map)

FILE: aima-csharp/environment/map/StraightLineDistanceHeuristicFunction.cs
  class StraightLineDistanceHeuristicFunction (line 9) | public class StraightLineDistanceHeuristicFunction : AdaptableHeuristicF...
    method StraightLineDistanceHeuristicFunction (line 11) | public StraightLineDistanceHeuristicFunction(Object goal, Map map)
    method h (line 17) | public double h(Object state)

FILE: aima-csharp/environment/wumpusworld/AgentPercept.cs
  class AgentPercept (line 25) | public class AgentPercept : Percept
    method AgentPercept (line 36) | public AgentPercept()
    method AgentPercept (line 54) | public AgentPercept(bool stench, bool breeze, bool glitter,
    method isStench (line 64) | public bool isStench()
    method setStench (line 69) | public void setStench(bool stench)
    method isBreeze (line 74) | public bool isBreeze()
    method setBreeze (line 79) | public void setBreeze(bool breeze)
    method isGlitter (line 84) | public bool isGlitter()
    method setGlitter (line 89) | public void setGlitter(bool glitter)
    method isBump (line 94) | public bool isBump()
    method setBump (line 99) | public void setBump(bool bump)
    method isScream (line 104) | public bool isScream()
    method setScream (line 109) | public void setScream(bool scream)
    method toString (line 114) | public string toString()

FILE: aima-csharp/environment/wumpusworld/AgentPosition.cs
  class AgentPosition (line 5) | internal class AgentPosition
    method getX (line 7) | internal int getX()
    method getY (line 12) | internal int getY()

FILE: aima-csharp/environment/wumpusworld/ManhattanHeuristicFunction.cs
  class ManhattanHeuristicFunction (line 14) | public class ManhattanHeuristicFunction : HeuristicFunction
    method ManhattanHeuristicFunction (line 18) | public ManhattanHeuristicFunction(HashSet<Room> goals)
    method h (line 23) | public double h(Object state)
    method evaluateManhattanDistanceOf (line 41) | private int evaluateManhattanDistanceOf(int x1, int y1, int x2, int y2)

FILE: aima-csharp/environment/wumpusworld/Room.cs
  class Room (line 15) | public class Room
    method Room (line 28) | public Room(int x, int y)
    method getX (line 38) | public int getX()
    method getY (line 47) | public int getY()
    method toString (line 52) | public string toString()
    method equals (line 57) | public bool equals(object o)
    method hashCode (line 70) | public int hashCode()

FILE: aima-csharp/logic/common/Lexer.cs
  class Lexer (line 17) | public abstract class Lexer
    method setInput (line 34) | public void setInput(String inputString)
    method setInput (line 46) | public void setInput(StringReader inputReader)
    method nextToken (line 59) | public abstract Token nextToken();
    method getCurrentPositionInInput (line 63) | protected int getCurrentPositionInInput()
    method lookAhead (line 71) | protected char lookAhead(int position)
    method consume (line 79) | protected void consume()
    method isEndOfInput (line 90) | private bool isEndOfInput(int i)
    method initializeLookAheadBuffer (line 98) | private void initializeLookAheadBuffer()
    method loadNextCharacterFromInput (line 121) | private void loadNextCharacterFromInput()
    method readInput (line 139) | private int readInput()

FILE: aima-csharp/logic/common/LexerException.cs
  class LexerException (line 14) | public class LexerException : SystemException
    method LexerException (line 20) | public LexerException(String message, int currentPositionInInput): bas...
    method LexerException (line 25) | public LexerException(String message, int currentPositionInInput,
    method getCurrentPositionInInputExceptionThrown (line 37) | public int getCurrentPositionInInputExceptionThrown()

FILE: aima-csharp/logic/common/LogicTokenTypes.cs
  type LogicTokenTypes (line 10) | public enum LogicTokenTypes : int

FILE: aima-csharp/logic/common/Parser.cs
  class Parser (line 19) | public abstract class Parser<S>
    method getLexer (line 31) | public abstract Lexer getLexer();
    method parse (line 41) | public S parse(String input)
    method parse (line 54) | public S parse(StringReader inputReader)
    method parse (line 80) | protected abstract S parse();
    method lookAhead (line 85) | protected Token lookAhead(int i)
    method consume (line 93) | protected void consume()
    method match (line 105) | protected void match(String toMatchSymbol)
    method initializeLookAheadBuffer (line 123) | private void initializeLookAheadBuffer()
    method loadNextTokenFromInput (line 142) | private void loadNextTokenFromInput()
    method isEndOfInput (line 163) | private bool isEndOfInput(Token t)

FILE: aima-csharp/logic/common/ParserException.cs
  class ParserException (line 14) | public class ParserException : SystemException
    method ParserException (line 20) | public ParserException(String message, params Token[] problematicToken...
    method ParserException (line 31) | public ParserException(String message, Exception cause, params Token[]...
    method getProblematicTokens (line 47) | public List<Token> getProblematicTokens()

FILE: aima-csharp/logic/common/ParserTreeNode.cs
  type ParseTreeNode (line 7) | public interface ParseTreeNode

FILE: aima-csharp/logic/common/Token.cs
  class Token (line 13) | public class Token
    method Token (line 30) | public Token(int type, String text, int startCharPositionInInput)
    method getText (line 42) | public String getText()
    method getType (line 52) | public int getType()
    method getStartCharPositionInInput (line 61) | public int getStartCharPositionInInput()
    method Equals (line 66) | public  override bool Equals(Object o)
    method GetHashCode (line 82) | public override int GetHashCode()
    method ToString (line 91) | public override String ToString()

FILE: aima-csharp/logic/fol/CNFConverter.cs
  class CNFConverter (line 24) | public class CNFConverter
    method CNFConverter (line 29) | public CNFConverter(FOLParser parser)
    method convertToCNF (line 46) | public CNF convertToCNF(Sentence aSentence)
  class ImplicationsOut (line 82) | class ImplicationsOut : FOLVisitor
    method ImplicationsOut (line 84) | public ImplicationsOut()
    method visitPredicate (line 89) | public Object visitPredicate(Predicate p, Object arg)
    method visitTermEquality (line 94) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitVariable (line 99) | public Object visitVariable(Variable variable, Object arg)
    method visitConstant (line 104) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 109) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 114) | public Object visitNotSentence(NotSentence notSentence, Object arg)
    method visitConnectedSentence (line 121) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...
    method visitQuantifiedSentence (line 149) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
  class NegationsIn (line 159) | class NegationsIn : FOLVisitor
    method NegationsIn (line 161) | public NegationsIn()
    method visitPredicate (line 166) | public Object visitPredicate(Predicate p, Object arg)
    method visitTermEquality (line 171) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitVariable (line 176) | public Object visitVariable(Variable variable, Object arg)
    method visitConstant (line 181) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 186) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 191) | public Object visitNotSentence(NotSentence notSentence, Object arg)
    method visitConnectedSentence (line 257) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...
    method visitQuantifiedSentence (line 264) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
  class StandardizeQuantiferVariables (line 274) | class StandardizeQuantiferVariables : FOLVisitor
    class ApartIndexical (line 279) | private class ApartIndexical : StandardizeApartIndexical
      method getPrefix (line 283) | public String getPrefix()
      method getNextIndex (line 288) | public int getNextIndex()
    method StandardizeQuantiferVariables (line 296) | public StandardizeQuantiferVariables(SubstVisitor substVisitor)
    method visitPredicate (line 301) | public Object visitPredicate(Predicate p, Object arg)
    method visitTermEquality (line 306) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitVariable (line 311) | public Object visitVariable(Variable variable, Object arg)
    method visitConstant (line 316) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 321) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 326) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 332) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...
    method visitQuantifiedSentence (line 339) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
  class RemoveQuantifiers (line 382) | class RemoveQuantifiers : FOLVisitor
    method RemoveQuantifiers (line 388) | public RemoveQuantifiers(FOLParser parser)
    method visitPredicate (line 395) | public Object visitPredicate(Predicate p, Object arg)
    method visitTermEquality (line 400) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitVariable (line 405) | public Object visitVariable(Variable variable, Object arg)
    method visitConstant (line 410) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 415) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 420) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 426) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...
    method visitQuantifiedSentence (line 433) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
  class DistributeOrOverAnd (line 496) | class DistributeOrOverAnd : FOLVisitor
    method DistributeOrOverAnd (line 499) | public DistributeOrOverAnd()
    method visitPredicate (line 504) | public Object visitPredicate(Predicate p, Object arg)
    method visitTermEquality (line 509) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitVariable (line 514) | public Object visitVariable(Variable variable, Object arg)
    method visitConstant (line 519) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 524) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 529) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 535) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...
    method visitQuantifiedSentence (line 582) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
  class CNFConstructor (line 592) | class CNFConstructor : FOLVisitor
    method CNFConstructor (line 594) | public CNFConstructor()
    method construct (line 599) | public CNF construct(Sentence orDistributedOverAnd)
    method visitPredicate (line 608) | public Object visitPredicate(Predicate p, Object arg)
    method visitTermEquality (line 622) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitVariable (line 636) | public Object visitVariable(Variable variable, Object arg)
    method visitConstant (line 642) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 648) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 654) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 665) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...
    method visitQuantifiedSentence (line 681) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
    class ArgData (line 690) | class ArgData
      method ArgData (line 695) | public ArgData()

FILE: aima-csharp/logic/fol/Connectors.cs
  class Connectors (line 9) | public class Connectors
    method isAND (line 21) | public static bool isAND(String connector)
    method isOR (line 26) | public static bool isOR(String connector)
    method isNOT (line 31) | public static bool isNOT(String connector)
    method isIMPLIES (line 36) | public static bool isIMPLIES(String connector)
    method isBICOND (line 41) | public static bool isBICOND(String connector)

FILE: aima-csharp/logic/fol/PredicateCollector.cs
  class PredicateCollector (line 12) | public class PredicateCollector : FOLVisitor
    method PredicateCollector (line 14) | public PredicateCollector()
    method getPredicates (line 19) | public List<Predicate> getPredicates(Sentence s)
    method visitPredicate (line 24) | public Object visitPredicate(Predicate p, Object arg)
    method visitTermEquality (line 31) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitVariable (line 36) | public Object visitVariable(Variable variable, Object arg)
    method visitConstant (line 41) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 46) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 51) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 57) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...
    method visitQuantifiedSentence (line 64) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,

FILE: aima-csharp/logic/fol/Quantifiers.cs
  class Quantifiers (line 9) | public class Quantifiers
    method isFORALL (line 14) | public static bool isFORALL(String quantifier)
    method isEXISTS (line 19) | public static bool isEXISTS(String quantifier)

FILE: aima-csharp/logic/fol/StandardizeApart.cs
  class StandardizeApart (line 13) | public class StandardizeApart
    method StandardizeApart (line 18) | public StandardizeApart()
    method StandardizeApart (line 24) | public StandardizeApart(VariableCollector variableCollector,
    method standardizeApart (line 32) | public StandardizeApartResult standardizeApart(Sentence sentence,
    method standardizeApart (line 60) | public Clause standardizeApart(Clause clause,
    method standardizeApart (line 97) | public Chain standardizeApart(Chain chain,
    method standardizeApart (line 139) | public Dictionary<Variable, Term> standardizeApart(List<Literal> l1Lit...

FILE: aima-csharp/logic/fol/StandardizeApartInPlace.cs
  class StandardizeApartInPlace (line 13) | public class StandardizeApartInPlace
    method standardizeApart (line 17) | public static int standardizeApart(Chain c, int saIdx)
    method standardizeApart (line 27) | public static int standardizeApart(Clause c, int saIdx)
    method standardizeApart (line 40) | private static int standardizeApart(List<Variable> variables, Object e...
    method collectAllVariables (line 67) | private static void collectAllVariables(Sentence s, List<Variable> vars)
  class CollectAllVariables (line 73) | class CollectAllVariables : FOLVisitor
    method CollectAllVariables (line 75) | public CollectAllVariables()
    method visitVariable (line 80) | public Object visitVariable(Variable var, Object arg)
    method visitQuantifiedSentence (line 87) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
    method visitPredicate (line 99) | public Object visitPredicate(Predicate predicate, Object arg)
    method visitTermEquality (line 108) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitConstant (line 115) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 120) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 129) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 135) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...

FILE: aima-csharp/logic/fol/StandardizeApartIndexical.cs
  type StandardizeApartIndexical (line 9) | public interface StandardizeApartIndexical
    method getPrefix (line 11) | String getPrefix();
    method getNextIndex (line 13) | int getNextIndex();

FILE: aima-csharp/logic/fol/StandardizeApartIndexicalFactory.cs
  class StandardizeApartIndexicalFactory (line 13) | public class StandardizeApartIndexicalFactory
    method flush (line 18) | public static void flush()
    method newStandardizeApartIndexical (line 26) | public static StandardizeApartIndexical newStandardizeApartIndexical(
  class StandardizeApartIndexicalImpl (line 62) | class StandardizeApartIndexicalImpl : StandardizeApartIndexical
    method StandardizeApartIndexicalImpl (line 67) | public StandardizeApartIndexicalImpl(String prefix)
    method getPrefix (line 73) | public String getPrefix()
    method getNextIndex (line 78) | public int getNextIndex()

FILE: aima-csharp/logic/fol/StandardizeApartResult.cs
  class StandardizeApartResult (line 11) | public class StandardizeApartResult
    method StandardizeApartResult (line 18) | public StandardizeApartResult(Sentence originalSentence,
    method getOriginalSentence (line 28) | public Sentence getOriginalSentence()
    method getStandardized (line 33) | public Sentence getStandardized()
    method getForwardSubstitution (line 38) | public Dictionary<Variable, Term> getForwardSubstitution()
    method getReverseSubstitution (line 43) | public Dictionary<Variable, Term> getReverseSubstitution()

FILE: aima-csharp/logic/fol/SubstVisitor.cs
  class SubstVisitor (line 13) | public class SubstVisitor : AbstractFOLVisitor
    method SubstVisitor (line 15) | public SubstVisitor()
    method subst (line 32) | public Sentence subst(Dictionary<Variable, Term> theta, Sentence sente...
    method subst (line 37) | public Term subst(Dictionary<Variable, Term> theta, Term aTerm)
    method subst (line 42) | public Function subst(Dictionary<Variable, Term> theta, Function funct...
    method subst (line 47) | public Literal subst(Dictionary<Variable, Term> theta, Literal literal)
    method visitVariable (line 53) | public override Object visitVariable(Variable variable, Object arg)
    method visitQuantifiedSentence (line 63) | public override Object visitQuantifiedSentence(QuantifiedSentence sent...

FILE: aima-csharp/logic/fol/SubsumptionElimination.cs
  class SubsumptionElimination (line 29) | public class SubsumptionElimination
    method findSubsumedClauses (line 41) | public static List<Clause> findSubsumedClauses(List<Clause> clauses)

FILE: aima-csharp/logic/fol/Unifier.cs
  class Unifier (line 51) | public class Unifier
    method Unifier (line 56) | public Unifier()
    method unify (line 75) | public Dictionary<Variable, Term> unify(FOLNode x, FOLNode y)
    method unify (line 96) | public Dictionary<Variable, Term> unify(FOLNode x, FOLNode y,
    method unify (line 150) | public Dictionary<Variable, Term> unify(List<FOLNode> x,
    method occurCheck (line 182) | protected bool occurCheck(Dictionary<Variable, Term> theta, Variable var,
    method unifyVar (line 220) | private Dictionary<Variable, Term> unifyVar(Variable var, FOLNode x,
    method unifyOps (line 251) | private Dictionary<Variable, Term> unifyOps(String x, String y,
    method args (line 268) | private List<FOLNode> args(FOLNode x)
    method op (line 273) | private String op(FOLNode x)
    method isCompound (line 278) | private bool isCompound(FOLNode x)
    method cascadeOccurCheck (line 283) | private bool cascadeOccurCheck(Dictionary<Variable, Term> theta, Varia...
    method cascadeSubstitution (line 344) | private void cascadeSubstitution(Dictionary<Variable, Term> theta, Var...

FILE: aima-csharp/logic/fol/VariableCollector.cs
  class VariableCollector (line 13) | public class VariableCollector : FOLVisitor
    method VariableCollector (line 15) | public VariableCollector()
    method collectAllVariables (line 23) | public List<Variable> collectAllVariables(Sentence sentence)
    method collectAllVariables (line 32) | public List<Variable> collectAllVariables(Term aTerm)
    method collectAllVariables (line 41) | public List<Variable> collectAllVariables(Clause aClause)
    method collectAllVariables (line 53) | public List<Variable> collectAllVariables(Chain aChain)
    method visitVariable (line 65) | public Object visitVariable(Variable var, Object arg)
    method visitQuantifiedSentence (line 72) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
    method visitPredicate (line 84) | public Object visitPredicate(Predicate predicate, Object arg)
    method visitTermEquality (line 93) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitConstant (line 100) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 105) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 114) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 120) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...

FILE: aima-csharp/logic/fol/domain/DomainFactory.cs
  class DomainFactory (line 9) | public class DomainFactory
    method crusadesDomain (line 11) | public static FOLDomain crusadesDomain()
    method knowsDomain (line 29) | public static FOLDomain knowsDomain()
    method weaponsDomain (line 42) | public static FOLDomain weaponsDomain()
    method kingsDomain (line 62) | public static FOLDomain kingsDomain()
    method lovesAnimalDomain (line 74) | public static FOLDomain lovesAnimalDomain()
    method ringOfThievesDomain (line 88) | public static FOLDomain ringOfThievesDomain()

FILE: aima-csharp/logic/fol/domain/FOLDomain.cs
  class FOLDomain (line 11) | public class FOLDomain
    method FOLDomain (line 19) | public FOLDomain()
    method FOLDomain (line 26) | public FOLDomain(FOLDomain toCopy): this(toCopy.getConstants(), toCopy...
    method FOLDomain (line 32) | public FOLDomain(HashSet<String> constants, HashSet<String> functions,
    method getConstants (line 40) | public HashSet<String> getConstants()
    method getFunctions (line 45) | public HashSet<String> getFunctions()
    method getPredicates (line 50) | public HashSet<String> getPredicates()
    method addConstant (line 55) | public void addConstant(String constant)
    method addSkolemConstant (line 60) | public String addSkolemConstant()
    method addFunction (line 76) | public void addFunction(String function)
    method addSkolemFunction (line 81) | public String addSkolemFunction()
    method addPredicate (line 96) | public void addPredicate(String predicate)
    method addAnswerLiteral (line 101) | public String addAnswerLiteral()
    method addFOLDomainListener (line 116) | public void addFOLDomainListener(FOLDomainListener listener)
    method removeFOLDomainListener (line 127) | public void removeFOLDomainListener(FOLDomainListener listener)
    method notifyFOLDomainListeners (line 137) | private void notifyFOLDomainListeners(FOLDomainEvent evt)

FILE: aima-csharp/logic/fol/domain/FOLDomainAnswerLiteralAddedEvent.cs
  class FOLDomainAnswerLiteralAddedEvent (line 9) | public class FOLDomainAnswerLiteralAddedEvent : FOLDomainEvent
    method FOLDomainAnswerLiteralAddedEvent (line 15) | public FOLDomainAnswerLiteralAddedEvent(Object source,
    method getAnswerLiteralNameName (line 21) | public String getAnswerLiteralNameName()
    method notifyListener (line 26) | public override void notifyListener(FOLDomainListener listener)

FILE: aima-csharp/logic/fol/domain/FOLDomainEvent.cs
  class FOLDomainEvent (line 9) | public abstract class FOLDomainEvent
    method FOLDomainEvent (line 13) | public FOLDomainEvent(Object source)
    method notifyListener (line 18) | public abstract void notifyListener(FOLDomainListener listener);

FILE: aima-csharp/logic/fol/domain/FOLDomainListener.cs
  type FOLDomainListener (line 9) | public interface FOLDomainListener
    method skolemConstantAdded (line 11) | void skolemConstantAdded(FOLDomainSkolemConstantAddedEvent _event);
    method skolemFunctionAdded (line 13) | void skolemFunctionAdded(FOLDomainSkolemFunctionAddedEvent _event);
    method answerLiteralNameAdded (line 15) | void answerLiteralNameAdded(FOLDomainAnswerLiteralAddedEvent _event);

FILE: aima-csharp/logic/fol/domain/FOLDomainSkolemConstantAddedEvent.cs
  class FOLDomainSkolemConstantAddedEvent (line 9) | public class FOLDomainSkolemConstantAddedEvent : FOLDomainEvent
    method FOLDomainSkolemConstantAddedEvent (line 15) | public FOLDomainSkolemConstantAddedEvent(Object source,
    method getSkolemConstantName (line 21) | public String getSkolemConstantName()
    method notifyListener (line 26) | public override void notifyListener(FOLDomainListener listener)

FILE: aima-csharp/logic/fol/domain/FOLDomainSkolemFunctionAddedEvent.cs
  class FOLDomainSkolemFunctionAddedEvent (line 9) | public class FOLDomainSkolemFunctionAddedEvent : FOLDomainEvent
    method FOLDomainSkolemFunctionAddedEvent (line 15) | public FOLDomainSkolemFunctionAddedEvent(Object source,
    method getSkolemConstantName (line 21) | public String getSkolemConstantName()
    method notifyListener (line 26) | public override void notifyListener(FOLDomainListener listener)

FILE: aima-csharp/logic/fol/inference/AbstractModulation.cs
  class AbstractModulation (line 15) | public abstract class AbstractModulation
    method isValidMatch (line 23) | public abstract bool isValidMatch(Term toMatch,
    method getMatchingSubstitution (line 27) | protected IdentifyCandidateMatchingTerm getMatchingSubstitution(
    class IdentifyCandidateMatchingTerm (line 42) | protected class IdentifyCandidateMatchingTerm : FOLVisitor
      method IdentifyCandidateMatchingTerm (line 50) | public IdentifyCandidateMatchingTerm(Term toMatch,
      method isMatch (line 61) | public bool isMatch()
      method getMatchingTerm (line 66) | public Term getMatchingTerm()
      method getMatchingSubstitution (line 71) | public Dictionary<Variable, Term> getMatchingSubstitution()
      method visitPredicate (line 77) | public Object visitPredicate(Predicate p, Object arg)
      method visitTermEquality (line 91) | public Object visitTermEquality(TermEquality equality, Object arg)
      method visitVariable (line 105) | public Object visitVariable(Variable variable, Object arg)
      method visitConstant (line 119) | public Object visitConstant(Constant constant, Object arg)
      method visitFunction (line 132) | public Object visitFunction(Function function, Object arg)
      method visitNotSentence (line 159) | public Object visitNotSentence(NotSentence sentence, Object arg)
      method visitConnectedSentence (line 165) | public Object visitConnectedSentence(ConnectedSentence sentence,
      method visitQuantifiedSentence (line 172) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
    class ReplaceMatchingTerm (line 181) | protected class ReplaceMatchingTerm : FOLVisitor
      method ReplaceMatchingTerm (line 187) | public ReplaceMatchingTerm()
      method replace (line 191) | public AtomicSentence replace(AtomicSentence expression,
      method visitPredicate (line 202) | public Object visitPredicate(Predicate p, Object arg)
      method visitTermEquality (line 213) | public Object visitTermEquality(TermEquality equality, Object arg)
      method visitVariable (line 220) | public Object visitVariable(Variable variable, Object arg)
      method visitConstant (line 233) | public Object visitConstant(Constant constant, Object arg)
      method visitFunction (line 246) | public Object visitFunction(Function function, Object arg)
      method visitNotSentence (line 266) | public Object visitNotSentence(NotSentence sentence, Object arg)
      method visitConnectedSentence (line 272) | public Object visitConnectedSentence(ConnectedSentence sentence,
      method visitQuantifiedSentence (line 279) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,

FILE: aima-csharp/logic/fol/inference/Demodulation.cs
  class Demodulation (line 34) | public class Demodulation : AbstractModulation
    method Demodulation (line 36) | public Demodulation()
    method apply (line 41) | public Clause apply(TermEquality assertion, Clause clExpression)
    method apply (line 85) | public AtomicSentence apply(TermEquality assertion,
    method isValidMatch (line 111) | public override bool isValidMatch(Term toMatch,

FILE: aima-csharp/logic/fol/inference/FOLBCAsk.cs
  class FOLBCAsk (line 37) | public class FOLBCAsk : InferenceProcedure
    method FOLBCAsk (line 39) | public FOLBCAsk()
    method ask (line 55) | public InferenceResult ask(FOLKnowledgeBase KB, Sentence query)
    method folbcask (line 89) | private List<List<ProofStepBwChGoal>> folbcask(FOLKnowledgeBase KB,
    method compose (line 140) | private Dictionary<Variable, Term> compose(FOLKnowledgeBase KB,
    method cascadeSubstitutions (line 173) | private Dictionary<Variable, Term> cascadeSubstitutions(FOLKnowledgeBa...
    class BCAskAnswerHandler (line 185) | class BCAskAnswerHandler : InferenceResult
      method BCAskAnswerHandler (line 190) | public BCAskAnswerHandler()
      method isPossiblyFalse (line 196) | public bool isPossiblyFalse()
      method isTrue (line 201) | public bool isTrue()
      method isUnknownDueToTimeout (line 206) | public bool isUnknownDueToTimeout()
      method isPartialResultDueToTimeout (line 211) | public bool isPartialResultDueToTimeout()
      method getProofs (line 216) | public List<Proof> getProofs()
      method setAllProofSteps (line 222) | public void setAllProofSteps(List<List<ProofStepBwChGoal>> allProofS...
      method addProofStep (line 232) | public void addProofStep(

FILE: aima-csharp/logic/fol/inference/FOLFCAsk.cs
  class FOLFCAsk (line 45) | public class FOLFCAsk : InferenceProcedure
    method FOLFCAsk (line 47) | public FOLFCAsk()
    method ask (line 61) | public InferenceResult ask(FOLKnowledgeBase KB, Sentence query)
    method invert (line 161) | private List<Literal> invert(List<Literal> lits)
    class FCAskAnswerHandler (line 172) | class FCAskAnswerHandler : InferenceResult
      method FCAskAnswerHandler (line 178) | public FCAskAnswerHandler()
      method isPossiblyFalse (line 184) | public bool isPossiblyFalse()
      method isTrue (line 189) | public bool isTrue()
      method isUnknownDueToTimeout (line 194) | public bool isUnknownDueToTimeout()
      method isPartialResultDueToTimeout (line 199) | public bool isPartialResultDueToTimeout()
      method getProofs (line 204) | public List<Proof> getProofs()
      method addProofStep (line 210) | public void addProofStep(Clause implication, Literal fact,
      method addProofStep (line 217) | public void addProofStep(ProofStep step)
      method setAnswers (line 222) | public void setAnswers(List<Dictionary<Variable, Term>> answers)

FILE: aima-csharp/logic/fol/inference/FOLModelElimination.cs
  class FOLModelElimination (line 22) | public class FOLModelElimination : InferenceProcedure
    method FOLModelElimination (line 30) | public FOLModelElimination()
    method FOLModelElimination (line 35) | public FOLModelElimination(long maxQueryTime)
    method FOLModelElimination (line 40) | public FOLModelElimination(FOLModelEliminationTracer tracer)
    method FOLModelElimination (line 45) | public FOLModelElimination(FOLModelEliminationTracer tracer,
    method getMaxQueryTime (line 52) | public long getMaxQueryTime()
    method setMaxQueryTime (line 57) | public void setMaxQueryTime(long maxQueryTime)
    method ask (line 64) | public InferenceResult ask(FOLKnowledgeBase kb, Sentence aQuery)
    method createChainsFromClauses (line 118) | public List<Chain> createChainsFromClauses(List<Clause> clauses)
    method recursiveDLS (line 134) | private void recursiveDLS(int maxDepth, int currentDepth, Chain nearPa...
    method tryCancellation (line 217) | private Chain tryCancellation(Chain c)
    method tryDropping (line 257) | private Chain tryDropping(Chain c)
    class AnswerHandler (line 270) | class AnswerHandler : InferenceResult
      method AnswerHandler (line 281) | public AnswerHandler(FOLKnowledgeBase kb, Sentence aQuery,
      method isPossiblyFalse (line 320) | public bool isPossiblyFalse()
      method isTrue (line 325) | public bool isTrue()
      method isUnknownDueToTimeout (line 330) | public bool isUnknownDueToTimeout()
      method isPartialResultDueToTimeout (line 335) | public bool isPartialResultDueToTimeout()
      method getProofs (line 340) | public List<Proof> getProofs()
      method getSetOfSupport (line 347) | public List<Chain> getSetOfSupport()
      method isComplete (line 352) | public bool isComplete()
      method resetMaxDepthReached (line 357) | public void resetMaxDepthReached()
      method getMaxDepthReached (line 362) | public int getMaxDepthReached()
      method updateMaxDepthReached (line 367) | public void updateMaxDepthReached(int depth)
      method isAnswer (line 375) | public bool isAnswer(Chain nearParent)
      method ToString (line 443) | public override String ToString()
  class IndexedFarParents (line 454) | class IndexedFarParents
    method IndexedFarParents (line 462) | public IndexedFarParents(List<Chain> sos, List<Chain> background)
    method getNumberFarParents (line 467) | public int getNumberFarParents(Chain farParent)
    method resetNumberFarParentsTo (line 490) | public void resetNumberFarParentsTo(Chain farParent, int toSize)
    method getNumberCandidateFarParents (line 510) | public int getNumberCandidateFarParents(Chain nearParent)
    method attemptReduction (line 534) | public Chain attemptReduction(Chain nearParent, int farParentIndex)
    method addToIndex (line 597) | public Chain addToIndex(Chain c)
    method standardizeApart (line 627) | public void standardizeApart(Chain c)
    method ToString (line 632) | public override String ToString()
    method constructInternalDataStructures (line 661) | private void constructInternalDataStructures(List<Chain> sos,

FILE: aima-csharp/logic/fol/inference/FOLOTTERLikeTheoremProver.cs
  class FOLOTTERLikeTheoremProver (line 70) | public class FOLOTTERLikeTheoremProver : InferenceProcedure
    method FOLOTTERLikeTheoremProver (line 80) | public FOLOTTERLikeTheoremProver()
    method FOLOTTERLikeTheoremProver (line 85) | public FOLOTTERLikeTheoremProver(long maxQueryTime)
    method FOLOTTERLikeTheoremProver (line 90) | public FOLOTTERLikeTheoremProver(bool useParamodulation)
    method FOLOTTERLikeTheoremProver (line 95) | public FOLOTTERLikeTheoremProver(long maxQueryTime,
    method getMaxQueryTime (line 102) | public long getMaxQueryTime()
    method setMaxQueryTime (line 107) | public void setMaxQueryTime(long maxQueryTime)
    method isUseParamodulation (line 112) | public bool isUseParamodulation()
    method setUseParamodulation (line 117) | public void setUseParamodulation(bool useParamodulation)
    method getLightestClauseHeuristic (line 122) | public LightestClauseHeuristic getLightestClauseHeuristic()
    method setLightestClauseHeuristic (line 127) | public void setLightestClauseHeuristic(
    method getClauseFilter (line 133) | public ClauseFilter getClauseFilter()
    method setClauseFilter (line 138) | public void setClauseFilter(ClauseFilter clauseFilter)
    method getClauseSimplifier (line 143) | public ClauseSimplifier getClauseSimplifier()
    method setClauseSimplifier (line 148) | public void setClauseSimplifier(ClauseSimplifier clauseSimplifier)
    method ask (line 154) | public InferenceResult ask(FOLKnowledgeBase KB, Sentence alpha)
    method otter (line 243) | private InferenceResult otter(OTTERAnswerHandler ansHandler,
    method infer (line 274) | private List<Clause> infer(Clause clause, List<Clause> usable)
    method process (line 302) | private void process(OTTERAnswerHandler ansHandler,
    method lookForUnitRefutation (line 357) | private void lookForUnitRefutation(OTTERAnswerHandler ansHandler,
    class IndexedClauses (line 421) | class IndexedClauses
      method IndexedClauses (line 430) | public IndexedClauses(LightestClauseHeuristic lightestClauseHeuristic,
      method addClause (line 444) | public void addClause(Clause c, List<Clause> sos, List<Clause> usable)
      method indexClause (line 507) | private void indexClause(Clause c)
    class OTTERAnswerHandler (line 532) | class OTTERAnswerHandler : InferenceResult
      method OTTERAnswerHandler (line 542) | public OTTERAnswerHandler(Literal answerLiteral,
      method isPossiblyFalse (line 554) | public bool isPossiblyFalse()
      method isTrue (line 559) | public bool isTrue()
      method isUnknownDueToTimeout (line 564) | public bool isUnknownDueToTimeout()
      method isPartialResultDueToTimeout (line 569) | public bool isPartialResultDueToTimeout()
      method getProofs (line 574) | public List<Proof> getProofs()
      method isComplete (line 581) | public bool isComplete()
      method isLookingForAnswerLiteral (line 586) | public bool isLookingForAnswerLiteral()
      method isCheckForUnitRefutation (line 591) | public bool isCheckForUnitRefutation(Clause clause)
      method isAnswer (line 617) | public bool isAnswer(Clause aClause)
      method ToString (line 687) | public override String ToString()

FILE: aima-csharp/logic/fol/inference/FOLTFMResolution.cs
  class FOLTFMResolution (line 32) | public class FOLTFMResolution : InferenceProcedure
    method FOLTFMResolution (line 38) | public FOLTFMResolution()
    method FOLTFMResolution (line 43) | public FOLTFMResolution(long maxQueryTime)
    method FOLTFMResolution (line 48) | public FOLTFMResolution(FOLTFMResolutionTracer tracer)
    method getMaxQueryTime (line 53) | public long getMaxQueryTime()
    method setMaxQueryTime (line 58) | public void setMaxQueryTime(long maxQueryTime)
    method getTracer (line 63) | public FOLTFMResolutionTracer getTracer()
    method setTracer (line 68) | public void setTracer(FOLTFMResolutionTracer tracer)
    method ask (line 74) | public InferenceResult ask(FOLKnowledgeBase KB, Sentence alpha)
    class TFMAnswerHandler (line 224) | class TFMAnswerHandler : InferenceResult
      method TFMAnswerHandler (line 234) | public TFMAnswerHandler(Literal answerLiteral,
      method isPossiblyFalse (line 247) | public bool isPossiblyFalse()
      method isTrue (line 252) | public bool isTrue()
      method isUnknownDueToTimeout (line 257) | public bool isUnknownDueToTimeout()
      method isPartialResultDueToTimeout (line 262) | public bool isPartialResultDueToTimeout()
      method getProofs (line 267) | public List<Proof> getProofs()
      method isComplete (line 274) | public bool isComplete()
      method checkForPossibleAnswers (line 279) | public void checkForPossibleAnswers(List<Clause> resolvents)
      method ToString (line 349) | public override String ToString()

FILE: aima-csharp/logic/fol/inference/InferenceProcedure.cs
  type InferenceProcedure (line 12) | public interface InferenceProcedure
    method ask (line 22) | InferenceResult ask(FOLKnowledgeBase kb, Sentence query);

FILE: aima-csharp/logic/fol/inference/InferenceResult.cs
  type InferenceResult (line 11) | public interface InferenceResult
    method isPossiblyFalse (line 18) | bool isPossiblyFalse();
    method isTrue (line 27) | bool isTrue();
    method isUnknownDueToTimeout (line 34) | bool isUnknownDueToTimeout();
    method isPartialResultDueToTimeout (line 43) | bool isPartialResultDueToTimeout();
    method getProofs (line 50) | List<Proof> getProofs();

FILE: aima-csharp/logic/fol/inference/InferenceResultPrinter.cs
  class InferenceResultPrinter (line 12) | public class InferenceResultPrinter
    method printInferenceResult (line 22) | public static String printInferenceResult(InferenceResult ir)

FILE: aima-csharp/logic/fol/inference/Paramodulation.cs
  class Paramodulation (line 28) | public class Paramodulation : AbstractModulation
    method Paramodulation (line 36) | public Paramodulation()
    method apply (line 41) | public List<Clause> apply(Clause c1, Clause c2)
    method apply (line 46) | public List<Clause> apply(Clause c1, Clause c2, bool standardizeApart)
    method isValidMatch (line 191) | public override bool isValidMatch(Term toMatch,

FILE: aima-csharp/logic/fol/inference/otter/ClauseFilter.cs
  type ClauseFilter (line 11) | public interface ClauseFilter
    method filter (line 13) | HashSet<Clause> filter(HashSet<Clause> clauses);

FILE: aima-csharp/logic/fol/inference/otter/ClauseSimplifier.cs
  type ClauseSimplifier (line 11) | public interface ClauseSimplifier
    method simplify (line 13) | Clause simplify(Clause c);

FILE: aima-csharp/logic/fol/inference/otter/LightestClauseHeuristic.cs
  type LightestClauseHeuristic (line 16) | public interface LightestClauseHeuristic
    method getLightestClause (line 23) | Clause getLightestClause();
    method initialSOS (line 32) | void initialSOS(List<Clause> clauses);
    method addedClauseToSOS (line 34) | void addedClauseToSOS(Clause clause);
    method removedClauseFromSOS (line 36) | void removedClauseFromSOS(Clause clause);

FILE: aima-csharp/logic/fol/inference/otter/defaultimpl/DefaultClauseFilter.cs
  class DefaultClauseFilter (line 12) | public class DefaultClauseFilter : ClauseFilter
    method DefaultClauseFilter (line 14) | public DefaultClauseFilter()
    method filter (line 21) | public HashSet<Clause> filter(HashSet<Clause> clauses)

FILE: aima-csharp/logic/fol/inference/otter/defaultimpl/DefaultClauseSimplifier.cs
  class DefaultClauseSimplifier (line 15) | public class DefaultClauseSimplifier : ClauseSimplifier
    method DefaultClauseSimplifier (line 20) | public DefaultClauseSimplifier()
    method DefaultClauseSimplifier (line 25) | public DefaultClauseSimplifier(List<TermEquality> rewrites)
    method simplify (line 32) | public Clause simplify(Clause c)

FILE: aima-csharp/logic/fol/inference/otter/defaultimpl/DefaultLightestClauseHeuristic.cs
  class DefaultLightestClauseHeuristic (line 13) | public class DefaultLightestClauseHeuristic : LightestClauseHeuristic
    method DefaultLightestClauseHeuristic (line 17) | public DefaultLightestClauseHeuristic()
    method getLightestClause (line 25) | public Clause getLightestClause()
    method initialSOS (line 37) | public void initialSOS(List<Clause> clauses)
    method addedClauseToSOS (line 43) | public void addedClauseToSOS(Clause clause)
    method removedClauseFromSOS (line 48) | public void removedClauseFromSOS(Clause clause)
  class LightestClauseSorter (line 56) | class LightestClauseSorter : IComparer<Clause>
    method Compare (line 58) | public int Compare(Clause c1, Clause c2)
    method compareEqualityIdentities (line 70) | private int compareEqualityIdentities(Clause c1, Clause c2)

FILE: aima-csharp/logic/fol/inference/proof/AbstractProofStep.cs
  class AbstractProofStep (line 10) | public abstract class AbstractProofStep : ProofStep
    method AbstractProofStep (line 14) | public AbstractProofStep()
    method getStepNumber (line 21) | public int getStepNumber()
    method setStepNumber (line 26) | public void setStepNumber(int step)
    method getPredecessorSteps (line 31) | public abstract List<ProofStep> getPredecessorSteps();
    method getProof (line 33) | public abstract String getProof();
    method getJustification (line 35) | public abstract String getJustification();

FILE: aima-csharp/logic/fol/inference/proof/Proof.cs
  type Proof (line 11) | public interface Proof
    method getSteps (line 17) | List<ProofStep> getSteps();
    method getAnswerBindings (line 25) | Dictionary<Variable, Term> getAnswerBindings();
    method replaceAnswerBindings (line 33) | void replaceAnswerBindings(Dictionary<Variable, Term> updatedBindings);

FILE: aima-csharp/logic/fol/inference/proof/ProofFinal.cs
  class ProofFinal (line 11) | public class ProofFinal : Proof
    method ProofFinal (line 17) | public ProofFinal(ProofStep finalStep, Dictionary<Variable, Term> answ...
    method getSteps (line 25) | public List<ProofStep> getSteps()
    method getAnswerBindings (line 35) | public Dictionary<Variable, Term> getAnswerBindings()
    method replaceAnswerBindings (line 40) | public void replaceAnswerBindings(Dictionary<Variable, Term> updatedBi...
    method ToString (line 48) | public override String ToString()
    method calculateProofSteps (line 56) | private void calculateProofSteps()
    method addToProofSteps (line 95) | private void addToProofSteps(ProofStep step)

FILE: aima-csharp/logic/fol/inference/proof/ProofPrinter.cs
  class ProofPrinter (line 11) | public class ProofPrinter
    method printProof (line 20) | public static String printProof(Proof proof)

FILE: aima-csharp/logic/fol/inference/proof/ProofStep.cs
  type ProofStep (line 10) | public interface ProofStep
    method getStepNumber (line 12) | int getStepNumber();
    method setStepNumber (line 14) | void setStepNumber(int step);
    method getPredecessorSteps (line 16) | List<ProofStep> getPredecessorSteps();
    method getProof (line 18) | String getProof();
    method getJustification (line 20) | String getJustification();

FILE: aima-csharp/logic/fol/inference/proof/ProofStepBwChGoal.cs
  class ProofStepBwChGoal (line 15) | public class ProofStepBwChGoal : AbstractProofStep
    method ProofStepBwChGoal (line 22) | public ProofStepBwChGoal(Clause toProve, Literal currentGoal,
    method getBindings (line 33) | public Dictionary<Variable, Term> getBindings()
    method setPredecessor (line 38) | public void setPredecessor(ProofStep predecessor)
    method getPredecessorSteps (line 46) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 51) | public override String getProof()
    method getJustification (line 71) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepChainCancellation.cs
  class ProofStepChainCancellation (line 14) | public class ProofStepChainCancellation : AbstractProofStep
    method ProofStepChainCancellation (line 21) | public ProofStepChainCancellation(Chain cancellation, Chain cancellati...
    method getPredecessorSteps (line 32) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 37) | public override String getProof()
    method getJustification (line 42) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepChainContrapositive.cs
  class ProofStepChainContrapositive (line 13) | public class ProofStepChainContrapositive : AbstractProofStep
    method ProofStepChainContrapositive (line 19) | public ProofStepChainContrapositive(Chain contrapositive,
    method getPredecessorSteps (line 29) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 34) | public override String getProof()
    method getJustification (line 39) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepChainDropped.cs
  class ProofStepChainDropped (line 13) | public class ProofStepChainDropped : AbstractProofStep
    method ProofStepChainDropped (line 19) | public ProofStepChainDropped(Chain dropped, Chain droppedOff)
    method getPredecessorSteps (line 28) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 33) | public override String getProof()
    method getJustification (line 38) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepChainFromClause.cs
  class ProofStepChainFromClause (line 13) | public class ProofStepChainFromClause : AbstractProofStep
    method ProofStepChainFromClause (line 19) | public ProofStepChainFromClause(Chain chain, Clause fromClause)
    method getPredecessorSteps (line 28) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 33) | public override String getProof()
    method getJustification (line 38) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepChainReduction.cs
  class ProofStepChainReduction (line 14) | public class ProofStepChainReduction : AbstractProofStep
    method ProofStepChainReduction (line 21) | public ProofStepChainReduction(Chain reduction, Chain nearParent,
    method getPredecessorSteps (line 34) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 39) | public override String getProof()
    method getJustification (line 44) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepClauseBinaryResolvent.cs
  class ProofStepClauseBinaryResolvent (line 14) | public class ProofStepClauseBinaryResolvent : AbstractProofStep
    method ProofStepClauseBinaryResolvent (line 29) | public ProofStepClauseBinaryResolvent(Clause resolvent, Literal pl,
    method ProofStepClauseBinaryResolvent (line 53) | public ProofStepClauseBinaryResolvent(Clause c, Clause clause, Clause ...
    method getPredecessorSteps (line 64) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 69) | public override String getProof()
    method getJustification (line 74) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepClauseClausifySentence.cs
  class ProofStepClauseClausifySentence (line 14) | public class ProofStepClauseClausifySentence : AbstractProofStep
    method ProofStepClauseClausifySentence (line 19) | public ProofStepClauseClausifySentence(Clause clausified,
    method getPredecessorSteps (line 28) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 33) | public override String getProof()
    method getJustification (line 38) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepClauseDemodulation.cs
  class ProofStepClauseDemodulation (line 14) | public class ProofStepClauseDemodulation : AbstractProofStep
    method ProofStepClauseDemodulation (line 21) | public ProofStepClauseDemodulation(Clause demodulated, Clause origClause,
    method getPredecessorSteps (line 32) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 37) | public override String getProof()
    method getJustification (line 42) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepClauseFactor.cs
  class ProofStepClauseFactor (line 14) | public class ProofStepClauseFactor : AbstractProofStep
    method ProofStepClauseFactor (line 24) | public ProofStepClauseFactor(Clause factor, Clause factorOf, Literal lx,
    method getPredecessorSteps (line 48) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 53) | public override String getProof()
    method getJustification (line 58) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepClauseParamodulation.cs
  class ProofStepClauseParamodulation (line 14) | public class ProofStepClauseParamodulation : AbstractProofStep
    method ProofStepClauseParamodulation (line 22) | public ProofStepClauseParamodulation(Clause paramodulated,
    method getPredecessorSteps (line 35) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 40) | public override String getProof()
    method getJustification (line 45) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepFoChAlreadyAFact.cs
  class ProofStepFoChAlreadyAFact (line 13) | public class ProofStepFoChAlreadyAFact : AbstractProofStep
    method ProofStepFoChAlreadyAFact (line 18) | public ProofStepFoChAlreadyAFact(Literal fact)
    method getPredecessorSteps (line 25) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 30) | public override String getProof()
    method getJustification (line 35) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepFoChAssertFact.cs
  class ProofStepFoChAssertFact (line 15) | public class ProofStepFoChAssertFact : AbstractProofStep
    method ProofStepFoChAssertFact (line 22) | public ProofStepFoChAssertFact(Clause implication, Literal fact,
    method getPredecessorSteps (line 36) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 41) | public override String getProof()
    method getJustification (line 58) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepGoal.cs
  class ProofStepGoal (line 12) | public class ProofStepGoal : AbstractProofStep
    method ProofStepGoal (line 18) | public ProofStepGoal(Object proof)
    method getPredecessorSteps (line 25) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 30) | public override String getProof()
    method getJustification (line 35) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepPremise.cs
  class ProofStepPremise (line 12) | public class ProofStepPremise : AbstractProofStep
    method ProofStepPremise (line 18) | public ProofStepPremise(Object proof)
    method getPredecessorSteps (line 25) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 30) | public override String getProof()
    method getJustification (line 35) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/proof/ProofStepRenaming.cs
  class ProofStepRenaming (line 12) | public class ProofStepRenaming : AbstractProofStep
    method ProofStepRenaming (line 17) | public ProofStepRenaming(Object proof, ProofStep predecessor)
    method getPredecessorSteps (line 25) | public override List<ProofStep> getPredecessorSteps()
    method getProof (line 30) | public override String getProof()
    method getJustification (line 35) | public override String getJustification()

FILE: aima-csharp/logic/fol/inference/trace/FOLModelEliminationTracer.cs
  type FOLModelEliminationTracer (line 10) | public interface FOLModelEliminationTracer
    method reset (line 12) | void reset();
    method increment (line 14) | void increment(int depth, int noFarParents);

FILE: aima-csharp/logic/fol/inference/trace/FOLTFMResolutiontracer.cs
  type FOLTFMResolutionTracer (line 12) | public interface FOLTFMResolutionTracer
    method stepStartWhile (line 14) | void stepStartWhile(HashSet<Clause> clauses, int totalNoClauses,
    method stepOuterFor (line 17) | void stepOuterFor(Clause i);
    method stepInnerFor (line 19) | void stepInnerFor(Clause i, Clause j);
    method stepResolved (line 21) | void stepResolved(Clause iFactor, Clause jFactor, HashSet<Clause> reso...
    method stepFinished (line 23) | void stepFinished(HashSet<Clause> clauses, InferenceResult result);

FILE: aima-csharp/logic/fol/kb/FOLKnowledgeBase.cs
  class FOLKnowledgeBase (line 21) | public class FOLKnowledgeBase
    method FOLKnowledgeBase (line 52) | public FOLKnowledgeBase(FOLDomain domain) : this(domain, new FOLOTTERL...
    method FOLKnowledgeBase (line 58) | public FOLKnowledgeBase(FOLDomain domain,
    method FOLKnowledgeBase (line 64) | public FOLKnowledgeBase(FOLDomain domain,
    method clear (line 78) | public void clear()
    method getInferenceProcedure (line 87) | public InferenceProcedure getInferenceProcedure()
    method setInferenceProcedure (line 92) | public void setInferenceProcedure(InferenceProcedure inferenceProcedure)
    method tell (line 100) | public Sentence tell(String aSentence)
    method tell (line 107) | public void tell(List<Sentence> sentences)
    method tell (line 115) | public void tell(Sentence aSentence)
    method ask (line 125) | public InferenceResult ask(String aQuerySentence)
    method ask (line 130) | public InferenceResult ask(Sentence aQuery)
    method getNumberFacts (line 158) | public int getNumberFacts()
    method getNumberRules (line 163) | public int getNumberRules()
    method getOriginalSentences (line 168) | public List<Sentence> getOriginalSentences()
    method getAllDefiniteClauses (line 173) | public List<Clause> getAllDefiniteClauses()
    method getAllDefiniteClauseImplications (line 178) | public List<Clause> getAllDefiniteClauseImplications()
    method getAllClauses (line 183) | public List<Clause> getAllClauses()
    method fetch (line 189) | public /* lock */ List<Dictionary<Variable, Term>> fetch(Literal l)
    method fetch (line 211) | public List<Dictionary<Variable, Term>> fetch(List<Literal> literals)
    method unify (line 226) | public Dictionary<Variable, Term> unify(FOLNode x, FOLNode y)
    method subst (line 231) | public Sentence subst(Dictionary<Variable, Term> theta, Sentence aSent...
    method subst (line 236) | public Literal subst(Dictionary<Variable, Term> theta, Literal l)
    method subst (line 241) | public Term subst(Dictionary<Variable, Term> theta, Term aTerm)
    method standardizeApart (line 247) | public Sentence standardizeApart(Sentence aSentence)
    method standardizeApart (line 253) | public Clause standardizeApart(Clause aClause)
    method standardizeApart (line 258) | public Chain standardizeApart(Chain aChain)
    method collectAllVariables (line 263) | public List<Variable> collectAllVariables(Sentence aSentence)
    method convertToCNF (line 268) | public CNF convertToCNF(Sentence aSentence)
    method convertToClauses (line 273) | public List<Clause> convertToClauses(Sentence aSentence)
    method createAnswerLiteral (line 280) | public Literal createAnswerLiteral(Sentence forQuery)
    method isRenaming (line 295) | public bool isRenaming(Literal l)
    method isRenaming (line 306) | public bool isRenaming(Literal l, List<Literal> possibleMatches)
    method ToString (line 338) | public override String ToString()
    method getParser (line 352) | protected FOLParser getParser()
    method store (line 361) | private /*lock*/ void store(Sentence aSentence)
    method indexFact (line 410) | private void indexFact(Literal fact)
    method recursiveFetch (line 420) | private void recursiveFetch(Dictionary<Variable, Term> theta, Literal l,
    method fetchMatchingFacts (line 462) | private List<Literal> fetchMatchingFacts(Literal l)
    method getFactKey (line 471) | private String getFactKey(Literal l)

FILE: aima-csharp/logic/fol/kb/FOLKnowledgeBaseFactory.cs
  class FOLKnowledgeBaseFactory (line 13) | public class FOLKnowledgeBaseFactory
    method createKingsKnowledgeBase (line 15) | public static FOLKnowledgeBase createKingsKnowledgeBase(
    method createWeaponsKnowledgeBase (line 27) | public static FOLKnowledgeBase createWeaponsKnowledgeBase(
    method createLovesAnimalKnowledgeBase (line 44) | public static FOLKnowledgeBase createLovesAnimalKnowledgeBase(
    method createRingOfThievesKnowledgeBase (line 61) | public static FOLKnowledgeBase createRingOfThievesKnowledgeBase(
    method createABCEqualityKnowledgeBase (line 104) | public static FOLKnowledgeBase createABCEqualityKnowledgeBase(
    method createABCDEqualityAndSubstitutionKnowledgeBase (line 132) | public static FOLKnowledgeBase createABCDEqualityAndSubstitutionKnowle...

FILE: aima-csharp/logic/fol/kb/data/CNF.cs
  class CNF (line 17) | public class CNF
    method CNF (line 21) | public CNF(List<Clause> conjunctionOfClauses)
    method getNumberOfClauses (line 26) | public int getNumberOfClauses()
    method getConjunctionOfClauses (line 31) | public List<Clause> getConjunctionOfClauses()
    method ToString (line 36) | public override String ToString()

FILE: aima-csharp/logic/fol/kb/data/Chain.cs
  class Chain (line 22) | public class Chain
    method Chain (line 28) | public Chain()
    method Chain (line 33) | public Chain(List<Literal> literals)
    method getProofStep (line 38) | public ProofStep getProofStep()
    method setProofStep (line 48) | public void setProofStep(ProofStep proofStep)
    method isEmpty (line 53) | public bool isEmpty()
    method addLiteral (line 58) | public void addLiteral(Literal literal)
    method getHead (line 63) | public Literal getHead()
    method getTail (line 72) | public List<Literal> getTail()
    method getNumberLiterals (line 82) | public int getNumberLiterals()
    method getLiterals (line 87) | public List<Literal> getLiterals()
    method getContrapositives (line 99) | public List<Chain> getContrapositives()
    method ToString (line 118) | public override String ToString()

FILE: aima-csharp/logic/fol/kb/data/Clause.cs
  class Clause (line 22) | public class Clause
    method Clause (line 42) | public Clause()
    method Clause (line 47) | public Clause(List<Literal> lits)
    method Clause (line 64) | public Clause(List<Literal> lits1, List<Literal> lits2)
    method getProofStep (line 82) | public ProofStep getProofStep()
    method setProofStep (line 92) | public void setProofStep(ProofStep proofStep)
    method isImmutable (line 97) | public bool isImmutable()
    method setImmutable (line 102) | public void setImmutable()
    method isStandardizedApartCheckRequired (line 107) | public bool isStandardizedApartCheckRequired()
    method setStandardizedApartCheckNotRequired (line 112) | public void setStandardizedApartCheckNotRequired()
    method isEmpty (line 117) | public bool isEmpty()
    method isUnitClause (line 122) | public bool isUnitClause()
    method isDefiniteClause (line 127) | public bool isDefiniteClause()
    method isImplicationDefiniteClause (line 134) | public bool isImplicationDefiniteClause()
    method isHornClause (line 142) | public bool isHornClause()
    method isTautology (line 149) | public bool isTautology()
    method addLiteral (line 171) | public void addLiteral(Literal literal)
    method addPositiveLiteral (line 194) | public void addPositiveLiteral(AtomicSentence atom)
    method addNegativeLiteral (line 199) | public void addNegativeLiteral(AtomicSentence atom)
    method getNumberLiterals (line 204) | public int getNumberLiterals()
    method getNumberPositiveLiterals (line 209) | public int getNumberPositiveLiterals()
    method getNumberNegativeLiterals (line 214) | public int getNumberNegativeLiterals()
    method getLiterals (line 219) | public List<Literal> getLiterals()
    method getPositiveLiterals (line 224) | public List<Literal> getPositiveLiterals()
    method getNegativeLiterals (line 229) | public List<Literal> getNegativeLiterals()
    method getFactors (line 234) | public List<Clause> getFactors()
    method getNonTrivialFactors (line 243) | public List<Clause> getNonTrivialFactors()
    method subsumes (line 252) | public bool subsumes(Clause othC)
    method binaryResolvents (line 304) | public List<Clause> binaryResolvents(Clause othC)
    method ToString (line 408) | public override String ToString()
    method GetHashCode (line 420) | public override int GetHashCode()
    method Equals (line 425) | public override bool Equals(Object othObj)
    method getEqualityIdentity (line 444) | public String getEqualityIdentity()
    method recalculateIdentity (line 452) | private void recalculateIdentity()
    method calculateFactors (line 483) | private void calculateFactors(List<Clause> parentFactors)
    method saIfRequired (line 586) | private Clause saIfRequired(Clause othClause)
    method collectLikeLiterals (line 613) | private Dictionary<String, List<Literal>> collectLikeLiterals(List<Lit...
    method checkSubsumes (line 638) | private bool checkSubsumes(Clause othC,
  class LiteralsSorter (line 799) | class LiteralsSorter : IComparer<Literal>
    method Compare (line 801) | public int Compare(Literal o1, Literal o2)
    method compareArgs (line 834) | private int compareArgs(List<Term> args1, List<Term> args2)
  class ClauseEqualityIdentityConstructor (line 905) | class ClauseEqualityIdentityConstructor : FOLVisitor
    method ClauseEqualityIdentityConstructor (line 913) | public ClauseEqualityIdentityConstructor(List<Literal> literals,
    method getIdentity (line 1049) | public String getIdentity()
    method visitVariable (line 1056) | public Object visitVariable(Variable var, Object arg)
    method visitConstant (line 1078) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 1084) | public Object visitFunction(Function function, Object arg)
    method visitPredicate (line 1106) | public Object visitPredicate(Predicate predicate, Object arg)
    method visitTermEquality (line 1111) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitQuantifiedSentence (line 1116) | public Object visitQuantifiedSentence(QuantifiedSentence sentence,
    method visitNotSentence (line 1122) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 1127) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...

FILE: aima-csharp/logic/fol/kb/data/Literal.cs
  class Literal (line 17) | public class Literal
    method Literal (line 24) | public Literal(AtomicSentence atom)
    method Literal (line 29) | public Literal(AtomicSentence atom, bool negated)
    method newInstance (line 35) | public virtual Literal newInstance(AtomicSentence atom)
    method isPositiveLiteral (line 40) | public bool isPositiveLiteral()
    method isNegativeLiteral (line 45) | public bool isNegativeLiteral()
    method getAtomicSentence (line 50) | public AtomicSentence getAtomicSentence()
    method ToString (line 55) | public override String ToString()
    method Equals (line 71) | public override bool Equals(Object o)
    method GetHashCode (line 96) | public override int GetHashCode()

FILE: aima-csharp/logic/fol/kb/data/ReducedLiteral.cs
  class ReducedLiteral (line 16) | public class ReducedLiteral : Literal
    method ReducedLiteral (line 20) | public ReducedLiteral(AtomicSentence atom) : base(atom)
    method ReducedLiteral (line 25) | public ReducedLiteral(AtomicSentence atom, bool negated) : base(atom, ...
    method newInstance (line 30) | public override Literal newInstance(AtomicSentence atom)
    method ToString (line 35) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/AbstractFOLVisitor.cs
  class AbstractFOLVisitor (line 11) | public class AbstractFOLVisitor : FOLVisitor
    method AbstractFOLVisitor (line 13) | public AbstractFOLVisitor()
    method recreate (line 17) | protected Sentence recreate(Object ast)
    method visitVariable (line 22) | public virtual Object visitVariable(Variable variable, Object arg)
    method visitQuantifiedSentence (line 27) | public virtual Object visitQuantifiedSentence(QuantifiedSentence sente...
    method visitPredicate (line 40) | public Object visitPredicate(Predicate predicate, Object arg)
    method visitTermEquality (line 53) | public Object visitTermEquality(TermEquality equality, Object arg)
    method visitConstant (line 60) | public Object visitConstant(Constant constant, Object arg)
    method visitFunction (line 65) | public Object visitFunction(Function function, Object arg)
    method visitNotSentence (line 78) | public Object visitNotSentence(NotSentence sentence, Object arg)
    method visitConnectedSentence (line 84) | public Object visitConnectedSentence(ConnectedSentence sentence, Objec...

FILE: aima-csharp/logic/fol/parsing/FOLLexer.cs
  class FOLLexer (line 16) | public class FOLLexer : Lexer
    method FOLLexer (line 21) | public FOLLexer(FOLDomain domain)
    method getFOLDomain (line 37) | public FOLDomain getFOLDomain()
    method nextToken (line 42) | public override Token nextToken()
    method isCSharpIdentifierStart (line 83) | private bool isCSharpIdentifierStart(char c)
    method identifier (line 88) | private Token identifier()
    method isVariable (line 134) | private bool isVariable(String s)
    method identifierDetected (line 139) | private bool identifierDetected()
    method partOfConnector (line 145) | private bool partOfConnector()

FILE: aima-csharp/logic/fol/parsing/FOLParser.cs
  class FOLParser (line 13) | public class FOLParser
    method FOLParser (line 21) | public FOLParser(FOLLexer lexer)
    method FOLParser (line 27) | public FOLParser(FOLDomain domain): this(new FOLLexer(domain))
    method getFOLDomain (line 32) | public FOLDomain getFOLDomain()
    method parse (line 37) | public Sentence parse(String s)
    method setUpToParse (line 43) | public void setUpToParse(String s)
    method parseTerm (line 50) | private Term parseTerm()
    method parseVariable (line 72) | public Term parseVariable()
    method parseConstant (line 80) | public Term parseConstant()
    method parseFunction (line 88) | public Term parseFunction()
    method parsePredicate (line 96) | public Sentence parsePredicate()
    method processTerms (line 104) | private List<Term> processTerms()
    method parseTermEquality (line 122) | public Sentence parseTermEquality()
    method parseNotSentence (line 131) | public Sentence parseNotSentence()
    method lookAhead (line 139) | protected Token lookAhead(int i)
    method consume (line 144) | protected void consume()
    method loadNextTokenFromInput (line 151) | protected void loadNextTokenFromInput()
    method isEndOfInput (line 178) | protected bool isEndOfInput(Token t)
    method fillLookAheadBuffer (line 183) | protected void fillLookAheadBuffer()
    method match (line 191) | protected void match(String terminalSymbol)
    method parseSentence (line 208) | private Sentence parseSentence()
    method parseQuantifiedSentence (line 236) | private Sentence parseQuantifiedSentence()
    method parseParanthizedSentence (line 253) | private Sentence parseParanthizedSentence()
    method binaryConnector (line 269) | private bool binaryConnector(Token t)
    method lParen (line 282) | private bool lParen(Token t)
    method term (line 294) | private bool term(Token t)
    method predicate (line 309) | private bool predicate(Token t)
    method notToken (line 321) | private bool notToken(Token t)

FILE: aima-csharp/logic/fol/parsing/FOLVisitor.cs
  type FOLVisitor (line 11) | public interface FOLVisitor
    method visitPredicate (line 13) | Object visitPredicate(Predicate p, Object arg);
    method visitTermEquality (line 15) | Object visitTermEquality(TermEquality equality, Object arg);
    method visitVariable (line 17) | Object visitVariable(Variable variable, Object arg);
    method visitConstant (line 19) | Object visitConstant(Constant constant, Object arg);
    method visitFunction (line 21) | Object visitFunction(Function function, Object arg);
    method visitNotSentence (line 23) | Object visitNotSentence(NotSentence sentence, Object arg);
    method visitConnectedSentence (line 25) | Object visitConnectedSentence(ConnectedSentence sentence, Object arg);
    method visitQuantifiedSentence (line 27) | Object visitQuantifiedSentence(QuantifiedSentence sentence,

FILE: aima-csharp/logic/fol/parsing/ast/AtomicSentence.cs
  type AtomicSentence (line 9) | public interface AtomicSentence : Sentence
    method getArgs (line 11) | List<Term> getArgs();
    method copy (line 13) | AtomicSentence copy();

FILE: aima-csharp/logic/fol/parsing/ast/ConnectedSentence.cs
  class ConnectedSentence (line 12) | public class ConnectedSentence : Sentence
    method ConnectedSentence (line 20) | public ConnectedSentence(String connector, Sentence first, Sentence se...
    method getConnector (line 29) | public String getConnector()
    method getFirst (line 34) | public Sentence getFirst()
    method getSecond (line 39) | public Sentence getSecond()
    method getSymbolicName (line 46) | public String getSymbolicName()
    method isCompound (line 51) | public bool isCompound()
    method getArgs (line 56) | public List<FOLNode> getArgs()
    method accept (line 63) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 68) | public FOLNode copy()
    method copySentence (line 73) | public Sentence copySentence()
    method Equals (line 80) | public override bool Equals(Object o)
    method GetHashCode (line 97) | public override int GetHashCode()
    method ToString (line 109) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/ast/Constant.cs
  class Constant (line 11) | public class Constant : Term
    method Constant (line 16) | public Constant(String s)
    method getValue (line 21) | public String getValue()
    method getSymbolicName (line 28) | public String getSymbolicName()
    method isCompound (line 33) | public bool isCompound()
    method getArgs (line 38) | List<FOLNode> FOLNode.getArgs()
    method getArgs (line 43) | public List<Term> getArgs()
    method accept (line 50) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 55) | FOLNode FOLNode.copy()
    method copy (line 60) | public Term copy()
    method Equals (line 67) | public override bool Equals(Object o)
    method GetHashCode (line 83) | public override int GetHashCode()
    method ToString (line 93) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/ast/FOLNode.cs
  type FOLNode (line 12) | public interface FOLNode : ParseTreeNode
    method getSymbolicName (line 14) | String getSymbolicName();
    method isCompound (line 16) | bool isCompound();
    method getArgs (line 18) | List<FOLNode> getArgs();
    method accept (line 20) | Object accept(FOLVisitor v, Object arg);
    method copy (line 22) | FOLNode copy();

FILE: aima-csharp/logic/fol/parsing/ast/Function.cs
  class Function (line 12) | public class Function : Term
    method Function (line 19) | public Function(String functionName, List<Term> terms)
    method getFunctionName (line 25) | public String getFunctionName()
    method getTerms (line 30) | public List<Term> getTerms()
    method getSymbolicName (line 39) | public String getSymbolicName()
    method isCompound (line 44) | public bool isCompound()
    method getArgs (line 49) | List<FOLNode> FOLNode.getArgs()
    method getArgs (line 54) | public List<Term> getArgs()
    method accept (line 59) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 64) | FOLNode FOLNode.copy()
    method copy (line 69) | public Term copy()
    method Equals (line 81) | public override bool Equals(Object o)
    method GetHashCode (line 99) | public override int GetHashCode()
    method ToString (line 113) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/ast/NotSentence.cs
  class NotSentence (line 16) | public class NotSentence : Sentence
    method NotSentence (line 23) | public NotSentence(Sentence negated)
    method getNegated (line 29) | public Sentence getNegated()
    method getSymbolicName (line 36) | public String getSymbolicName()
    method isCompound (line 41) | public bool isCompound()
    method getArgs (line 46) | public List<FOLNode> getArgs()
    method accept (line 51) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 56) | public FOLNode copy()
    method copySentence (line 61) | public Sentence copySentence()
    method Equals (line 68) | public override bool Equals(Object o)
    method GetHashCode (line 83) | public override int GetHashCode()
    method ToString (line 93) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/ast/Predicate.cs
  class Predicate (line 13) | public class Predicate : AtomicSentence
    method Predicate (line 20) | public Predicate(String predicateName, List<Term> terms)
    method getPredicateName (line 26) | public String getPredicateName()
    method getTerms (line 31) | public List<Term> getTerms()
    method getSymbolicName (line 38) | public String getSymbolicName()
    method isCompound (line 43) | public bool isCompound()
    method getArgs (line 48) | List<FOLNode> FOLNode.getArgs()
    method copy (line 53) | AtomicSentence AtomicSentence.copy()
    method getArgs (line 58) | public List<Term> getArgs()
    method accept (line 63) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 68) | public FOLNode copy()
    method copySentence (line 78) | public Sentence copySentence()
    method Equals (line 85) | public override bool Equals(Object o)
    method GetHashCode (line 101) | public override int GetHashCode()
    method ToString (line 115) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/ast/QuantifiedSentence.cs
  class QuantifiedSentence (line 14) | public class QuantifiedSentence : Sentence
    method QuantifiedSentence (line 23) | public QuantifiedSentence(String quantifier, List<Variable> variables,
    method getQuantifier (line 33) | public String getQuantifier()
    method getVariables (line 38) | public List<Variable> getVariables()
    method getQuantified (line 43) | public Sentence getQuantified()
    method getSymbolicName (line 50) | public String getSymbolicName()
    method isCompound (line 55) | public bool isCompound()
    method getArgs (line 60) | public List<FOLNode> getArgs()
    method accept (line 65) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 70) | public FOLNode copy()
    method copySentence (line 80) | public Sentence copySentence()
    method Equals (line 87) | public override bool Equals(Object o)
    method GetHashCode (line 104) | public override int GetHashCode()
    method ToString (line 119) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/ast/Sentence.cs
  type Sentence (line 9) | public interface Sentence : FOLNode
    method copySentence (line 11) | Sentence copySentence();

FILE: aima-csharp/logic/fol/parsing/ast/Term.cs
  type Term (line 9) | public interface Term : FOLNode
    method getArgs (line 11) | List<Term> getArgs();
    method copy (line 13) | Term copy();

FILE: aima-csharp/logic/fol/parsing/ast/TermEquality.cs
  class TermEquality (line 14) | public class TermEquality : AtomicSentence
    method getEqualitySynbol (line 21) | public static String getEqualitySynbol()
    method TermEquality (line 26) | public TermEquality(Term term1, Term term2)
    method getTerm1 (line 34) | public Term getTerm1()
    method getTerm2 (line 39) | public Term getTerm2()
    method getSymbolicName (line 46) | public String getSymbolicName()
    method isCompound (line 51) | public bool isCompound()
    method getArgs (line 56) | List<Term> AtomicSentence.getArgs()
    method copy (line 61) | AtomicSentence AtomicSentence.copy()
    method getArgs (line 66) | public List<FOLNode> getArgs()
    method accept (line 71) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 76) | public FOLNode copy()
    method copySentence (line 81) | public Sentence copySentence()
    method Equals (line 88) | public override bool Equals(Object o)
    method GetHashCode (line 104) | public override int GetHashCode()
    method ToString (line 116) | public override String ToString()

FILE: aima-csharp/logic/fol/parsing/ast/Variable.cs
  class Variable (line 11) | public class Variable : Term
    method Variable (line 17) | public Variable(String s)
    method Variable (line 22) | public Variable(String s, int idx)
    method getValue (line 28) | public String getValue()
    method getSymbolicName (line 35) | public String getSymbolicName()
    method isCompound (line 40) | public bool isCompound()
    method getArgs (line 45) | List<FOLNode> FOLNode.getArgs()
    method getArgs (line 50) | public List<Term> getArgs()
    method accept (line 57) | public Object accept(FOLVisitor v, Object arg)
    method copy (line 62) | FOLNode FOLNode.copy()
    method copy (line 67) | public Term copy()
    method getIndexical (line 74) | public int getIndexical()
    method setIndexical (line 79) | public void setIndexical(int idx)
    method getIndexedValue (line 85) | public String getIndexedValue()
    method Equals (line 90) | public override bool Equals(Object o)
    method GetHashCode (line 107) | public override int GetHashCode()
    method ToString (line 119) | public override String ToString()

FILE: aima-csharp/logic/propositional/agent/KBAgent.cs
  class KBAgent (line 32) | public abstract class KBAgent : AbstractAgent
    method KBAgent (line 39) | public KBAgent(KnowledgeBase KB)
    method execute (line 45) | public override Action execute(Percept percept)
    method makePerceptSentence (line 72) | public abstract Sentence makePerceptSentence(Percept percept, int t);
    method makeActionQuery (line 84) | public abstract Sentence makeActionQuery(int t);
    method makeActionSentence (line 95) | public abstract Sentence makeActionSentence(Action action, int t);
    method ask (line 109) | public abstract Action ask(KnowledgeBase KB, Sentence actionQuery);

FILE: aima-csharp/logic/propositional/kb/KnowledgeBase.cs
  class KnowledgeBase (line 6) | public class KnowledgeBase
    method tell (line 8) | internal void tell(Sentence sentence)

FILE: aima-csharp/logic/propositional/parsing/PLVisitor.cs
  type PLVisitor (line 25) | public interface PLVisitor<A, R>
    method visitPropositionSymbol (line 36) | R visitPropositionSymbol(PropositionSymbol sentence, A arg);
    method visitUnarySentence (line 47) | R visitUnarySentence(ComplexSentence sentence, A arg);
    method visitBinarySentence (line 58) | R visitBinarySentence(ComplexSentence sentence, A arg);

FILE: aima-csharp/logic/propositional/parsing/ast/AtomicSentence.cs
  class AtomicSentence (line 14) | public abstract class AtomicSentence : Sentence

FILE: aima-csharp/logic/propositional/parsing/ast/ComplexSentence.cs
  class ComplexSentence (line 15) | public class ComplexSentence : Sentence
    method ComplexSentence (line 33) | public ComplexSentence(Connective connective, params Sentence[] senten...
    method ComplexSentence (line 56) | public ComplexSentence(Sentence sentenceL, Connective binaryConnective...
    method getConnective (line 61) | public override Connective getConnective()
    method getNumberSimplerSentences (line 66) | public override int getNumberSimplerSentences()
    method getSimplerSentence (line 71) | public override Sentence getSimplerSentence(int offset)
    method Equals (line 76) | public override bool Equals(Object o)
    method GetHashCode (line 113) | public override int GetHashCode()
    method ToString (line 127) | public override String ToString()
    method assertLegalArguments (line 151) | private void assertLegalArguments(Connective connective, params Senten...

FILE: aima-csharp/logic/propositional/parsing/ast/Connective.cs
  class Connective (line 29) | public class Connective
    method getSymbol (line 53) | public String getSymbol()
    method getPrecedence (line 62) | public int getPrecedence()
    method toString (line 67) | public String toString()
    method isConnective (line 80) | public static bool isConnective(String symbol)
    method get (line 115) | public static Connective get(String symbol)
    method isConnectiveIdentifierStart (line 150) | public static bool isConnectiveIdentifierStart(char ch)
    method isConnectiveIdentifierPart (line 163) | public static bool isConnectiveIdentifierPart(char ch)
    method Connective (line 177) | private Connective(String symbol, int precedence)

FILE: aima-csharp/logic/propositional/parsing/ast/PropositionSymbol.cs
  class PropositionSymbol (line 25) | public class PropositionSymbol : AtomicSentence
    method PropositionSymbol (line 40) | public PropositionSymbol(String symbol)
    method isAlwaysTrue (line 67) | public bool isAlwaysTrue()
    method isAlwaysTrueSymbol (line 77) | public static bool isAlwaysTrueSymbol(String symbol)
    method isAlwaysFalse (line 87) | public bool isAlwaysFalse()
    method isAlwaysFalseSymbol (line 97) | public static bool isAlwaysFalseSymbol(String symbol)
    method isPropositionSymbol (line 110) | public static bool isPropositionSymbol(String symbol)
    method isPropositionSymbolIdentifierStart (line 125) | public static bool isPropositionSymbolIdentifierStart(char ch)
    method isPropositionSymbolIdentifierPart (line 139) | public static bool isPropositionSymbolIdentifierPart(char ch)
    method getSymbol (line 149) | public String getSymbol()
    method Equals (line 154) | public override bool Equals(Object o)
    method GetHashCode (line 171) | public override int GetHashCode()
    method ToString (line 176) | public override String ToString()

FILE: aima-csharp/logic/propositional/parsing/ast/Sentence.cs
  class Sentence (line 23) | public abstract class Sentence : ParseTreeNode
    method getConnective (line 30) | public virtual Connective getConnective()
    method getNumberSimplerSentences (line 40) | public virtual int getNumberSimplerSentences()
    method getSimplerSentence (line 54) | public virtual Sentence getSimplerSentence(int offset)
    method isNotSentence (line 64) | public bool isNotSentence()
    method isAndSentence (line 74) | public bool isAndSentence()
    method isOrSentence (line 84) | public bool isOrSentence()
    method isImplicationSentence (line 94) | public bool isImplicationSentence()
    method isBiconditionalSentence (line 104) | public bool isBiconditionalSentence()
    method isPropositionSymbol (line 113) | public bool isPropositionSymbol()
    method isUnarySentence (line 123) | public bool isUnarySentence()
    method isBinarySentence (line 133) | public bool isBinarySentence()
    method accept (line 148) | public R accept<A, R>(PLVisitor<A, R> plv, A arg)
    method bracketSentenceIfNecessary (line 183) | public String bracketSentenceIfNecessary(Connective parentConnective,
    method newDisjunction (line 210) | public static Sentence newDisjunction(params Sentence[] disjuncts)
    method newDisjunction (line 221) | public static Sentence newDisjunction(List<Sentence> disjuncts)
    method newConjunction (line 240) | public static Sentence newConjunction(params Sentence[] conjuncts)
    method newConjunction (line 251) | public static Sentence newConjunction(List<Sentence> conjuncts)
    method hasConnective (line 266) | protected bool hasConnective(Connective connective)

FILE: aima-csharp/search/Local/FitnessFunction.cs
  type FitnessFunction (line 19) | public interface FitnessFunction<A>
    method apply (line 27) | double apply(Individual<A> individual);

FILE: aima-csharp/search/Local/Individual.cs
  class Individual (line 19) | public class Individual<A>
    method Individual (line 30) | public Individual(List<A> representation)
    method getRepresentation (line 39) | public List<A> getRepresentation()
    method length (line 48) | public int length()
    method incDescendants (line 57) | public void incDescendants()
    method getDescendants (line 63) | public int getDescendants()
    method toString (line 68) | public String toString()

FILE: aima-csharp/search/Local/Scheduler.cs
  class Scheduler (line 10) | public class Scheduler
    method Scheduler (line 15) | public Scheduler(int k, double lam, int limit)
    method Scheduler (line 22) | public Scheduler()
    method getTemp (line 29) | public double getTemp(int t)

FILE: aima-csharp/search/framework/CutOffIndicatorAction.cs
  class CutOffIndicatorAction (line 13) | public class CutOffIndicatorAction : DynamicAction
    method isNoOp (line 18) | public bool isNoOp()
    method CutOffIndicatorAction (line 24) | private CutOffIndicatorAction(): base("CutOff")

FILE: aima-csharp/search/framework/EvaluationFunction.cs
  type EvaluationFunction (line 15) | public interface EvaluationFunction
    method f (line 17) | double f(Node n);

FILE: aima-csharp/search/framework/HeuristicFunction.cs
  type HeuristicFunction (line 19) | public interface HeuristicFunction
    method h (line 21) | double h(Object state);

FILE: aima-csharp/search/framework/Metrics.cs
  class Metrics (line 12) | public class Metrics
    method Metrics (line 16) | public Metrics()
    method set (line 21) | public void set(String name, int i)
    method set (line 26) | public void set(String name, double d)
    method incrementInt (line 31) | public void incrementInt(String name)
    method set (line 36) | public void set(String name, long l)
    method getInt (line 41) | public int getInt(String name)
    method getDouble (line 46) | public double getDouble(String name)
    method getLong (line 51) | public long getLong(String name)
    method get (line 56) | public String get(String name)
    method keySet (line 61) | public HashSet<String> keySet()
    method toString (line 66) | public String toString()

FILE: aima-csharp/search/framework/Node.cs
  class Node (line 21) | public class Node
    method Node (line 46) | public Node(object state)
    method Node (line 63) | public Node(object state, Node parent, Action action, double stepCost)...
    method GetPathFromRoot (line 82) | public List<Node> GetPathFromRoot()
    method IsRoot (line 105) | public bool IsRoot()
    method ToString (line 110) | public override string ToString()

FILE: aima-csharp/search/framework/NodeExpander.cs
  class NodeExpander (line 15) | public class NodeExpander
    method createRootNode (line 19) | public Node createRootNode(System.Object state)
    method createNode (line 29) | public Node createNode(System.Object state, Node parent, Action action...
    method expand (line 46) | public List<Node> expand(Node node, Problem problem)
    type NodeListener (line 73) | public interface NodeListener
      method onNodeExpanded (line 75) | void onNodeExpanded(Node node);
    method addNodeListener (line 91) | public void addNodeListener(NodeListener listener)
    method resetCounter (line 99) | public void resetCounter()
    method getNumOfExpandCalls (line 108) | public int getNumOfExpandCalls()

FILE: aima-csharp/search/framework/PathCostFunction.cs
  class PathCostFunction (line 13) | public class PathCostFunction
    method PathCostFunction (line 15) | public PathCostFunction()
    method g (line 26) | public double g(Node n)

FILE: aima-csharp/search/framework/PerceptToStateFunction.cs
  type PerceptToStateFunction (line 15) | public interface PerceptToStateFunction
    method getState (line 24) | Object getState(Percept p);

FILE: aima-csharp/search/framework/Search.cs
  type Search (line 12) | public interface Search
    method search (line 26) | List<Action> search(Problem p);
    method getMetrics (line 33) | Metrics getMetrics();

FILE: aima-csharp/search/framework/SearchAgent.cs
  class SearchAgent (line 12) | public class SearchAgent : AbstractAgent
    method SearchAgent (line 20) | public SearchAgent(Problem p, Search search)
    method execute (line 27) | public override Action execute(Percept p)
    method isDone (line 40) | public bool isDone()
    method getActions (line 45) | public List<Action> getActions()
    method getInstrumentation (line 50) | public Dictionary<string, string> getInstrumentation()

FILE: aima-csharp/search/framework/SearchForActions.cs
  type SearchForActions (line 15) | public interface SearchForActions : Search
    method getNodeExpander (line 17) | NodeExpander getNodeExpander();

FILE: aima-csharp/search/framework/SearchUtils.cs
  class SearchUtils (line 15) | public class SearchUtils
    method getSequenceOfActions (line 21) | public static List<Action> getSequenceOfActions(Node node)
    method failure (line 46) | public static List<Action> failure()
    method isFailure (line 52) | public static bool isFailure(List<Action> actions)
    method isGoalState (line 72) | public static bool isGoalState(Problem p, Node n)

FILE: aima-csharp/search/framework/SimpleProblemSolvingAgent.cs
  class SimpleProblemSolvingAgent (line 39) | public abstract class SimpleProblemSolvingAgent : AbstractAgent
    method SimpleProblemSolvingAgent (line 56) | public SimpleProblemSolvingAgent()
    method SimpleProblemSolvingAgent (line 68) | public SimpleProblemSolvingAgent(int maxGoalsToFormulate)
    method execute (line 75) | public override Action execute(Percept p)
    method updateState (line 126) | protected abstract State updateState(Percept p);
    method formulateGoal (line 128) | protected abstract System.Object formulateGoal();
    method formulateProblem (line 130) | protected abstract Problem formulateProblem(System.Object goal);
    method search (line 132) | protected abstract List<Action> search(Problem problem);
    method notifyViewOfMetrics (line 134) | protected abstract void notifyViewOfMetrics();

FILE: aima-csharp/search/framework/SolutionChecker.cs
  type SolutionChecker (line 19) | public interface SolutionChecker : GoalTest
    method isAcceptableSolution (line 33) | bool isAcceptableSolution(List<Action> actions, System.Object goal);

FILE: aima-csharp/search/framework/problem/ActionsFunction.cs
  type ActionsFunction (line 15) | public interface ActionsFunction
    method actions (line 25) | HashSet<Action> actions(System.Object s);

FILE: aima-csharp/search/framework/problem/BidirectionalProblem.cs
  type BidirectionalProblem (line 12) | public interface BidirectionalProblem
    method getOriginalProblem (line 14) | Problem getOriginalProblem();
    method getReverseProblem (line 16) | Problem getReverseProblem();

FILE: aima-csharp/search/framework/problem/DefaultGoalTest.cs
  class DefaultGoalTest (line 11) | public class DefaultGoalTest : GoalTest
    method DefaultGoalTest (line 16) | public DefaultGoalTest(Object goalState)
    method isGoalState (line 21) | public bool isGoalState(Object state)

FILE: aima-csharp/search/framework/problem/DefaultStepCostFunction.cs
  class DefaultStepCostFunction (line 11) | public class DefaultStepCostFunction : StepCostFunction
    method c (line 15) | public double c(System.Object stateFrom, Action action, System.Object ...

FILE: aima-csharp/search/framework/problem/GoalTest.cs
  type GoalTest (line 13) | public interface GoalTest
    method isGoalState (line 20) | bool isGoalState(System.Object state);

FILE: aima-csharp/search/framework/problem/Problem.cs
  class Problem (line 31) | public class Problem
    method Problem (line 59) | public Problem(Object initialState, ActionsFunction actionsFunction,
    method Problem (line 87) | public Problem(Object initialState, ActionsFunction actionsFunction,
    method getInitialState (line 103) | public Object getInitialState()
    method isGoalState (line 113) | public bool isGoalState(Object state)
    method getGoalTest (line 123) | public GoalTest getGoalTest()
    method getActionsFunction (line 133) | public ActionsFunction getActionsFunction()
    method getResultFunction (line 143) | public ResultFunction getResultFunction()
    method getStepCostFunction (line 153) | public StepCostFunction getStepCostFunction()
    method Problem (line 160) | protected Problem()

FILE: aima-csharp/search/framework/problem/ResultFunction.cs
  type ResultFunction (line 17) | public interface ResultFunction
    method result (line 28) | System.Object result(System.Object s, Action a);

FILE: aima-csharp/search/framework/problem/StepCostFunction.cs
  type StepCostFunction (line 14) | public interface StepCostFunction
    method c (line 28) | double c(System.Object s, Action a, System.Object sDelta);

FILE: aima-csharp/search/framework/qsearch/GraphSearch.cs
  class GraphSearch (line 40) | public class GraphSearch : QueueSearch
    method GraphSearch (line 44) | public GraphSearch() : this(new NodeExpander())
    method GraphSearch (line 49) | public GraphSearch(NodeExpander nodeExpander): base(nodeExpander)
    method search (line 58) | public override List<Action> search(Problem problem, Queue<Node> front...
    method addToFrontier (line 70) | protected override void addToFrontier(Node node)
    method removeFromFrontier (line 87) | protected override Node removeFromFrontier()
    method isFrontierEmpty (line 100) | protected override bool isFrontierEmpty()

FILE: aima-csharp/search/framework/qsearch/GraphSearchBFS.cs
  class GraphSearchBFS (line 37) | public class GraphSearchBFS : QueueSearch
    method GraphSearchBFS (line 42) | public GraphSearchBFS() : this(new NodeExpander())
    method GraphSearchBFS (line 47) | public GraphSearchBFS(NodeExpander nodeExpander) : base(nodeExpander)
    method search (line 56) | public override List<Action> search(Problem problem, Queue<Node> front...
    method addToFrontier (line 68) | protected override void addToFrontier(Node node)
    method removeFromFrontier (line 84) | protected override Node removeFromFrontier()
    method isFrontierEmpty (line 96) | protected override bool isFrontierEmpty()

FILE: aima-csharp/search/framework/qsearch/QueueSearch.cs
  class QueueSearch (line 18) | public abstract class QueueSearch
    method QueueSearch (line 30) | protected QueueSearch(NodeExpander nodeExpander)
    method getNodeExpander (line 35) | public virtual NodeExpander getNodeExpander()
    method search (line 57) | public virtual List<Action> search(Problem problem, Queue<Node> frontier)
    method addToFrontier (line 106) | protected abstract void addToFrontier(Node node);
    method removeFromFrontier (line 114) | protected abstract Node removeFromFrontier();
    method isFrontierEmpty (line 120) | protected abstract bool isFrontierEmpty();
    method setEarlyGoalCheck (line 128) | public void setEarlyGoalCheck(bool state)
    method getMetrics (line 136) | public virtual Metrics getMetrics()
    method clearInstrumentation (line 145) | public void clearInstrumentation()
    method updateMetrics (line 154) | protected void updateMetrics(int queueSize)
    method getSolution (line 164) | private List<Action> getSolution(Node node)

FILE: aima-csharp/search/framework/qsearch/TreeSearch.cs
  class TreeSearch (line 32) | public class TreeSearch : QueueSearch
    method TreeSearch (line 34) | public TreeSearch(): this(new NodeExpander())
    method TreeSearch (line 39) | public TreeSearch(NodeExpander nodeExpander): base(nodeExpander)
    method addToFrontier (line 47) | protected override void addToFrontier(Node node)
    method removeFromFrontier (line 58) | protected override Node removeFromFrontier()
    method isFrontierEmpty (line 68) | protected override bool isFrontierEmpty()

FILE: aima-csharp/search/online/LRTAStarAgent.cs
  class LRTAStarAgent (line 47) | public class LRTAStarAgent : AbstractAgent
    method LRTAStarAgent (line 74) | public LRTAStarAgent(OnlineSearchProblem problem,
    method getProblem (line 87) | public OnlineSearchProblem getProblem()
    method setProblem (line 98) | public void setProblem(OnlineSearchProblem problem)
    method getPerceptToStateFunction (line 109) | public PerceptToStateFunction getPerceptToStateFunction()
    method setPerceptToStateFunction (line 121) | public void setPerceptToStateFunction(PerceptToStateFunction ptsFunction)
    method getHeuristicFunction (line 129) | public HeuristicFunction getHeuristicFunction()
    method setHeuristicFunction (line 142) | public void setHeuristicFunction(HeuristicFunction hf)
    method execute (line 149) | public override Action execute(Percept psDelta)
    method init (line 214) | private void init()
    method goalTest (line 223) | private bool goalTest(object state)
    method lrtaCost (line 229) | private double lrtaCost(object s, Action action, object sDelta)
    method actions (line 241) | private HashSet<Action> actions(object state)

FILE: aima-csharp/search/online/OnlineDFSAgent.cs
  class OnlineDFSAgent (line 42) | public class OnlineDFSAgent : AbstractAgent
    method OnlineDFSAgent (line 66) | public OnlineDFSAgent(OnlineSearchProblem problem,
    method getProblem (line 78) | public OnlineSearchProblem getProblem()
    method setProblem (line 89) | public void setProblem(OnlineSearchProblem problem)
    method getPerceptToStateFunction (line 100) | public PerceptToStateFunction getPerceptToStateFunction()
    method setPerceptToStateFunction (line 112) | public void setPerceptToStateFunction(PerceptToStateFunction ptsFunction)
    method execute (line 119) | public override Action execute(Percept psDelta)
    method init (line 204) | private void init()
    method goalTest (line 214) | private bool goalTest(object state)
    method actions (line 219) | private List<Action> actions(object state)

FILE: aima-csharp/search/online/OnlineSearchProblem.cs
  class OnlineSearchProblem (line 25) | public class OnlineSearchProblem
    method OnlineSearchProblem (line 43) | public OnlineSearchProblem(ActionsFunction actionsFunction,
    method OnlineSearchProblem (line 64) | public OnlineSearchProblem(ActionsFunction actionsFunction,
    method getActionsFunction (line 77) | public ActionsFunction getActionsFunction()
    method isGoalState (line 90) | public bool isGoalState(Object state)
    method getStepCostFunction (line 100) | public StepCostFunction getStepCostFunction()
    method OnlineSearchProblem (line 107) | protected OnlineSearchProblem()

FILE: aima-csharp/util/ArrayIterator.cs
  class ArrayIterator (line 12) | public class ArrayIterator<T> : IEnumerator<T>
    method ArrayIterator (line 33) | public ArrayIterator(T[] values)
    method hasNext (line 39) | public bool hasNext()
    method next (line 44) | public T next()
    method remove (line 49) | public void remove()
    method MoveNext (line 54) | public bool MoveNext()
    method Dispose (line 60) | public void Dispose()
    method Reset (line 65) | public void Reset()

FILE: aima-csharp/util/CSharpRandomizer.cs
  class CSharpRandomizer (line 13) | public class CSharpRandomizer : Randomizer
    method CSharpRandomizer (line 18) | public CSharpRandomizer(): this(_r)
    method CSharpRandomizer (line 23) | public CSharpRandomizer(Random r)
    method nextDouble (line 29) | public double nextDouble()

FILE: aima-csharp/util/DisjointSets.cs
  class DisjointSets (line 33) | public class DisjointSets<E>
    method DisjointSets (line 41) | public DisjointSets()
    method DisjointSets (line 53) | public DisjointSets(ICollection<E> initialElements)
    method DisjointSets (line 68) | public DisjointSets(params E[] elements)
    method makeSet (line 86) | public void makeSet(E element)
    method union (line 113) | public void union(E element1, E element2)
    method find (line 160) | public LinkedHashSet<E> find(E element)
    method getElementToDisjointSet (line 174) | public Dictionary<E, HashSet<E>> getElementToDisjointSet()
    method getDisjointSets (line 192) | public HashSet<HashSet<E>> getDisjointSets()
    method numberDisjointSets (line 211) | public int numberDisjointSets()
    method clear (line 219) | public void clear()
    class IdentityHashSet (line 231) | private class IdentityHashSet<H> : HashSet<H> {
      method hashCode (line 234) | public  int hashCode()
      method equals (line 239) | public bool equals(Object o)

FILE: aima-csharp/util/FrequencyCounter.cs
  class FrequencyCounter (line 13) | public class FrequencyCounter<T>
    method FrequencyCounter (line 21) | public FrequencyCounter()
    method getCount (line 37) | public int getCount(T key)
    method incrementFor (line 54) | public void incrementFor(T key)
    method probabilityOf (line 79) | public Double probabilityOf(T key)
    method getStates (line 101) | public HashSet<T> getStates()
    method clear (line 109) | public void clear()
    method toString (line 115) | public String toString()

FILE: aima-csharp/util/Interval.cs
  class Interval (line 15) | public class Interval<C>
    method Interval (line 22) | public Interval()
    method Interval (line 35) | public Interval(IComparable<C> lower, IComparable<C> upper)
    method Interval (line 55) | public Interval(IComparable<C> lower, bool lowerInclusive,
    method isInInterval (line 71) | public bool isInInterval(C o)
    method isLowerInclusive (line 108) | public bool isLowerInclusive()
    method isLowerExclusive (line 118) | public bool isLowerExclusive()
    method setLowerInclusive (line 130) | public void setLowerInclusive(bool inclusive)
    method setLowerExclusive (line 142) | public void setLowerExclusive(bool exclusive)
    method getLower (line 152) | public IComparable<C> getLower()
    method setLower (line 163) | public void setLower(IComparable<C> lower)
    method isUpperInclusive (line 173) | public bool isUpperInclusive()
    method isUpperExclusive (line 183) | public bool isUpperExclusive()
    method setUpperInclusive (line 195) | public void setUpperInclusive(bool inclusive)
    method setUpperExclusive (line 207) | public void setUpperExclusive(bool exclusive)
    method getUpper (line 217) | public IComparable<C> getUpper()
    method setUpper (line 228) | public void setUpper(IComparable<C> upper)
    method toString (line 233) | public System.String toString()

FILE: aima-csharp/util/LUDecomposition.cs
  class LUDecomposition (line 19) | public class LUDecomposition
    method LUDecomposition (line 62) | public LUDecomposition(Matrix A)
    method isNonsingular (line 181) | public bool isNonsingular()
    method getL (line 196) | public Matrix getL()
    method getU (line 226) | public Matrix getU()
    method getPivot (line 252) | public int[] getPivot()
    method getDoublePivot (line 267) | public double[] getDoublePivot()
    method det (line 284) | public double det()
    method solve (line 309) | public Matrix solve(Matrix B)

FILE: aima-csharp/util/LabeledGraph.cs
  class LabeledGraph (line 15) | public class LabeledGraph<VertexLabelType, EdgeLabelType>
    method LabeledGraph (line 26) | public LabeledGraph()
    method addVertex (line 38) | public void addVertex(VertexLabelType v)
    method set (line 55) | public void set(VertexLabelType from, VertexLabelType to, EdgeLabelTyp...
    method checkForNewVertex (line 63) | private Dictionary<VertexLabelType, EdgeLabelType> checkForNewVertex(
    method remove (line 84) | public void remove(VertexLabelType from, VertexLabelType to)
    method get (line 103) | public EdgeLabelType get(VertexLabelType from, VertexLabelType to)
    method getSuccessors (line 113) | public List<VertexLabelType> getSuccessors(VertexLabelType v)
    method getVertexLabels (line 123) | public List<VertexLabelType> getVertexLabels()
    method isVertexLabel (line 129) | public bool isVertexLabel(VertexLabelType v)
    method clear (line 135) | public void clear()

FILE: aima-csharp/util/LinkedHashSet.cs
  class LinkedHashSet (line 7) | public class LinkedHashSet<T> : ISet<T> {
    method LinkedHashSet (line 12) | public LinkedHashSet(int initialCapacity) {
    method LinkedHashSet (line 17) | public LinkedHashSet() {
    method LinkedHashSet (line 22) | public LinkedHashSet(IEnumerable<T> e) : this() {
    method LinkedHashSet (line 26) | public LinkedHashSet(int initialCapacity, IEnumerable<T> e) : this(ini...
    method addEnumerable (line 30) | private void addEnumerable(IEnumerable<T> e) {
    method Add (line 38) | public bool Add(T item) {
    method ExceptWith (line 47) | public void ExceptWith(IEnumerable<T> other) {
    method IntersectWith (line 56) | public void IntersectWith(IEnumerable<T> other) {
    method IsProperSubsetOf (line 69) | public bool IsProperSubsetOf(IEnumerable<T> other) {
    method IsProperSupersetOf (line 85) | public bool IsProperSupersetOf(IEnumerable<T> other) {
    method IsSubsetOf (line 105) | public bool IsSubsetOf(IEnumerable<T> other) {
    method IsSupersetOf (line 117) | public bool IsSupersetOf(IEnumerable<T> other) {
    method Overlaps (line 129) | public bool Overlaps(IEnumerable<T> other) {
    method SetEquals (line 141) | public bool SetEquals(IEnumerable<T> other) {
    method SymmetricExceptWith (line 152) | public void SymmetricExceptWith(IEnumerable<T> other) {
    method UnionWith (line 170) | public void UnionWith(IEnumerable<T> other) {
    method Add (line 193) | void ICollection<T>.Add(T item) {
    method Clear (line 197) | public void Clear() {
    method Contains (line 202) | public bool Contains(T item) {
    method CopyTo (line 206) | public void CopyTo(T[] array, int arrayIndex) {
    method Remove (line 210) | public bool Remove(T item) {
    method GetEnumerator (line 222) | public IEnumerator<T> GetEnumerator() {
    method GetEnumerator (line 228) | IEnumerator IEnumerable.GetEnumerator() {

FILE: aima-csharp/util/Matrix.cs
  class Matrix (line 58) | public class Matrix
    method createDiagonalMatrix (line 86) | public static Matrix createDiagonalMatrix(List<Double> values)
    method Matrix (line 105) | public Matrix(int m, int n)
    method Matrix (line 127) | public Matrix(int m, int n, double s)
    method Matrix (line 152) | public Matrix(double[][] A)
    method Matrix (line 178) | public Matrix(double[][] A, int m, int n)
    method Matrix (line 197) | public Matrix(double[] vals, int m)
    method constructWithCopy (line 229) | public static Matrix constructWithCopy(double[][] A)
    method copy (line 254) | public Matrix copy()
    method clone (line 272) | public Object clone()
    method getArray (line 283) | public double[][] getArray()
    method getArrayCopy (line 294) | public double[][] getArrayCopy()
    method getColumnPackedCopy (line 314) | public double[] getColumnPackedCopy()
    method getRowPackedCopy (line 333) | public double[] getRowPackedCopy()
    method getRowDimension (line 352) | public int getRowDimension()
    method getColumnDimension (line 363) | public int getColumnDimension()
    method get (line 379) | public double get(int i, int j)
    method getMatrix (line 400) | public Matrix getMatrix(int i0, int i1, int j0, int j1)
    method getMatrix (line 427) | public Matrix getMatrix(int[] r, int[] c)
    method getMatrix (line 457) | public Matrix getMatrix(int i0, int i1, int[] c)
    method getMatrix (line 487) | public Matrix getMatrix(int[] r, int j0, int j1)
    method set (line 514) | public void set(int i, int j, double s)
    method setMatrix (line 536) | public void setMatrix(int i0, int i1, int j0, int j1, Matrix X)
    method setMatrix (line 560) | public void setMatrix(int[] r, int[] c, Matrix X)
    method setMatrix (line 586) | public void setMatrix(int[] r, int j0, int j1, Matrix X)
    method setMatrix (line 613) | public void setMatrix(int i0, int i1, int[] c, Matrix X)
    method transpose (line 631) | public Matrix transpose()
    method norm1 (line 651) | public double norm1()
    method normInf (line 681) | public double normInf()
    method uminus (line 717) | public Matrix uminus()
    method plus (line 739) | public Matrix plus(Matrix B)
    method plusEquals (line 762) | public Matrix plusEquals(Matrix B)
    method minus (line 783) | public Matrix minus(Matrix B)
    method minusEquals (line 806) | public Matrix minusEquals(Matrix B)
    method arrayTimes (line 827) | public Matrix arrayTimes(Matrix B)
    method arrayTimesEquals (line 850) | public Matrix arrayTimesEquals(Matrix B)
    method arrayRightDivide (line 871) | public Matrix arrayRightDivide(Matrix B)
    method arrayRightDivideEquals (line 894) | public Matrix arrayRightDivideEquals(Matrix B)
    method arrayLeftDivide (line 915) | public Matrix arrayLeftDivide(Matrix B)
    method arrayLeftDivideEquals (line 938) | public Matrix arrayLeftDivideEquals(Matrix B)
    method times (line 959) | public Matrix times(double s)
    method timesEquals (line 981) | public Matrix timesEquals(double s)
    method times (line 1003) | public Matrix times(Matrix B)
    method lu (line 1040) | public LUDecomposition lu()
    method solve (line 1089) | public Matrix solve(Matrix B)
    method solveTranspose (line 1103) | public Matrix solveTranspose(Matrix B)
    method inverse (line 1114) | public Matrix inverse()
    method det (line 1125) | public double det()
    method trace (line 1153) | public double trace()
    method random (line 1173) | public static Matrix random(int m, int n)
    method identity (line 1198) | public static Matrix identity(int m, int n)
    method toString (line 1212) | public String toString()
    method checkMatrixDimensions (line 1235) | private void checkMatrixDimensions(Matrix B)

FILE: aima-csharp/util/MixedRadixNumber.cs
  class MixedRadixNumber (line 14) | public class MixedRadixNumber
    method MixedRadixNumber (line 35) | public MixedRadixNumber(long value, int[] radices)
    method MixedRadixNumber (line 53) | public MixedRadixNumber(long value, List<int> radices)
    method MixedRadixNumber (line 73) | public MixedRadixNumber(int[] radixValues, int[] radices): this(0, rad...
    method getCurrentValueFor (line 89) | public long getCurrentValueFor(int[] radixValues)
    method setCurrentValueFor (line 121) | public void setCurrentValueFor(int[] radixValues)
    method getMaxAllowedValue (line 136) | public long getMaxAllowedValue()
    method increment (line 148) | public bool increment()
    method decrement (line 165) | public bool decrement()
    method getCurrentNumeralValue (line 183) | public int getCurrentNumeralValue(int atPosition)
    method intValue (line 212) | public int intValue()
    method longValue (line 217) | public long longValue()
    method floatValue (line 222) | public float floatValue()
    method doubleValue (line 227) | public double doubleValue()
    method toString (line 234) | public String toString()
    method calculateMaxValue (line 259) | private void calculateMaxValue()

FILE: aima-csharp/util/MockRandomizer.cs
  class MockRandomizer (line 12) | public class MockRandomizer : Randomizer
    method MockRandomizer (line 22) | public MockRandomizer(double[] values)
    method nextDouble (line 30) | public double nextDouble()

FILE: aima-csharp/util/Pair.cs
  class Pair (line 11) | public class Pair<X, Y>
    method Pair (line 25) | public Pair(X a, Y b)
    method getFirst (line 36) | public X getFirst()
    method getSecond (line 46) | public Y getSecond()
    method Equals (line 52) | public override bool Equals(Object o)
    method hashCode (line 62) | public int hashCode()
    method ToString (line 67) | public override String ToString()

FILE: aima-csharp/util/Point2D.cs
  class Point2D (line 13) | public class Point2D
    method Point2D (line 18) | public Point2D(double x, double y)
    method getX (line 30) | public double getX()
    method getY (line 41) | public double getY()
    method distance (line 51) | public double distance(Point2D pt)

FILE: aima-csharp/util/Randomizer.cs
  type Randomizer (line 7) | public interface Randomizer
    method nextDouble (line 14) | double nextDouble();

FILE: aima-csharp/util/SetOps.cs
  class SetOps (line 19) | public class SetOps
    method union (line 29) | public static List<T> union<T>(List<T> s1, List<T> s2)
    method intersection (line 48) | public static List<T> intersection<T>(List<T> s1, List<T> s2)
    method difference (line 68) | public static List<T> difference<T>(List<T> s1, List<T> s2)

FILE: aima-csharp/util/Table.cs
  class Table (line 11) | public class Table<RowHeaderType, ColumnHeaderType, ValueType> // where ...
    method Table (line 17) | public Table(List<RowHeaderType> rowHeaders,
    method set (line 30) | public void set(RowHeaderType r, ColumnHeaderType c, ValueType v)
    method get (line 42) | public ValueType get(RowHeaderType r, ColumnHeaderType c)
    method ToString (line 57) | public override System.String ToString()
    class Row (line 72) | class Row<R>
      method Row (line 76) | public Row()
      method cells (line 82) | public Dictionary<ColumnHeaderType, ValueType> cells()
    class Cell (line 89) | class Cell<ValueHeaderType>
      method Cell (line 93) | public Cell()
      method Cell (line 98) | public Cell(ValueHeaderType value)
      method set (line 103) | public void set(ValueHeaderType value)
      method value (line 108) | public ValueHeaderType value()

FILE: aima-csharp/util/Triplet.cs
  class Triplet (line 11) | public class Triplet<X, Y, Z>
    method Triplet (line 29) | public Triplet(X x, Y y, Z z)
    method getSecond (line 41) | public Y getSecond()
    method getThird (line 51) | public Z getThird()
    method Equals (line 56) | public override bool Equals(Object o)
    method hashCode (line 67) | public int hashCode()
    method toString (line 72) | public String toString()

FILE: aima-csharp/util/TwoKeyHashMap.cs
  class TwoKeyHashMap (line 20) | public class TwoKeyHashMap<K1, K2, V> : Dictionary<Pair<K1, K2>, V>
    method put (line 39) | public void put(K1 key1, K2 key2, V value)
    method get (line 64) | public V get(K1 key1, K2 key2)
    method containsKey (line 89) | public bool containsKey(K1 key1, K2 key2)
    method removeKey (line 110) | public V removeKey(K1 key1, K2 key2, V value)

FILE: aima-csharp/util/Util.cs
  class Util (line 13) | public class Util
    method first (line 28) | public static T first<T>(List<T> l)
    method rest (line 41) | public static List<T> rest<T>(List<T> l)
    method createSet (line 54) | public static HashSet<T> createSet<T>(params T[] values)
    method randombool (line 67) | public static bool randombool()
    method selectRandomlyFromList (line 83) | public static T selectRandomlyFromList<T>(List<T> l)
    method normalize (line 89) | public static double[] normalize(double[] probDist)
    method normalize (line 109) | public static List<Double> normalize(List<Double> values)
    method min (line 125) | public static int min(int i, int j)
    method max (line 130) | public static int max(int i, int j)
    method max (line 135) | public static int max(int i, int j, int k)
    method min (line 140) | public static int min(int i, int j, int k)
    method mode (line 145) | public static T mode<T>(List<T> l)
    method yesno (line 171) | public static String[] yesno()
    method log2 (line 176) | public static double log2(double d)
    method information (line 181) | public static double information(double[] probabilities)
    method removeFrom (line 191) | public static List<T> removeFrom<T>(List<T> list, T member)
    method sumOfSquares (line 198) | public static double sumOfSquares<T>(List<T> list)
    method ntimes (line 208) | public static String ntimes(String s, int n)
    method checkForNanOrInfinity (line 218) | public static void checkForNanOrInfinity(double d)
    method randomNumberBetween (line 230) | public static int randomNumberBetween(int i, int j)
    method calculateMean (line 236) | public static double calculateMean(List<Double> lst)
    method calculateStDev (line 246) | public static double calculateStDev(List<Double> values, double mean)
    method normalizeFromMeanAndStdev (line 266) | public static List<Double> normalizeFromMeanAndStdev(List<Double> values,
    method generateRandomDoubleBetween (line 277) | public static double generateRandomDoubleBetween(double lowerLimit,

FILE: aima-csharp/util/Vector.cs
  class Vector (line 10) | public class Vector : Matrix
    method Vector (line 21) | public Vector(int size) : base(size, 1)
    method Vector (line 32) | public Vector(List<double> lst) : base(lst.Count, 1)
    method getValue (line 48) | public double getValue(int i)
    method setValue (line 61) | public void setValue(int index, double value)
    method copyVector (line 71) | public Vector copyVector()
    method size (line 86) | public int size()
    method minus (line 99) | public Vector minus(Vector v)
    method plus (line 118) | public Vector plus(Vector v)
    method indexHavingMaxValue (line 136) | public int indexHavingMaxValue()

FILE: aima-csharp/util/XYLocation.cs
  class XYLocation (line 13) | public class XYLocation
    type Direction (line 15) | public enum Direction
    method XYLocation (line 31) | public XYLocation(int x, int y)
    method getXCoOrdinate (line 42) | public int getXCoOrdinate()
    method getYCoOrdinate (line 47) | public int getYCoOrdinate()
    method west (line 57) | public XYLocation west()
    method east (line 67) | public XYLocation east()
    method north (line 77) | public XYLocation north()
    method south (line 87) | public XYLocation south()
    method left (line 97) | public XYLocation left()
    method right (line 107) | public XYLocation right()
    method up (line 117) | public XYLocation up()
    method down (line 127) | public XYLocation down()
    method locationAt (line 139) | public XYLocation locationAt(Direction direction)
    method equals (line 163) | public bool equals(Object o)
    method toString (line 173) | public String toString()
    method hashCode (line 178) | public int hashCode()
Condensed preview — 221 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (659K chars).
[
  {
    "path": ".gitattributes",
    "chars": 2518,
    "preview": "###############################################################################\n# Set default behavior to automatically "
  },
  {
    "path": ".gitignore",
    "chars": 3833,
    "preview": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n\n# User"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2901,
    "preview": "How to Contribute to aima-csharp\n==========================\n\nThanks for considering contributing to `aima-csharp`! Wheth"
  },
  {
    "path": "LICENSE",
    "chars": 1065,
    "preview": "MIT License\n\nCopyright (c) 2018 aimacode\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\no"
  },
  {
    "path": "README.md",
    "chars": 5717,
    "preview": "# ![](https://github.com/aimacode/aima-java/blob/gh-pages/aima3e/images/aima3e.jpg)aima-csharp\nC# implementation of algo"
  },
  {
    "path": "aima-csharp/App.config",
    "chars": 182,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n    <startup> \n        <supportedRuntime version=\"v4.0\" sku=\".N"
  },
  {
    "path": "aima-csharp/Program.cs",
    "chars": 234,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nna"
  },
  {
    "path": "aima-csharp/Properties/AssemblyInfo.cs",
    "chars": 1395,
    "preview": "using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Infor"
  },
  {
    "path": "aima-csharp/agent/Action.cs",
    "chars": 543,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * Describes an Action that can"
  },
  {
    "path": "aima-csharp/agent/Agent.cs",
    "chars": 1115,
    "preview": "using System;\nusing System.Collections;\n\nnamespace aima.core.agent\n{\n    /**\n    * Artificial Intelligence A Modern Appr"
  },
  {
    "path": "aima-csharp/agent/AgentProgram.cs",
    "chars": 825,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n    * Artificial Intelligence A Mod"
  },
  {
    "path": "aima-csharp/agent/Environment.cs",
    "chars": 3255,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * An abstract description of p"
  },
  {
    "path": "aima-csharp/agent/EnvironmentObject.cs",
    "chars": 305,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * An interface used to indicat"
  },
  {
    "path": "aima-csharp/agent/EnvironmentState.cs",
    "chars": 257,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * An interface used to indicat"
  },
  {
    "path": "aima-csharp/agent/EnvironmentView.cs",
    "chars": 1391,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * Allows external applications"
  },
  {
    "path": "aima-csharp/agent/EnvironmentViewNotifier.cs",
    "chars": 438,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * @author Ciaran O'Reilly\n    "
  },
  {
    "path": "aima-csharp/agent/Model.cs",
    "chars": 498,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * Artificial Intelligence A Mo"
  },
  {
    "path": "aima-csharp/agent/Percept.cs",
    "chars": 371,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{    \n    /**\n     * Artificial Intelligence "
  },
  {
    "path": "aima-csharp/agent/State.cs",
    "chars": 594,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent\n{\n    /**\n     * Artificial Intelligence A Mo"
  },
  {
    "path": "aima-csharp/agent/impl/AbstractAgent.cs",
    "chars": 1095,
    "preview": "using System;\nusing aima.core.agent;\n\nnamespace aima.core.agent.impl\n{\n    /**\n     * @author Ravi Mohan\n     * @author "
  },
  {
    "path": "aima-csharp/agent/impl/AbstractEnvironment.cs",
    "chars": 5354,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.util;\n\nnamespace aima.core.agent."
  },
  {
    "path": "aima-csharp/agent/impl/DynamicAction.cs",
    "chars": 864,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.agent.impl\n{\n    /**\n     * "
  },
  {
    "path": "aima-csharp/agent/impl/DynamicEnvironmentState.cs",
    "chars": 451,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.agent.impl\n{\n    /**\n     * "
  },
  {
    "path": "aima-csharp/agent/impl/DynamicPercept.cs",
    "chars": 1774,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\nusing System.Diagnostics;\n\nnamespace aima.core.ag"
  },
  {
    "path": "aima-csharp/agent/impl/DynamicState.cs",
    "chars": 381,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.agent.impl\n{\n    /**\n     * "
  },
  {
    "path": "aima-csharp/agent/impl/NoOpAction.cs",
    "chars": 405,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.agent.impl\n{\n    public class NoOpAction : DynamicA"
  },
  {
    "path": "aima-csharp/agent/impl/ObjectWithDynamicAttributes.cs",
    "chars": 4076,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Diagnostics;\n\nnamespace aima.core.agent."
  },
  {
    "path": "aima-csharp/agent/impl/SimpleEnvironmentView.cs",
    "chars": 794,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.agent.impl\n{\n    /**\n     * "
  },
  {
    "path": "aima-csharp/agent/impl/aprog/ModelBasedReflexAgentProgram.cs",
    "chars": 3824,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl.aprog.simplerule;\n\nnamespace aima.co"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/SimpleReflexAgentProgram.cs",
    "chars": 2447,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.agent"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/TableDrivenAgentProgram.cs",
    "chars": 2876,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.util;\n\nnamespace ai"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/simplerule/ANDCondition.cs",
    "chars": 1024,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Diagnostics;\nusing aima.core.agent.impl;"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/simplerule/Condition.cs",
    "chars": 711,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent.impl;\n\nnamespace aima.core.agent.impl.aprog.simple"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/simplerule/EQUALCondition.cs",
    "chars": 933,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Diagnostics;\nusing aima.core.agent.impl;"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/simplerule/NOTCondition.cs",
    "chars": 802,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Diagnostics;\nusing aima.core.agent.impl;"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/simplerule/ORCondition.cs",
    "chars": 1017,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Diagnostics;\nusing aima.core.agent.impl;"
  },
  {
    "path": "aima-csharp/agent/impl/aprog/simplerule/Rule.cs",
    "chars": 1750,
    "preview": "using System.Collections.Generic;\nusing System.Text;\nusing System.Diagnostics;\nusing aima.core.agent;\nusing aima.core.ag"
  },
  {
    "path": "aima-csharp/aima-csharp.csproj",
    "chars": 15843,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"14.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.micros"
  },
  {
    "path": "aima-csharp/environment/cellworld/Cell.cs",
    "chars": 1661,
    "preview": "using System;\n\nnamespace aima.core.environment.cellworld\n{\n    /**\n     * Artificial Intelligence A Modern Approach (3rd"
  },
  {
    "path": "aima-csharp/environment/cellworld/CellWorld.cs",
    "chars": 3735,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.util;\n\nnamespace aima.core.environment.cellworld\n{\n    /"
  },
  {
    "path": "aima-csharp/environment/cellworld/CellWorldAction.cs",
    "chars": 3065,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.util;\n\nnamespace aima.core.environment.cellworl"
  },
  {
    "path": "aima-csharp/environment/cellworld/CellWorldFactory.cs",
    "chars": 703,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.environment.cellworld\n{\n    /**\n     * \n     * @aut"
  },
  {
    "path": "aima-csharp/environment/eightpuzzle/BidirectionalEightPuzzleProblem.cs",
    "chars": 954,
    "preview": "using System.Collections.Generic;\nusing aima.core.search.framework.problem;\n\nnamespace aima.core.environment.eightpuzzle"
  },
  {
    "path": "aima-csharp/environment/eightpuzzle/EightPuzzleBoard.cs",
    "chars": 5054,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.util;"
  },
  {
    "path": "aima-csharp/environment/eightpuzzle/EightPuzzleFunctionFactory.cs",
    "chars": 2557,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.search.framework.problem;\nusing aima.core.util;"
  },
  {
    "path": "aima-csharp/environment/eightpuzzle/EightPuzzleGoalTest.cs",
    "chars": 472,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.search.framework.problem;\n\nnamespace aima.core.environme"
  },
  {
    "path": "aima-csharp/environment/eightpuzzle/ManhattanHeuristicFunction.cs",
    "chars": 1402,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.search.framework;\nusing aima.core.util;\n\nnamespace aima."
  },
  {
    "path": "aima-csharp/environment/eightpuzzle/MisplacedTilleHeuristicFunction.cs",
    "chars": 1527,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.search.framework;\nusing aima.core.util;\n\nnamespace aima."
  },
  {
    "path": "aima-csharp/environment/map/AdaptableHeuristicFunction.cs",
    "chars": 939,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.search.framework;\n\nnamespace aima.core.environment.map\n{"
  },
  {
    "path": "aima-csharp/environment/map/BidirectionalMapProblem.cs",
    "chars": 1175,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.search.framework.problem;\n\nnamespace aima.core.environme"
  },
  {
    "path": "aima-csharp/environment/map/DynAttributeNames.cs",
    "chars": 1080,
    "preview": "using System;\n\nnamespace aima.core.environment.map\n{\n    /**\n     * The AIMA framework uses dynamic attributes to make i"
  },
  {
    "path": "aima-csharp/environment/map/ExtendableMap.cs",
    "chars": 4929,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.util;\n\nnamespace aima.core.environment.map\n{\n    /**\n   "
  },
  {
    "path": "aima-csharp/environment/map/Map.cs",
    "chars": 1175,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.util;\n\nnamespace aima.core.environment.map\n{\n    /**\n   "
  },
  {
    "path": "aima-csharp/environment/map/MapAgent.cs",
    "chars": 2751,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.searc"
  },
  {
    "path": "aima-csharp/environment/map/MapEnvironment.cs",
    "chars": 1720,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\n\nnamespace aima.core.environment.ma"
  },
  {
    "path": "aima-csharp/environment/map/MapEnvironmentState.cs",
    "chars": 1097,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.util;\n\nnamespace aima.core.environment.map\n{\n  "
  },
  {
    "path": "aima-csharp/environment/map/MapFunctionFactory.cs",
    "chars": 2352,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.search.framework;\nu"
  },
  {
    "path": "aima-csharp/environment/map/MapStepCostFunction.cs",
    "chars": 1146,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.search.framework.problem;\n\nnamespace aima.core."
  },
  {
    "path": "aima-csharp/environment/map/MoveToAction.cs",
    "chars": 457,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent.impl;\n\nnamespace aima.core.environment.map\n{ \n    "
  },
  {
    "path": "aima-csharp/environment/map/Scenario.cs",
    "chars": 1446,
    "preview": "using System;\n\nnamespace aima.core.environment.map\n{\n    /**\n     * A scenario specifies an environment, the agent's kno"
  },
  {
    "path": "aima-csharp/environment/map/SimplifiedRoadMapOfAustralia.cs",
    "chars": 8108,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.environment.map\n{\n    /**\n     * Represents a simpl"
  },
  {
    "path": "aima-csharp/environment/map/SimplifiedRoadMapOfPartOfRomania.cs",
    "chars": 4490,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.environment.map\n{\n    /**\n     * Represents a simpl"
  },
  {
    "path": "aima-csharp/environment/map/StraightLineDistanceHeuristicFunction.cs",
    "chars": 602,
    "preview": "using System;\nusing aima.core.util;\n\nnamespace aima.core.environment.map\n{\n    /**\n     * @author Ruediger Lunde\n     */"
  },
  {
    "path": "aima-csharp/environment/wumpusworld/AgentPercept.cs",
    "chars": 2585,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.environment.wumpusworld\n{\n    /**\n     * A"
  },
  {
    "path": "aima-csharp/environment/wumpusworld/AgentPosition.cs",
    "chars": 303,
    "preview": "using System;\n\nnamespace aima.core.environment.wumpusworld\n{\n    internal class AgentPosition\n    {\n        internal in"
  },
  {
    "path": "aima-csharp/environment/wumpusworld/ManhattanHeuristicFunction.cs",
    "chars": 1057,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.search.framework;\n\nnamespace aima.core.environment.wumpu"
  },
  {
    "path": "aima-csharp/environment/wumpusworld/Room.cs",
    "chars": 1409,
    "preview": "using System.Collections.Generic;\n\nnamespace aima.core.environment.wumpusworld\n{\n    /**\n     * Artificial Intelligence "
  },
  {
    "path": "aima-csharp/logic/common/Lexer.cs",
    "chars": 3464,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace aima.core.logic.common\n{\n    /**\n     * An a"
  },
  {
    "path": "aima-csharp/logic/common/LexerException.cs",
    "chars": 1088,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.common\n{\n    /**\n     * A runtime exception t"
  },
  {
    "path": "aima-csharp/logic/common/LogicTokenTypes.cs",
    "chars": 433,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.common\n{\n    /**\n     * @author Ravi Mohan\n  "
  },
  {
    "path": "aima-csharp/logic/common/Parser.cs",
    "chars": 4154,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.IO;\n\nnamespace aima.core.logic.common\n{\n\n    /**\n     * An "
  },
  {
    "path": "aima-csharp/logic/common/ParserException.cs",
    "chars": 1248,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.common\n{\n    /**\n     * A runtime exception t"
  },
  {
    "path": "aima-csharp/logic/common/ParserTreeNode.cs",
    "chars": 134,
    "preview": "namespace aima.core.logic.common\n{\n    /**\n     * @author Ravi Mohan\n     * \n     */\n    public interface ParseTreeNode\n"
  },
  {
    "path": "aima-csharp/logic/common/Token.cs",
    "chars": 2048,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.common\n{\n    /**\n     * A token generated by "
  },
  {
    "path": "aima-csharp/logic/fol/CNFConverter.cs",
    "chars": 18819,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb.data;\nusing aima.core.logic.fol.parsing;\nus"
  },
  {
    "path": "aima-csharp/logic/fol/Connectors.cs",
    "chars": 808,
    "preview": "using System;\n\nnamespace aima.core.logic.fol\n{\n    /**\n     * @author Ravi Mohan\n     * \n     */\n    public class Connec"
  },
  {
    "path": "aima-csharp/logic/fol/PredicateCollector.cs",
    "chars": 1421,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing;\nusing aima.core.logic.fol.parsing.ast"
  },
  {
    "path": "aima-csharp/logic/fol/Quantifiers.cs",
    "chars": 432,
    "preview": "using System;\n\nnamespace aima.core.logic.fol\n{\n    /**\n     * @author Ciaran O'Reilly\n     * \n     */\n    public class Q"
  },
  {
    "path": "aima-csharp/logic/fol/StandardizeApart.cs",
    "chars": 5280,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.inference.proof;\nusing aima.core.logic.fol.kb."
  },
  {
    "path": "aima-csharp/logic/fol/StandardizeApartInPlace.cs",
    "chars": 3228,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb.data;\nusing aima.core.logic.fol.parsing;\nus"
  },
  {
    "path": "aima-csharp/logic/fol/StandardizeApartIndexical.cs",
    "chars": 205,
    "preview": "using System;\n\nnamespace aima.core.logic.fol\n{\n    /**\n     * @author Ciaran O'Reilly\n     * \n     */\n    public interfa"
  },
  {
    "path": "aima-csharp/logic/fol/StandardizeApartIndexicalFactory.cs",
    "chars": 1856,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace aima.core.logic.fol\n{\n    /**\n     * This "
  },
  {
    "path": "aima-csharp/logic/fol/StandardizeApartResult.cs",
    "chars": 1162,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aima.core.logic.fol\n{\n"
  },
  {
    "path": "aima-csharp/logic/fol/SubstVisitor.cs",
    "chars": 2596,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb.data;\nusing aima.core.logic.fol.parsing;\nus"
  },
  {
    "path": "aima-csharp/logic/fol/SubsumptionElimination.cs",
    "chars": 3120,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb.data;\n\nnamespace aima.core.logic.fol\n{\n    "
  },
  {
    "path": "aima-csharp/logic/fol/Unifier.cs",
    "chars": 9945,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aim"
  },
  {
    "path": "aima-csharp/logic/fol/VariableCollector.cs",
    "chars": 2736,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing;\nusing aima.core.logic.fol.parsing.ast"
  },
  {
    "path": "aima-csharp/logic/fol/domain/DomainFactory.cs",
    "chars": 2625,
    "preview": "using System;\n\nnamespace aima.core.logic.fol.domain\n{\n    /**\n     * @author Ravi Mohan\n     * \n     */\n    public class"
  },
  {
    "path": "aima-csharp/logic/fol/domain/FOLDomain.cs",
    "chars": 3059,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.util;\n\nnamespace aima.core.logic.fol.domain\n{\n    /**\n  "
  },
  {
    "path": "aima-csharp/logic/fol/domain/FOLDomainAnswerLiteralAddedEvent.cs",
    "chars": 636,
    "preview": "using System;\n\nnamespace aima.core.logic.fol.domain\n{\n    /**\n     * @author Ciaran O'Reilly\n     * \n     */\n    public "
  },
  {
    "path": "aima-csharp/logic/fol/domain/FOLDomainEvent.cs",
    "chars": 334,
    "preview": "using System;\n\nnamespace aima.core.logic.fol.domain\n{\n    /**\n     * @author Ciaran O'Reilly\n     * \n     */\n    public "
  },
  {
    "path": "aima-csharp/logic/fol/domain/FOLDomainListener.cs",
    "chars": 372,
    "preview": "using System;\n\nnamespace aima.core.logic.fol.domain\n{\n    /**\n     * @author Ciaran O'Reilly\n     * \n     */\n    public "
  },
  {
    "path": "aima-csharp/logic/fol/domain/FOLDomainSkolemConstantAddedEvent.cs",
    "chars": 636,
    "preview": "using System;\n\nnamespace aima.core.logic.fol.domain\n{\n    /**\n     * @author Ciaran O'Reilly\n     * \n     */\n    public "
  },
  {
    "path": "aima-csharp/logic/fol/domain/FOLDomainSkolemFunctionAddedEvent.cs",
    "chars": 636,
    "preview": "using System;\n\nnamespace aima.core.logic.fol.domain\n{\n    /**\n     * @author Ciaran O'Reilly\n     * \n     */\n    public "
  },
  {
    "path": "aima-csharp/logic/fol/inference/AbstractModulation.cs",
    "chars": 6925,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol;\nusing aima.core.logic.fol.parsing;\nusing aima"
  },
  {
    "path": "aima-csharp/logic/fol/inference/Demodulation.cs",
    "chars": 3894,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing aima.core.logic.fol.inference.proof;\nusing aima"
  },
  {
    "path": "aima-csharp/logic/fol/inference/FOLBCAsk.cs",
    "chars": 7353,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing aima.core.logic.fol.inference.proof;\nusing aima"
  },
  {
    "path": "aima-csharp/logic/fol/inference/FOLFCAsk.cs",
    "chars": 6348,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.inference.proof;\nusing aima.core.logic.fol.kb;"
  },
  {
    "path": "aima-csharp/logic/fol/inference/FOLModelElimination.cs",
    "chars": 16745,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing aima.core.logic.fol.kb;\nusing aima.core.logic.f"
  },
  {
    "path": "aima-csharp/logic/fol/inference/FOLOTTERLikeTheoremProver.cs",
    "chars": 18115,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing aima.core.logic.fol.inferenc"
  },
  {
    "path": "aima-csharp/logic/fol/inference/FOLTFMResolution.cs",
    "chars": 8792,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing aima.core.logic.fol;\nusing aima.core.logic.fol."
  },
  {
    "path": "aima-csharp/logic/fol/inference/InferenceProcedure.cs",
    "chars": 519,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb;\nusing aima.core.logic.fol.parsing.ast;\n\nna"
  },
  {
    "path": "aima-csharp/logic/fol/inference/InferenceResult.cs",
    "chars": 1432,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.inference.proof;\n\nnamespace aima.core.logic.fo"
  },
  {
    "path": "aima-csharp/logic/fol/inference/InferenceResultPrinter.cs",
    "chars": 1392,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing aima.core.logic.fol.inference.proof;\n\nnamespace"
  },
  {
    "path": "aima-csharp/logic/fol/inference/Paramodulation.cs",
    "chars": 5838,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol;\nusing aima.core.logic.fol.inference.proof;\nus"
  },
  {
    "path": "aima-csharp/logic/fol/inference/otter/ClauseFilter.cs",
    "chars": 284,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb.data;\n\nnamespace aima.core.logic.fol.infere"
  },
  {
    "path": "aima-csharp/logic/fol/inference/otter/ClauseSimplifier.cs",
    "chars": 267,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb.data;\n\nnamespace aima.core.logic.fol.infere"
  },
  {
    "path": "aima-csharp/logic/fol/inference/otter/LightestClauseHeuristic.cs",
    "chars": 1047,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.kb.data;\n\nnamespace aima.core.logic.fol.infere"
  },
  {
    "path": "aima-csharp/logic/fol/inference/otter/defaultimpl/DefaultClauseFilter.cs",
    "chars": 474,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.inference.otter;\nusing aima.core.logic.fol.kb."
  },
  {
    "path": "aima-csharp/logic/fol/inference/otter/defaultimpl/DefaultClauseSimplifier.cs",
    "chars": 1163,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing aima.core.logic.fol.inference;\nusing aima.core."
  },
  {
    "path": "aima-csharp/logic/fol/inference/otter/defaultimpl/DefaultLightestClauseHeuristic.cs",
    "chars": 1655,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing aima.core.logic.fol.inference.otter;\nusing aima"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/AbstractProofStep.cs",
    "chars": 579,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.fol.inference.proof\n{\n    /**\n     * @author "
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/Proof.cs",
    "chars": 816,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aima.core.logic.fol.in"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofFinal.cs",
    "chars": 2405,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aima.core.logic.fol.in"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofPrinter.cs",
    "chars": 2006,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\n\nnamespace aima.core.logic.fol.inference.proof\n{\n    "
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStep.cs",
    "chars": 341,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.fol.inference.proof\n{\n    /**\n     * @author "
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepBwChGoal.cs",
    "chars": 1907,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing System.Collections.ObjectMod"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepChainCancellation.cs",
    "chars": 1244,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepChainContrapositive.cs",
    "chars": 1110,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepChainDropped.cs",
    "chars": 1010,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepChainFromClause.cs",
    "chars": 1025,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepChainReduction.cs",
    "chars": 1360,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepClauseBinaryResolvent.cs",
    "chars": 2715,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepClauseClausifySentence.cs",
    "chars": 1029,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepClauseDemodulation.cs",
    "chars": 1224,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepClauseFactor.cs",
    "chars": 1695,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepClauseParamodulation.cs",
    "chars": 1456,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepFoChAlreadyAFact.cs",
    "chars": 858,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Collections.ObjectModel;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepFoChAssertFact.cs",
    "chars": 1635,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing System.Collections.ObjectMod"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepGoal.cs",
    "chars": 782,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\n\nnamespace aima"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepPremise.cs",
    "chars": 794,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\n\nnamespace aima"
  },
  {
    "path": "aima-csharp/logic/fol/inference/proof/ProofStepRenaming.cs",
    "chars": 871,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\n\nnamespace aima"
  },
  {
    "path": "aima-csharp/logic/fol/inference/trace/FOLModelEliminationTracer.cs",
    "chars": 274,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.fol.inference.trace\n{\n    /**\n     * @author "
  },
  {
    "path": "aima-csharp/logic/fol/inference/trace/FOLTFMResolutiontracer.cs",
    "chars": 606,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.inference;\nusing aima.core.logic.fol.kb.data;\n"
  },
  {
    "path": "aima-csharp/logic/fol/kb/FOLKnowledgeBase.cs",
    "chars": 13035,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing aima.core.logic.fol;\nusing a"
  },
  {
    "path": "aima-csharp/logic/fol/kb/FOLKnowledgeBaseFactory.cs",
    "chars": 5096,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.domain;\nusing aima.core.logic.fol.inference;\n\n"
  },
  {
    "path": "aima-csharp/logic/fol/kb/data/CNF.cs",
    "chars": 1086,
    "preview": "using System;\nusing System.Collections;\nusing System.Text;\nusing System.Collections.Generic;\nusing System.Collections.Ob"
  },
  {
    "path": "aima-csharp/logic/fol/kb/data/Chain.cs",
    "chars": 2830,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing System.Collections.ObjectMod"
  },
  {
    "path": "aima-csharp/logic/fol/kb/data/Clause.cs",
    "chars": 27694,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Collections.ObjectModel;\nusing System.Li"
  },
  {
    "path": "aima-csharp/logic/fol/kb/data/Literal.cs",
    "chars": 2306,
    "preview": "using System;\nusing System.Collections;\nusing System.Text;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aima.core.l"
  },
  {
    "path": "aima-csharp/logic/fol/kb/data/ReducedLiteral.cs",
    "chars": 1016,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aim"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/AbstractFOLVisitor.cs",
    "chars": 2470,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aima.core.logic.fol.pa"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/FOLLexer.cs",
    "chars": 3925,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Text.RegularExpressions;\nusing aima.core"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/FOLParser.cs",
    "chars": 6418,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.common;\nusing aima.core.logic.fol.domain;\nusing ai"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/FOLVisitor.cs",
    "chars": 712,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing.ast;\n\nnamespace aima.core.logic.fol.pa"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/AtomicSentence.cs",
    "chars": 242,
    "preview": "using System.Collections.Generic;\n\nnamespace aima.core.logic.fol.parsing.ast\n{\n    /**\n     * @author Ciaran O'Reilly\n  "
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/ConnectedSentence.cs",
    "chars": 2453,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing aima.core.logic.fol.parsing;\n\nnamespace aima.co"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/Constant.cs",
    "chars": 1473,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing;\n\nnamespace aima.core.logic.fol.parsin"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/FOLNode.cs",
    "chars": 425,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.common;\nusing aima.core.logic.fol.parsing;\n\nnamesp"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/Function.cs",
    "chars": 2401,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing aima.core.logic.fol.parsing;\n\nnamespace aima.co"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/NotSentence.cs",
    "chars": 1911,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing aima.core.logic.fol;\nusing a"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/Predicate.cs",
    "chars": 2512,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing aima.core.logic.fol.parsing;"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/QuantifiedSentence.cs",
    "chars": 2856,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing System.Collections.ObjectMod"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/Sentence.cs",
    "chars": 231,
    "preview": "using System.Collections.Generic;\n\nnamespace aima.core.logic.fol.parsing.ast\n{\n    /**\n     * @author Ravi Mohan\n     * "
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/Term.cs",
    "chars": 239,
    "preview": "using System.Collections.Generic;\n\nnamespace aima.core.logic.fol.parsing.ast\n{\n    /**\n     * @author Ravi Mohan\n     * "
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/TermEquality.cs",
    "chars": 2323,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Text;\nusing System.Linq;\nusing System.Collections.ObjectMod"
  },
  {
    "path": "aima-csharp/logic/fol/parsing/ast/Variable.cs",
    "chars": 1889,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.fol.parsing;\n\nnamespace aima.core.logic.fol.parsin"
  },
  {
    "path": "aima-csharp/logic/propositional/agent/KBAgent.cs",
    "chars": 3445,
    "preview": "using aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.logic.propositional.kb;\nusing aima.core.logic.proposi"
  },
  {
    "path": "aima-csharp/logic/propositional/kb/KnowledgeBase.cs",
    "chars": 269,
    "preview": "using System;\nusing aima.core.logic.propositional.parsing.ast;\n\nnamespace aima.core.logic.propositional.kb\n{\n    public"
  },
  {
    "path": "aima-csharp/logic/propositional/parsing/PLVisitor.cs",
    "chars": 2087,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.logic.propositional.parsing.ast;\n\nnamespace aima.core.lo"
  },
  {
    "path": "aima-csharp/logic/propositional/parsing/ast/AtomicSentence.cs",
    "chars": 389,
    "preview": "using System;\n\nnamespace aima.core.logic.propositional.parsing.ast\n{\n    /**\n     * Artificial Intelligence A Modern App"
  },
  {
    "path": "aima-csharp/logic/propositional/parsing/ast/ComplexSentence.cs",
    "chars": 5726,
    "preview": "using aima.core.logic.propositional.parsing.ast;\nusing System;\n\nnamespace aima.core.logic.propositional.parsing.ast\n{\n "
  },
  {
    "path": "aima-csharp/logic/propositional/parsing/ast/Connective.cs",
    "chars": 5462,
    "preview": "using System;\nusing aima.core.util;\nusing System.Collections.Generic;\n\nnamespace aima.core.logic.propositional.parsing."
  },
  {
    "path": "aima-csharp/logic/propositional/parsing/ast/PropositionSymbol.cs",
    "chars": 5682,
    "preview": "using System;\nusing System.CodeDom.Compiler;\n\nnamespace aima.core.logic.propositional.parsing.ast\n{\n    /**\n    * Artif"
  },
  {
    "path": "aima-csharp/logic/propositional/parsing/ast/Sentence.cs",
    "chars": 8580,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing aima.core.logic.common;\nusing aima.core.logic."
  },
  {
    "path": "aima-csharp/search/Local/FitnessFunction.cs",
    "chars": 1010,
    "preview": "namespace aima.core.search.local\n{\n    /**\n     * Artificial Intelligence A Modern Approach (3rd Edition): page 127.<br>"
  },
  {
    "path": "aima-csharp/search/Local/Individual.cs",
    "chars": 1877,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.local\n{\n    /**\n     * Artificial Intelligen"
  },
  {
    "path": "aima-csharp/search/Local/Scheduler.cs",
    "chars": 799,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.local\n{\n    /**\n     * @author Ravi Mohan\n  "
  },
  {
    "path": "aima-csharp/search/framework/CutOffIndicatorAction.cs",
    "chars": 679,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent.impl;\n\nnamespace aima.core.search.framework\n{\n    "
  },
  {
    "path": "aima-csharp/search/framework/EvaluationFunction.cs",
    "chars": 448,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.framework\n{\n    /**\n     * Artificial Intell"
  },
  {
    "path": "aima-csharp/search/framework/HeuristicFunction.cs",
    "chars": 596,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.framework\n{\n    /**\n     * Artificial Intell"
  },
  {
    "path": "aima-csharp/search/framework/Metrics.cs",
    "chars": 1544,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.framework\n{\n    /**\n     * Stores key-value "
  },
  {
    "path": "aima-csharp/search/framework/Node.cs",
    "chars": 3583,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Action = aima.core.agent.Action;\n\nnamespace aim"
  },
  {
    "path": "aima-csharp/search/framework/NodeExpander.cs",
    "chars": 3467,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.search.framework.problem;\n\nnamespace aima.core."
  },
  {
    "path": "aima-csharp/search/framework/PathCostFunction.cs",
    "chars": 650,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.framework\n{    \n    /**\n     * Artificial In"
  },
  {
    "path": "aima-csharp/search/framework/PerceptToStateFunction.cs",
    "chars": 704,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.search.framework\n{\n    /**\n "
  },
  {
    "path": "aima-csharp/search/framework/Search.cs",
    "chars": 891,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.search.framework.problem;\n\nnamespace aima.core."
  },
  {
    "path": "aima-csharp/search/framework/SearchAgent.cs",
    "chars": 1491,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.search.framework.pr"
  },
  {
    "path": "aima-csharp/search/framework/SearchForActions.cs",
    "chars": 479,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.search.framework\n{\n    /**\n "
  },
  {
    "path": "aima-csharp/search/framework/SearchUtils.cs",
    "chars": 2634,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.search.framework.pr"
  },
  {
    "path": "aima-csharp/search/framework/SimpleProblemSolvingAgent.cs",
    "chars": 4477,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.util;\nusing aima.co"
  },
  {
    "path": "aima-csharp/search/framework/SolutionChecker.cs",
    "chars": 1304,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.search.framework.problem;\n\nnamespace aima.core."
  },
  {
    "path": "aima-csharp/search/framework/problem/ActionsFunction.cs",
    "chars": 792,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.search.framework.problem\n{\n    /**\n     * "
  },
  {
    "path": "aima-csharp/search/framework/problem/BidirectionalProblem.cs",
    "chars": 400,
    "preview": "using System.Collections.Generic;\n\nnamespace aima.core.search.framework.problem\n{\n    /**\n     * An interface describing"
  },
  {
    "path": "aima-csharp/search/framework/problem/DefaultGoalTest.cs",
    "chars": 502,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.framework.problem\n{\n    /**\n     * Checks wh"
  },
  {
    "path": "aima-csharp/search/framework/problem/DefaultStepCostFunction.cs",
    "chars": 396,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.search.framework.problem\n{\n    /**\n     * "
  },
  {
    "path": "aima-csharp/search/framework/problem/GoalTest.cs",
    "chars": 600,
    "preview": "using System.Collections.Generic;\n\nnamespace aima.core.search.framework.problem\n{\n    /**\n     * Artificial Intelligence"
  },
  {
    "path": "aima-csharp/search/framework/problem/Problem.cs",
    "chars": 5324,
    "preview": "using System;\nusing System.Collections.Generic;\n\nnamespace aima.core.search.framework.problem\n{\n    /**\n * Artificial In"
  },
  {
    "path": "aima-csharp/search/framework/problem/ResultFunction.cs",
    "chars": 1031,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\n\nnamespace aima.core.search.framework.problem\n{\n    /**\n     * "
  },
  {
    "path": "aima-csharp/search/framework/problem/StepCostFunction.cs",
    "chars": 956,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nnamespace aima.core.search.framework.problem\n{\n    /**\n     * A"
  },
  {
    "path": "aima-csharp/search/framework/qsearch/GraphSearch.cs",
    "chars": 3483,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing aima.core.agent;\nusing aima.core.search.framework;\nusing aima"
  },
  {
    "path": "aima-csharp/search/framework/qsearch/GraphSearchBFS.cs",
    "chars": 3151,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.search.framework;\nusing aima.core.search.framew"
  },
  {
    "path": "aima-csharp/search/framework/qsearch/QueueSearch.cs",
    "chars": 5880,
    "preview": "using System.Collections.Generic;\nusing System.Threading;\nusing aima.core.agent;\nusing aima.core.util;\nusing aima.core.s"
  },
  {
    "path": "aima-csharp/search/framework/qsearch/TreeSearch.cs",
    "chars": 1986,
    "preview": "using System.Collections.Generic;\nusing aima.core.search.framework;\nusing aima.core.search.framework.problem;\n\nnamespace"
  },
  {
    "path": "aima-csharp/search/online/LRTAStarAgent.cs",
    "chars": 6740,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.search.framework;\nu"
  },
  {
    "path": "aima-csharp/search/online/OnlineDFSAgent.cs",
    "chars": 6227,
    "preview": "using System.Collections.Generic;\nusing aima.core.agent;\nusing aima.core.agent.impl;\nusing aima.core.search.framework;\nu"
  },
  {
    "path": "aima-csharp/search/online/OnlineSearchProblem.cs",
    "chars": 3456,
    "preview": "using System;\nusing System.Collections.Generic;\nusing aima.core.search.framework;\nusing aima.core.search.framework.probl"
  },
  {
    "path": "aima-csharp/util/ArrayIterator.cs",
    "chars": 1299,
    "preview": "using System;\nusing System.Collections;\nusing System.Collections.Generic;\n\nnamespace aima.core.util\n{\n    /**\n     * Ite"
  },
  {
    "path": "aima-csharp/util/CSharpRandomizer.cs",
    "chars": 564,
    "preview": "using System.Collections.Generic;\nusing System;\n\nnamespace aima.core.util\n{\n    /**\n     * Implementation of the Randomi"
  },
  {
    "path": "aima-csharp/util/DisjointSets.cs",
    "chars": 7065,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace aima.core.util\n{\n    /**\n     * A basic im"
  }
]

// ... and 21 more files (download for full content)

About this extraction

This page contains the full source code of the aimacode/aima-csharp GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 221 files (584.1 KB), approximately 157.6k tokens, and a symbol index with 1704 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!