SWI-Prolog-6.1.5.pdf - University of Amsterdam Kruislaan...

This preview shows page 1 out of 444 pages.

Unformatted text preview: University of Amsterdam Kruislaan 419, 1098 VA Amsterdam VU University Amsterdam De Boelelaan 1081a, 1081 HV Amsterdam The Netherlands SWI-Prolog 6.1 Reference Manual Updated for version 6.1.5, May 2012 Jan Wielemaker [email protected] SWI-Prolog is a Prolog implementation based on a subset of the WAM (Warren Abstract Machine). SWI-Prolog was developed as an open Prolog environment, providing a powerful and bi-directional interface to C in an era when this was unknown to other Prolog implementations. This environment is required to deal with XPCE, an object-oriented GUI system developed at SWI. XPCE is used at SWI for the development of knowledgeintensive graphical applications. As SWI-Prolog became more popular, a large user community provided requirements that guided its development. Compatibility, portability, scalability, stability and providing a powerful development environment have been the most important requirements. Edinburgh, Quintus, SICStus and the ISO-standard guide the development of the SWI-Prolog primitives. This document gives an overview of the features, system limits and built-in predicates. c 1990–2012, University of Amsterdam Copyright Contents 1 2 Introduction 1.1 SWI-Prolog . . . . . . . . . . . . 1.1.1 Books about Prolog . . . . 1.2 Status . . . . . . . . . . . . . . . 1.3 Compliance to the ISO standard . 1.4 Should you be using SWI-Prolog? 1.5 The XPCE GUI system for Prolog 1.6 Release Notes . . . . . . . . . . . 1.7 Donate to the SWI-Prolog project 1.8 Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 10 10 11 11 11 12 13 19 20 Overview 2.1 Getting started quickly . . . . . . . . . . . . 2.1.1 Starting SWI-Prolog . . . . . . . . . 2.1.2 Executing a query . . . . . . . . . . 2.2 The user’s initialisation file . . . . . . . . . . 2.3 Initialisation files and goals . . . . . . . . . . 2.4 Command-line options . . . . . . . . . . . . 2.4.1 Controlling the stack-sizes . . . . . . 2.4.2 Running goals from the commandline 2.4.3 Compiler options . . . . . . . . . . . 2.4.4 Maintenance options . . . . . . . . . 2.5 GNU Emacs Interface . . . . . . . . . . . . . 2.6 Online Help . . . . . . . . . . . . . . . . . . 2.7 Command-line history . . . . . . . . . . . . 2.8 Reuse of top-level bindings . . . . . . . . . . 2.9 Overview of the Debugger . . . . . . . . . . 2.10 Compilation . . . . . . . . . . . . . . . . . . 2.10.1 During program development . . . . 2.10.2 For running the result . . . . . . . . . 2.11 Environment Control (Prolog flags) . . . . . 2.12 An overview of hook predicates . . . . . . . 2.13 Automatic loading of libraries . . . . . . . . 2.14 Garbage Collection . . . . . . . . . . . . . . 2.15 Syntax Notes . . . . . . . . . . . . . . . . . 2.15.1 ISO Syntax Support . . . . . . . . . 2.16 Rational trees (cyclic terms) . . . . . . . . . 2.17 Just-in-time clause indexing . . . . . . . . . 2.17.1 Future directions . . . . . . . . . . . 2.17.2 Indexing and portability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 21 21 22 22 23 23 24 25 25 26 26 27 28 28 29 32 32 33 36 46 47 49 49 49 53 54 55 55 SWI-Prolog 6.1 Reference Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Contents 3 4 3 2.18 Wide character support . . . . . . . . . . . . . . 2.18.1 Wide character encodings on streams . . 2.19 System limits . . . . . . . . . . . . . . . . . . . 2.19.1 Limits on memory areas . . . . . . . . . 2.19.2 Other Limits . . . . . . . . . . . . . . . 2.19.3 Reserved Names . . . . . . . . . . . . . 2.20 SWI-Prolog and 64-bit machines . . . . . . . . . 2.20.1 Supported platforms . . . . . . . . . . . 2.20.2 Comparing 32- and 64-bits Prolog . . . . 2.20.3 Choosing between 32- and 64-bits Prolog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 56 57 57 59 59 60 60 60 60 Initialising and Managing a Prolog Project 3.1 The project source files . . . . . . . . . . . . 3.1.1 File Names and Locations . . . . . . 3.1.2 Project Special Files . . . . . . . . . 3.1.3 International source files . . . . . . . 3.2 Using modules . . . . . . . . . . . . . . . . 3.3 The test-edit-reload cycle . . . . . . . . . . . 3.3.1 Locating things to edit . . . . . . . . 3.3.2 Editing and incremental compilation . 3.4 Using the PceEmacs built-in editor . . . . . . 3.4.1 Activating PceEmacs . . . . . . . . . 3.4.2 Bluffing through PceEmacs . . . . . 3.4.3 Prolog Mode . . . . . . . . . . . . . 3.5 The Graphical Debugger . . . . . . . . . . . 3.5.1 Invoking the window-based debugger 3.6 The Prolog Navigator . . . . . . . . . . . . . 3.7 Cross-referencer . . . . . . . . . . . . . . . . 3.8 Accessing the IDE from your program . . . . 3.9 Summary of the IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 62 62 63 64 64 65 65 66 66 66 67 69 71 71 72 72 74 75 Built-in Predicates 4.1 Notation of Predicate Descriptions . . . . . . . . . . . . . . 4.2 Character representation . . . . . . . . . . . . . . . . . . . 4.3 Loading Prolog source files . . . . . . . . . . . . . . . . . . 4.3.1 Conditional compilation and program transformation 4.3.2 Loading files, active code and threads . . . . . . . . 4.3.3 Quick load files . . . . . . . . . . . . . . . . . . . . 4.4 Editor Interface . . . . . . . . . . . . . . . . . . . . . . . . 4.4.1 Customizing the editor interface . . . . . . . . . . . 4.5 List the program, predicates or clauses . . . . . . . . . . . . 4.6 Verify Type of a Term . . . . . . . . . . . . . . . . . . . . . 4.7 Comparison and Unification of Terms . . . . . . . . . . . . 4.7.1 Standard Order of Terms . . . . . . . . . . . . . . . 4.7.2 Special unification and comparison predicates . . . . 4.8 Control Predicates . . . . . . . . . . . . . . . . . . . . . . . 4.9 Meta-Call Predicates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 . 76 . 76 . 77 . 87 . 90 . 92 . 92 . 93 . 94 . 95 . 96 . 97 . 98 . 100 . 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SWI-Prolog 6.1 Reference Manual 4 4.10 ISO compliant Exception handling . . . . . . . . . . . . . . 4.10.1 Debugging and exceptions . . . . . . . . . . . . . . 4.10.2 The exception term . . . . . . . . . . . . . . . . . . 4.10.3 Printing messages . . . . . . . . . . . . . . . . . . 4.11 Handling signals . . . . . . . . . . . . . . . . . . . . . . . 4.11.1 Notes on signal handling . . . . . . . . . . . . . . . 4.12 DCG Grammar rules . . . . . . . . . . . . . . . . . . . . . 4.13 Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.13.1 Update view . . . . . . . . . . . . . . . . . . . . . 4.13.2 Indexing databases . . . . . . . . . . . . . . . . . . 4.14 Declaring predicate properties . . . . . . . . . . . . . . . . 4.15 Examining the program . . . . . . . . . . . . . . . . . . . . 4.16 Input and output . . . . . . . . . . . . . . . . . . . . . . . . 4.16.1 ISO Input and Output Streams . . . . . . . . . . . . 4.16.2 Edinburgh-style I/O . . . . . . . . . . . . . . . . . . 4.16.3 Switching between Edinburgh and ISO I/O . . . . . 4.16.4 Write onto atoms, code-lists, etc. . . . . . . . . . . . 4.17 Status of streams . . . . . . . . . . . . . . . . . . . . . . . 4.18 Primitive character I/O . . . . . . . . . . . . . . . . . . . . 4.19 Term reading and writing . . . . . . . . . . . . . . . . . . . 4.20 Analysing and Constructing Terms . . . . . . . . . . . . . . 4.20.1 Non-logical operations on terms . . . . . . . . . . . 4.21 Analysing and Constructing Atoms . . . . . . . . . . . . . . 4.22 Character properties . . . . . . . . . . . . . . . . . . . . . . 4.22.1 Case conversion . . . . . . . . . . . . . . . . . . . 4.22.2 White space normalization . . . . . . . . . . . . . . 4.22.3 Language-specific comparison . . . . . . . . . . . . 4.23 Representing text in strings . . . . . . . . . . . . . . . . . . 4.24 Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.25 Character Conversion . . . . . . . . . . . . . . . . . . . . . 4.26 Arithmetic . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.26.1 Special purpose integer arithmetic . . . . . . . . . . 4.26.2 General purpose arithmetic . . . . . . . . . . . . . . 4.27 Misc arithmetic support predicates . . . . . . . . . . . . . . 4.28 Built-in list operations . . . . . . . . . . . . . . . . . . . . 4.29 Finding all Solutions to a Goal . . . . . . . . . . . . . . . . 4.30 Forall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.31 Formatted Write . . . . . . . . . . . . . . . . . . . . . . . . 4.31.1 Writef . . . . . . . . . . . . . . . . . . . . . . . . . 4.31.2 Format . . . . . . . . . . . . . . . . . . . . . . . . 4.31.3 Programming Format . . . . . . . . . . . . . . . . . 4.32 Terminal Control . . . . . . . . . . . . . . . . . . . . . . . 4.33 Operating System Interaction . . . . . . . . . . . . . . . . . 4.33.1 Dealing with time and date . . . . . . . . . . . . . . 4.33.2 Controlling the swipl-win.exe console window 4.34 File System Interaction . . . . . . . . . . . . . . . . . . . . 4.35 User Top-level Manipulation . . . . . . . . . . . . . . . . . SWI-Prolog 6.1 Reference Manual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 105 106 106 109 110 111 112 115 115 116 117 122 122 129 131 131 132 133 136 142 144 145 148 150 150 151 151 152 153 154 154 155 163 163 165 166 167 167 168 171 171 172 175 180 181 185 Contents 5 4.36 4.37 4.38 4.39 Creating a Protocol of the User Interaction Debugging and Tracing Programs . . . . Obtaining Runtime Statistics . . . . . . . Execution profiling . . . . . . . . . . . . 4.39.1 Profiling predicates . . . . . . . . 4.39.2 Visualizing profiling data . . . . . 4.39.3 Information gathering . . . . . . 4.40 Memory Management . . . . . . . . . . . 4.41 Windows DDE interface . . . . . . . . . 4.41.1 DDE client interface . . . . . . . 4.41.2 DDE server mode . . . . . . . . . 4.42 Miscellaneous . . . . . . . . . . . . . . . 5 6 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 186 189 189 191 191 192 193 195 195 196 197 Modules 5.1 Why Use Modules? . . . . . . . . . . . . . . . . . . 5.2 Defining a Module . . . . . . . . . . . . . . . . . . 5.3 Importing Predicates into a Module . . . . . . . . . 5.4 Defining a meta-predicate . . . . . . . . . . . . . . . 5.5 Overruling Module Boundaries . . . . . . . . . . . . 5.5.1 Explicit manipulation of the calling context . 5.6 Interacting with modules from the toplevel . . . . . . 5.7 Composing modules from other modules . . . . . . . 5.8 Operators and modules . . . . . . . . . . . . . . . . 5.9 Dynamic importing using import modules . . . . . . 5.10 Reserved Modules and using the ‘user’ module . . . 5.11 An alternative import/export interface . . . . . . . . 5.12 Dynamic Modules . . . . . . . . . . . . . . . . . . . 5.13 Transparent predicates: definition and context module 5.14 Module properties . . . . . . . . . . . . . . . . . . . 5.15 Compatibility of the Module System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 199 199 200 202 204 204 205 205 206 206 207 207 208 208 210 211 Special Variables and Coroutining 6.1 Attributed variables . . . . . . . . . . . . . . . . . . . 6.1.1 Attribute manipulation predicates . . . . . . . 6.1.2 Attributed variable hooks . . . . . . . . . . . . 6.1.3 Operations on terms with attributed variables . 6.1.4 Special purpose predicates for attributes . . . . 6.2 Coroutining . . . . . . . . . . . . . . . . . . . . . . . 6.3 Global variables . . . . . . . . . . . . . . . . . . . . . 6.3.1 Compatibility of SWI-Prolog Global Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 212 214 214 215 215 216 217 218 CHR: Constraint Handling Rules 7.1 Introduction . . . . . . . . . . 7.2 Syntax and Semantics . . . . . 7.2.1 Syntax . . . . . . . . 7.2.2 Semantics . . . . . . . 7.3 CHR in SWI-Prolog Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 219 219 219 221 222 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SWI-Prolog 6.1 Reference Manual 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222 223 226 226 226 227 228 229 230 230 231 231 232 232 Multi-threaded applications 8.1 Creating and destroying Prolog threads . . . . . . . . . . . 8.2 Monitoring threads . . . . . . . . . . . . . . . . . . . . . 8.3 Thread communication . . . . . . . . . . . . . . . . . . . 8.3.1 Message queues . . . . . . . . . . . . . . . . . . 8.3.2 Signalling threads . . . . . . . . . . . . . . . . . 8.3.3 Threads and dynamic predicates . . . . . . . . . . 8.4 Thread synchronisation . . . . . . . . . . . . . . . . . . . 8.5 Thread support library(threadutil) . . . . . . . . . . . . . 8.5.1 Debugging threads . . . . . . . . . . . . . . . . . 8.5.2 Profiling threads . . . . . . . . . . . . . . . . . . 8.6 Unbounded thread creation . . . . . . . . . . . . . . . . . 8.7 Multi-threaded mixed C and Prolog applications . . . . . . 8.7.1 A Prolog thread for each native thread (one-to-one) 8.7.2 Pooling Prolog engines (many-to-many) . . . . . . 8.8 Multithreading and the XPCE graphics system . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 234 237 238 238 241 242 242 244 244 245 246 246 246 247 248 7.4 7.5 7.6 7.7 7.8 8 9 7.3.1 Embedding in Prolog Programs . . . . 7.3.2 Constraint declaration . . . . . . . . . 7.3.3 Compilation . . . . . . . . . . . . . . Debugging . . . . . . . . . . . . . . . . . . . . 7.4.1 Ports . . . . . . . . . . . . . . . . . . 7.4.2 Tracing . . . . . . . . . . . . . . . . . 7.4.3 CHR Debugging Predicates . . . . . . Examples . . . . . . . . . . . . . . . . . . . . Backwards Compatibility . . . . . . . . . . . . 7.6.1 The Old SICStus CHR implemenation . 7.6.2 The Old ECLiPSe CHR implemenation Programming Tips and Tricks . . . . . . . . . Compiler Errors and Warnings . . . . . . . . . 7.8.1 CHR Compiler Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
View Full Document

  • Spring '17
  • Shen Zhiqi
  • XPCE

{[ snackBarMessage ]}

Get FREE access by uploading your study materials

Upload your study materials now and get free access to over 25 million documents.

Upload now for FREE access Or pay now for instant access
Christopher Reinemann
"Before using Course Hero my grade was at 78%. By the end of the semester my grade was at 90%. I could not have done it without all the class material I found."
— Christopher R., University of Rhode Island '15, Course Hero Intern

Ask a question for free

What students are saying

  • Left Quote Icon

    As a current student on this bumpy collegiate pathway, I stumbled upon Course Hero, where I can find study resources for nearly all my courses, get online help from tutors 24/7, and even share my old projects, papers, and lecture notes with other students.

    Student Picture

    Kiran Temple University Fox School of Business ‘17, Course Hero Intern

  • Left Quote Icon

    I cannot even describe how much Course Hero helped me this summer. It’s truly become something I can always rely on and help me. In the end, I was not only able to survive summer classes, but I was able to thrive thanks to Course Hero.

    Student Picture

    Dana University of Pennsylvania ‘17, Course Hero Intern

  • Left Quote Icon

    The ability to access any university’s resources through Course Hero proved invaluable in my case. I was behind on Tulane coursework and actually used UCLA’s materials to help me move forward and get everything together on time.

    Student Picture

    Jill Tulane University ‘16, Course Hero Intern