Meta Programming (8A) Young W. Lim 3/10/14

Similar documents
ProbLog Technology for Inference in a Probabilistic First Order Logic

Programming in Logic: Prolog

Comparison Sorts. EECS 2011 Prof. J. Elder - 1 -

Priority Queues & Heaps

Chapter 8: Recursion

Clause Logic Service User Interface User Manual

Priority Queues & Heaps

Hoboken Public Schools. College Algebra Curriculum

I. EXECUTIVE BRIEF. Agenda Item#: //'/5A./li. PALM BEACH COUNTY BOARD OF COUNTY COMMISSIONERS AGENDA ITEM SUMMARY

Configuring MST (802.1s)/RSTP (802.1w) on Catalyst Series Switches Running CatOS

Optimization Strategies

US Code (Unofficial compilation from the Legal Information Institute)

We should share our secrets

30 Transformational Design with Essential Aspect Decomposition: Model-Driven Architecture (MDA)

Aspect Decomposition: Model-Driven Architecture (MDA) 30 Transformational Design with Essential. References. Ø Optional: Ø Obligatory:

Mixed-Strategies for Linear Tabling in Prolog

Priority Queues & Heaps

30 Transformational Design with Essential Aspect Decomposition: Model-Driven Architecture (MDA)

ETSI TS V1.4.1 ( )

ETSI TS V2.2.1 ( )

Creating and Managing Clauses. Selectica, Inc. Selectica Contract Performance Management System

My Health Online 2017 Website Update Online Appointments User Guide

Maps, Hash Tables and Dictionaries

Constraint satisfaction problems. Lirong Xia

Search Trees. Chapter 10. CSE 2011 Prof. J. Elder Last Updated: :51 PM

IBM Cognos Open Mic Cognos Analytics 11 Part nd June, IBM Corporation

Design and Analysis of College s CPC-Building. System Based on.net Platform

Event Based Sequential Program Development: Application to Constructing a Pointer Program

Voting. Suppose that the outcome is determined by the mean of all voter s positions.

Fall 2016 COP 3223H Program #5: Election Season Nears an End Due date: Please consult WebCourses for your section

ETSI TR V1.5.1 ( ) Technical Report

Purpose and Overview of GC Working Policy. Myron Iseminger, Undersecretary 2017 Annual Council

JD Edwards EnterpriseOne Applications

WEEK 3 (SEPTEMBER 19 SEPTEMBER 25, 2014)

ECE250: Algorithms and Data Structures Trees

Website Disclaimer. by SEQ Legal

Midterm Review. EECS 2011 Prof. J. Elder - 1 -

Subpart A General Provisions

ForeScout Extended Module for McAfee epolicy Orchestrator

IEEE PES Substations Committee

Maps and Hash Tables. EECS 2011 Prof. J. Elder - 1 -

General Terms and Conditions BB Remessa

Dictatorships Are Not the Only Option: An Exploration of Voting Theory

VALUING CASES FOR SETTLEMENT: SEEING THE FOREST THROUGH THE (DECISION) TREES

IDENTIFYING FAULT-PRONE MODULES IN SOFTWARE FOR DIAGNOSIS AND TREATMENT USING EEPORTERS CLASSIFICATION TREE

Questions and Answers for POS Facilitated Enrollment Administered by WellPoint, Inc. Submission Guidelines. Frequently Asked Questions

Development of a Background Knowledge-Base about Transportation and Smuggling

Zaatari refugee camp. Account not required. Build skills in these areas: What you need:

TECHNICAL REPORT Lawful Interception (LI); ASN.1 Object Identifiers in Lawful Interception and Retained data handling Specifications

Legislative Leader. Commander in Chief. Powers and Roles of the President

Linear Tabling Strategies and Optimization Techniques

Midterm Review. EECS 2011 Prof. J. Elder - 1 -

SPARC Version New Features

Zaatari refugee camp. Account not required. Build skills in these areas: What you need:

Biometric data in large IT borders, immigration and asylum databases - fundamental rights concerns

Licence Site Plan Amendments: By Licensee. Lands & Waters Aggregate & Petroleum Resources March 15, 2006

The following list of assignments will be completed in your HISTORY NOTEBOOK. Consider them a handbook for understanding the U.S. Constitution!!!

IEC : 3 rd Edition with Amendment 1 (2012) Michael Howell, P.E., UL LLC

Hoboken Public Schools. Algebra II Honors Curriculum

REPORT FROM THE COMMISSION TO THE EUROPEAN PARLIAMENT AND THE COUNCIL

X12C Subcommittee Minutes ASC X12 Committee Meeting February 4-9, 2001 Seattle, WA. Tuesday 6 Feb 2001

Sport 4 Good Governance: Scuola dello Sport s experience Nicosia, september 2012


Data Distribution Agreement of BME Market Data

Plan For the Week. Solve problems by programming in Python. Compsci 101 Way-of-life. Vocabulary and Concepts

Lecture 6 Cryptographic Hash Functions

PCGENESIS PAYROLL SYSTEM OPERATIONS GUIDE

SUMMARY OF CHANGES IN ISO 9001:2008 (DRAFT INTERNATIONAL STANDARD)

Yours truly, Mark Seibert, Manager, NYISO Member Relations 10 Krey Blvd Rensselaer, New York 12144

2 to 5 Serial Cell Li-Ion / Li-Polymer Battery Protection IC for Secondary Protection

DIMENSIONS...R20 Series MOUNTING AND SHAFT OPTIONS CONNECTORS SIDE VIEW ENGLISH (INCHES) METRIC (MILLIMETERS) REAR MOUNTED MS CONNECTOR OPTION

2143 Vote Count. Input

Compliance & Enforcement Manual

AMENDMENT NUMBER 3 TO MASTER SERVICES AGREEMENT

One View Watchlists Implementation Guide Release 9.2

DevOps Course Content

From Argument Games to Persuasion Dialogues

Die Messung von Bildung bei Migrantinnen und Migranten der ersten Generation: Ein neues adaptives Instrument für Umfragen

Curriculum. Introduction into elections for students aged 12 to 16 years

Standardized Data Specifications. XML Version (Version 2.2) National Center for Industrial Property Information and Training

Transition document Transition document, Version: 4.1, October 2017

Strategy and Effectiveness: An Analysis of Preferential Ballot Voting Methods

State Environmental Planning Policy No 55 Remediation of Land

Privacy and Access in British Columbia

Content License Agreement

The documents listed below were utilized in the development of this Test Report:

University of Utah Western Political Science Association

The Effectiveness of Receipt-Based Attacks on ThreeBallot

GST 104: Cartographic Design Lab 6: Countries with Refugees and Internally Displaced Persons Over 1 Million Map Design

Approaching a Formal Definition of Fairness in Electronic Commerce. Felix Gärtner Henning Pagnia Holger Vogt

Composition and Division. Philosophy and Logic Unit 3, Section 3.3

31) Feature Models and MDA for Product Lines

Title: The Role and Impact of Private Security Companies in the Caribbean

NON-DOMESTIC RATING (NURSERY GROUNDS) BILL EXPLANATORY NOTES

Uninformed search. Lirong Xia

How is the Constitution structured?

Access Web CRD at or via FINRA Firm Gateway at

The British Prime Minister

Downloaded from: justpaste.it/vlxf

THE GREAT MIGRATION AND SOCIAL INEQUALITY: A MONTE CARLO MARKOV CHAIN MODEL OF THE EFFECTS OF THE WAGE GAP IN NEW YORK CITY, CHICAGO, PHILADELPHIA

Transcription:

Copyright (c) 2013. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Please send corrections (or suggestions) to youngwlim@hotmail.com. This document was produced by using LibreOffice/OpenOffice.

Clause in Prolog A clause in Prolog is a unit of information in a Prolog program ending with a full stop ("."). a fact likes(aa, bb). food(cc). a rule eats(x, Y) :- likes(x, Y), food(y). a query?- eats(ee, ff). a procedure. a group of clauses about the same relation 3

Clause/2 Predicate clause(:head,?body) true if Head can be unified with a clause head and Body with the corresponding clause body. Gives alternative clauses on backtracking. for facts, Body is unified with the atom true. Normally clause/2 is used to find clause definitions for a predicate, but it can also be used to find clause heads for some body template. 4

Meta-interpreter /* true leaf */ clause_tree(true) :-!. /* search each branch */ clause_tree((g, R)) :- clause_tree(g), clause_tree(r). /* grow branches */ clause_tree(g) :- clause(g, Body), clause_tree(body). clause(g, Body), member(x, [X _]) true member(x, [X _]). member(x, [_ R]) :- member(x,r). 2 clauses : a procedure consider this program as input data for other programs.?- clause_tree(member(x, [a,b,c])). X = a ; X = b ; X = c ; no member(x, [_ R]) member(x,r) 5

Meta-interpreter clause_tree(true) :-!. clause_tree((g, R)) :- clause_tree(g), clause_tree(r). clause_tree(g) :- clause(g, Body), clause_tree(body). member(x,[x _]). member(x,[_ R]) :- member(x,r). G=member(b, [a,b,c]) Body=member(b, [b,c]) clause(member(b,[a,b,c]), member(b,[b,c])) X=b, _=a R=[b,c] true member(x,[_ R]) :- member(x,r). clause_tree(member(b,[a,b,c])). and clause_tree(member(b,[b,c])) G=member(b, [b,c]) Body=true (a fact) clause(member(b,[b,c]), true) X=b _=c and clause_tree(true) true member(x,[x _]). true 6

Evaluation clause_tree(true) :-!. clause_tree((g,r)) :- clause_tree(g), clause_tree(r). clause_tree(g) :- ( predicate_property(g,built_in) ; predicate_property(g,compiled) ), call(g). %% let Prolog do it clause_tree(g) :- clause(g,body), clause_tree(body). or predicate_property(g,built_in) if the goal G is built_in (e.g., arithmetic) ; or predicate_property(g,compiled) if the goal G is compiled into memory call(g) then let Prolog evaluate the goal G 7

Evaluation clause_tree(true) :-!. clause_tree((g,r)) :- clause_tree(g), clause_tree(r). clause_tree(g) :- ( predicate_property(g,built_in) ; predicate_property(g,compiled) ), call(g). %% let Prolog do it clause_tree(g) :- clause(g,body), clause_tree(body). predicate_property(x is 3, built_in) predicate_property(x < 5, built_in) or?- clause_tree((x is 3, X < 5)). X = 3 clause_tree((x is 3, X < 5)). and clause_tree(x is 3) predicate_property (X is 3, built_in), G=X is 3 R=X < 5 clause_tree(x < 5) predicate_property (X < 5, built_in), call(x is 3) call(x < 5) X=3 true 8

Evaluation clause_tree(true) :-!. clause_tree((g,r)) :- clause_tree(g), clause_tree(r). clause_tree(g) :- ( predicate_property(g,built_in) ; predicate_property(g,compiled) ), call(g). %% let Prolog do it clause_tree(g) :- clause(g,body), clause_tree(body). [trace]?- clause_tree((x is 3, X < 5)). Call: (6) clause_tree((_g336 is 3, _G336<5))? creep Call: (7) clause_tree(_g336 is 3)? creep ^ Call: (8) predicate_property(_g336 is 3, built_in)? creep ^ Exit: (8) predicate_property(user: (_G336 is 3), built_in)? creep Call: (8) _G336 is 3? creep Exit: (8) 3 is 3? creep Exit: (7) clause_tree(3 is 3)? creep Call: (7) clause_tree(3<5)? creep ^ Call: (8) predicate_property(3<5, built_in)? creep ^ Exit: (8) predicate_property(user: (3<5), built_in)? creep Call: (8) 3<5? creep Exit: (8) 3<5? creep Exit: (7) clause_tree(3<5)? creep Exit: (6) clause_tree((3 is 3, 3<5))? creep X = 3. clause_tree((x is 3, X < 5)). clause_tree(x is 3) and predicate_property (X is 3, built_in), and G=X is 3 R=X < 5 clause_tree(3 < 5) call(x is 3) call(3 < 5) X=3 and predicate_property (3 < 5, built_in), true 9

Detecting Loops p :- q. q :- p. p :- r. r.?- p. q p an example of the incompleteness of Prolog For the efficiency, Prolog does not detect any loops clause_tree(true, _) :-!. clause_tree((g,r), Trail) :- clause_tree(g, Trail), clause_tree(r, Trail). clause_tree(g, Trail) :- loop_detect(g,trail), fail. clause_tree(g, Trail) :- clause(g,body), clause_tree(body, [G Trail] ). loop_detect(g, [G1 _]) :- G == G1. loop_detect(g, [_ R]) :- loop_detect(g,r). 10

loop_detect loop_detect(g, [G1 _]) :- G == G1. loop_detect(g, [_ R]) :- loop_detect(g,r). G G1 G == G1 clause_tree(true, _) :-!. clause_tree((g,r), Trail) :- clause_tree(g, Trail), clause_tree(r, Trail). clause_tree(g, Trail) :- loop_detect(g,trail), fail. G R clause_tree(g, Trail) :- clause(g,body), clause_tree(body, [G Trail] ). G R loop_detect(g, [G1 _]) :- G == G1. loop_detect(g, [_ R]) :- loop_detect(g,r). 11

Detecting Loops [trace]?- clause_tree(p, []). Call: (6) clause_tree(p, [])? creep Call: (7) loop_detect(p, [])? creep G1=[] Fail: (7) loop_detect(p, [])? creep Redo: (6) clause_tree(p, [])? creep ^ Call: (7) clause(p, _G418)? creep ^ Exit: (7) clause(p, q)? creep Call: (7) clause_tree(q, [p])? creep Call: (8) loop_detect(q, [p])? creep Call: (9) q==p? creep G1=p Fail: (9) q==p? creep Redo: (8) loop_detect(q, [p])? creep R=[] Call: (9) loop_detect(q, [])? creep G1=[] Fail: (9) loop_detect(q, [])? creep Fail: (8) loop_detect(q, [p])? creep Redo: (7) clause_tree(q, [p])? creep ^ Call: (8) clause(q, _G424)? creep ^ Exit: (8) clause(q, p)? creep Call: (8) clause_tree(p, [q, p])? creep Call: (9) loop_detect(p, [q, p])? creep Call: (10) p==q? creep G1=q Fail: (10) p==q? creep R=[p] Redo: (9) loop_detect(p, [q, p])? creep Call: (10) loop_detect(p, [p])? creep G1=p Call: (11) p==p? creep Exit: (11) p==p? creep Exit: (10) loop_detect(p, [p])? creep Exit: (9) loop_detect(p, [q, p])? creep Call: (9) fail? creep Fail: (9) fail? creep (G, [G1 _]) (G, [G1 _]) (G, [_ R]) (G, [G1 _]) (G, [G1 _]) (G, [_ R]) (G, [G1 _]) Fail: (8) clause_tree(p, [q, p])? creep Fail: (7) clause_tree(q, [p])? creep ^ Exit: (7) clause(p, r)? creep Call: (7) clause_tree(r, [p])? creep Call: (8) loop_detect(r, [p])? creep G1=p Call: (9) r==p? creep Fail: (9) r==p? creep Redo: (8) loop_detect(r, [p])? creep R=[] Call: (9) loop_detect(r, [])? creep G1=[] Fail: (9) loop_detect(r, [])? creep Fail: (8) loop_detect(r, [p])? creep Redo: (7) clause_tree(r, [p])? creep ^ Call: (8) clause(r, _G424)? creep ^ Exit: (8) clause(r, true)? creep Call: (8) clause_tree(true, [r, p])? creep Exit: (8) clause_tree(true, [r, p])? creep Exit: (7) clause_tree(r, [p])? creep Exit: (6) clause_tree(p, [])? creep true. loop_detect(g, [G1 _]) :- G == G1. loop_detect(g, [_ R]) :- loop_detect(g,r). (G, [G1 _]) (G, [_ R]) (G, [G1 _]) 12

Detecting Loops [trace]?- clause_tree(p, []). Call: (6) clause_tree(p, [])? creep Call: (7) loop_detect(p, [])? creep Fail: (7) loop_detect(p, [])? creep Redo: (6) clause_tree(p, [])? creep ^ Call: (7) clause(p, _G418)? creep ^ Exit: (7) clause(p, q)? creep Call: (7) clause_tree(q, [p])? creep Call: (8) loop_detect(q, [p])? creep... Fail: (8) loop_detect(q, [p])? creep Redo: (7) clause_tree(q, [p])? creep ^ Call: (8) clause(q, _G424)? creep ^ Exit: (8) clause(q, p)? creep Call: (8) clause_tree(p, [q, p])? creep Call: (9) loop_detect(p, [q, p])? creep... Exit: (9) loop_detect(p, [q, p])? creep Call: (9) fail? creep Fail: (9) fail? creep Fail: (8) clause_tree(p, [q, p])? creep Fail: (7) clause_tree(q, [p])? creep ^ Exit: (7) clause(p, r)? creep Call: (7) clause_tree(r, [p])? creep Call: (8) loop_detect(r, [p])? creep... Fail: (8) loop_detect(r, [p])? creep Redo: (7) clause_tree(r, [p])? creep ^ Call: (8) clause(r, _G424)? creep ^ Exit: (8) clause(r, true)? creep Call: (8) clause_tree(true, [r, p])? creep Exit: (8) clause_tree(true, [r, p])? creep Exit: (7) clause_tree(r, [p])? creep Exit: (6) clause_tree(p, [])? creep true. clause_tree(g, Trail) :- loop_detect(g,trail), fail. G=p, Trail=[] clause_tree(g, Trail) :- clause(g,body), clause_tree(body, [G Trail] ). G=p, Trail=[] Body=q clause_tree(g, Trail) :- loop_detect(g,trail), fail. G=q, Trail=[p] clause_tree(g, Trail) :- clause(g,body), clause_tree(body, [G Trail] ). G=q, Trail=[p] Body=p (p, [q, p]) clause_tree(g, Trail) :- loop_detect(g,trail), fail. G=q, Trail=[q, p] loop_detect succeed and no alternative should be sought, and the final result fail is returned G=p, Trail=[] Body=r clause_tree(g, Trail) :- loop_detect(g,trail), fail. G=r, Trail=[p] (q, [p]) (r, [p]) clause_tree(g, Trail) :- clause(g,body), clause_tree(body, [G Trail] ). G=r, Trail=[p] Body=true (true, [r, p]) clause_tree(true, _) :-!. p :- q. no loop, therefore the next rule is tried p :- r. no loop, therefore the next rule is tried 13

Making a clause tree list clause_tree(true, _, true) :-!. clause_tree((g,r), Trail, (TG,TR)) :- clause_tree(g, Trail, TG), clause_tree(r, Trail, TR). clause_tree(g, _, prolog(g)) :- ( predicate_property(g, built_in) ; predicate_property(g, compiled) ), call(g). %% let Prolog do it clause_tree(g, Trail, _) :- loop_detect(g, Trail), fail. clause_tree(g, Trail, tree(g,t)) :- clause(g, Body), clause_tree(body, [G Trail], T). G R TG TR G R G TG TR prolog(g) G G T tree(g, T) Body G TG: tree list representation of G TR: tree list representation of R T G is a prolog expression expand G in the tree list representation with the body of a matching clause T 14

Examples of making a clause tree list clause_tree(true, _, true) :-!. clause_tree((g,r), Trail, (TG,TR)) :- clause_tree(g, Trail, TG), clause_tree(r, Trail, TR). clause_tree(g, _, prolog(g)) :- ( predicate_property(g, built_in) ; predicate_property(g, compiled) ), call(g). clause_tree(g, Trail, _) :- loop_detect(g, Trail), fail. clause_tree(g, Trail, tree(g,t)) :- clause(g, Body), clause_tree(body, [G Trail], T).?- clause_tree(p(x),[],tree) Tree = tree( p(3), (tree(q(3),true), tree(r(5),true), prolog(3 < 5)) ) X = 3 ; Tree = tree( p(3), (tree(q(3),true), tree(r(10),true), prolog(3 < 10)) ) X = 3 ; clauses p(x) :- q(x), r(y), X < Y. q(3). r(2). r(5). r(10). No 15

Lists and corresponding trees p(3) tree tree p(3) tree tree tree tree tree tree q(3) r(5) 3 < 5 q(3) r(10) 3 < 10 true true true true true true?- clause_tree(p(x), [], Tree) Tree = tree( p(3), (tree(q(3),true), tree(r(5),true), prolog(3 < 5)) ) X = 3 ; Tree = tree( p(3), (tree(q(3),true), tree(r(10),true), prolog(3 < 10)) ) X = 3 ; p(x) :- q(x), r(y), X < Y. q(3). r(2). r(5). r(10). No 16

The trace result overview (1) #3 #4 #5 #2 #3 #4 #5 #1 #2 #3 #4 #5 [trace]?- clause_tree(p(x),[],tree). Call: (6) clause_tree(p(_g356), [], _G360)? creep ^ Call: (7) predicate_property(p(_g356), built_in)? creep +++ ^ Fail: (7) predicate_property(user:p(_g356), compiled)? creep Redo: (6) clause_tree(p(_g356), [], _G360)? creep Call: (7) loop_detect(p(_g356), [])? creep +++ Fail: (7) loop_detect(p(_g356), [])? creep Redo: (6) clause_tree(p(_g356), [], _G360)? creep ^ Call: (7) clause(p(_g356), _G451)? creep +++ ^ Exit: (7) clause(p(_g356), (q(_g356), r(_g450), _G356<_G450))? creep Call: (7) clause_tree((q(_g356), r(_g450), _G356<_G450), [p(_g356)], _G441)? creep Call: (8) clause_tree(q(_g356), [p(_g356)], _G464)? creep ^ Call: (9) predicate_property(q(_g356), built_in)? creep +++ ^ Fail: (9) predicate_property(user:q(_g356), compiled)? creep Redo: (8) clause_tree(q(_g356), [p(_g356)], _G464)? creep Call: (9) loop_detect(q(_g356), [p(_g356)])? creep +++ Fail: (9) loop_detect(q(_g356), [p(_g356)])? creep Redo: (8) clause_tree(q(_g356), [p(_g356)], _G464)? creep ^ Call: (9) clause(q(_g356), _G478)? creep ^ Exit: (9) clause(q(3), true)? creep Call: (9) clause_tree(true, [q(3), p(3)], _G468)? creep Exit: (9) clause_tree(true, [q(3), p(3)], true)? creep Exit: (8) clause_tree(q(3), [p(3)], tree(q(3), true))? creep Call: (8) clause_tree((r(_g450), 3<_G450), [p(3)], _G465)? creep Call: (9) clause_tree(r(_g450), [p(3)], _G475)? creep ^ Call: (10) predicate_property(r(_g450), built_in)? creep +++ ^ Fail: (10) predicate_property(user:r(_g450), compiled)? creep Redo: (9) clause_tree(r(_g450), [p(3)], _G475)? creep Call: (10) loop_detect(r(_g450), [p(3)])? creep +++ Fail: (10) loop_detect(r(_g450), [p(3)])? creep Redo: (9) clause_tree(r(_g450), [p(3)], _G475)? creep #1 clause_tree(true, _, true) :-!. #2 clause_tree((g,r), Trail, (TG,TR)) :- clause_tree(g, Trail, TG), clause_tree(r, Trail, TR). #3 clause_tree(g, _, prolog(g)) :- ( predicate_property(g, built_in) ; predicate_property(g, compiled) ), call(g). %% let Prolog do it #4 clause_tree(g, Trail, _) :- loop_detect(g, Trail), fail. #5 clause_tree(g, Trail, tree(g,t)) :- clause(g, Body), clause_tree(body, [G Trail], T). p(x) :- q(x), r(y), X < Y. q(3). r(2). r(5). r(10). 17

The trace result overview (2) #5 #1 #3 #1 #3 Redo: (9) clause_tree(r(_g450), [p(3)], _G475)? creep ^ Call: (10) clause(r(_g450), _G489)? creep ^ Exit: (10) clause(r(2), true)? creep r(2) Call: (10) clause_tree(true, [r(2), p(3)], _G479)? creep Exit: (10) clause_tree(true, [r(2), p(3)], true)? creep Exit: (9) clause_tree(r(2), [p(3)], tree(r(2), true))? creep Call: (9) clause_tree(3<2, [p(3)], _G476)? creep ^ Call: (10) predicate_property(3<2, built_in)? creep +++ Fail: (9) clause_tree(3<2, [p(3)], _G476)? creep ^ Exit: (10) clause(r(5), true)? creep r(5) Call: (10) clause_tree(true, [r(5), p(3)], _G479)? creep Exit: (10) clause_tree(true, [r(5), p(3)], true)? creep Exit: (9) clause_tree(r(5), [p(3)], tree(r(5), true))? creep Call: (9) clause_tree(3<5, [p(3)], _G476)? creep ^ Call: (10) predicate_property(3<5, built_in)? creep ^ Exit: (10) predicate_property(user: (3<5), built_in)? creep Call: (10) 3<5? creep Exit: (10) 3<5? creep Exit: (9) clause_tree(3<5, [p(3)], prolog(3<5))? creep Exit: (8) clause_tree((r(5), 3<5), [p(3)], (tree(r(5), true), prolog(3<5)))? creep Exit: (7) clause_tree((q(3), r(5), 3<5), [p(3)], (tree(q(3), true), tree(r(5), true), prolog(3<5)))? creep Exit: (6) clause_tree(p(3), [], tree(p(3), (tree(q(3), true), tree(r(5), true), prolog(3<5))))? creep X = 3, Tree = tree(p(3), (tree(q(3), true), tree(r(5), true), prolog(3<5))). #1 clause_tree(true, _, true) :-!. #2 clause_tree((g,r), Trail, (TG,TR)) :- clause_tree(g, Trail, TG), clause_tree(r, Trail, TR). #3 clause_tree(g, _, prolog(g)) :- ( predicate_property(g, built_in) ; predicate_property(g, compiled) ), call(g). %% let Prolog do it #4 clause_tree(g, Trail, _) :- loop_detect(g, Trail), fail. #5 clause_tree(g, Trail, tree(g,t)) :- clause(g, Body), clause_tree(body, [G Trail], T). p(x) :- q(x), r(y), X < Y. q(3). r(2). r(5). r(10). 18

The trace result of making a tree list (1) #3 #4 #5 #2 #3 #4 #5 [trace]?- clause_tree(p(x),[],tree). Call: (6) clause_tree(p(_g356), [], _G360)? creep ^ Call: (7) predicate_property(p(_g356), built_in)? creep ^ Fail: (7) predicate_property(user:p(_g356), built_in)? creep Redo: (6) clause_tree(p(_g356), [], prolog(p(_g356)))? creep ^ Call: (7) predicate_property(p(_g356), compiled)? creep ^ Fail: (7) predicate_property(user:p(_g356), compiled)? creep Redo: (6) clause_tree(p(_g356), [], _G360)? creep Call: (7) loop_detect(p(_g356), [])? creep Fail: (7) loop_detect(p(_g356), [])? creep Redo: (6) clause_tree(p(_g356), [], _G360)? creep ^ Call: (7) clause(p(_g356), _G451)? creep ^ Exit: (7) clause(p(_g356), (q(_g356), r(_g450), _G356<_G450))? creep Call: (7) clause_tree((q(_g356), r(_g450), _G356<_G450), [p(_g356)], _G441)? creep Call: (8) clause_tree(q(_g356), [p(_g356)], _G464)? creep ^ Call: (9) predicate_property(q(_g356), built_in)? creep ^ Fail: (9) predicate_property(user:q(_g356), built_in)? creep Redo: (8) clause_tree(q(_g356), [p(_g356)], prolog(q(_g356)))? creep ^ Call: (9) predicate_property(q(_g356), compiled)? creep ^ Fail: (9) predicate_property(user:q(_g356), compiled)? creep Redo: (8) clause_tree(q(_g356), [p(_g356)], _G464)? creep Call: (9) loop_detect(q(_g356), [p(_g356)])? creep Call: (10) q(_g356)==p(_g356)? creep Fail: (10) q(_g356)==p(_g356)? creep Redo: (9) loop_detect(q(_g356), [p(_g356)])? creep Call: (10) loop_detect(q(_g356), [])? creep Fail: (10) loop_detect(q(_g356), [])? creep Fail: (9) loop_detect(q(_g356), [p(_g356)])? creep Redo: (8) clause_tree(q(_g356), [p(_g356)], _G464)? creep #1 clause_tree(true, _, true) :-!. #2 clause_tree((g,r), Trail, (TG,TR)) :- clause_tree(g, Trail, TG), clause_tree(r, Trail, TR). #3 clause_tree(g, _, prolog(g)) :- ( predicate_property(g, built_in) ; predicate_property(g, compiled) ), call(g). %% let Prolog do it #4 clause_tree(g, Trail, _) :- loop_detect(g, Trail), fail. #5 clause_tree(g, Trail, tree(g,t)) :- clause(g, Body), clause_tree(body, [G Trail], T). p(x) :- q(x), r(y), X < Y. q(3). r(2). r(5). r(10). 19

The trace result of making a tree list (2) #5 #1 #2 #3 #4 #5 #1 Redo: (8) clause_tree(q(_g356), [p(_g356)], _G464)? creep ^ Call: (9) clause(q(_g356), _G478)? creep ^ Exit: (9) clause(q(3), true)? creep Call: (9) clause_tree(true, [q(3), p(3)], _G468)? creep Exit: (9) clause_tree(true, [q(3), p(3)], true)? creep Exit: (8) clause_tree(q(3), [p(3)], tree(q(3), true))? creep Call: (8) clause_tree((r(_g450), 3<_G450), [p(3)], _G465)? creep Call: (9) clause_tree(r(_g450), [p(3)], _G475)? creep ^ Call: (10) predicate_property(r(_g450), built_in)? creep ^ Fail: (10) predicate_property(user:r(_g450), built_in)? creep Redo: (9) clause_tree(r(_g450), [p(3)], prolog(r(_g450)))? creep ^ Call: (10) predicate_property(r(_g450), compiled)? creep ^ Fail: (10) predicate_property(user:r(_g450), compiled)? creep Redo: (9) clause_tree(r(_g450), [p(3)], _G475)? creep Call: (10) loop_detect(r(_g450), [p(3)])? creep Call: (11) r(_g450)==p(3)? creep Fail: (11) r(_g450)==p(3)? creep Redo: (10) loop_detect(r(_g450), [p(3)])? creep Call: (11) loop_detect(r(_g450), [])? creep Fail: (11) loop_detect(r(_g450), [])? creep Fail: (10) loop_detect(r(_g450), [p(3)])? creep Redo: (9) clause_tree(r(_g450), [p(3)], _G475)? creep ^ Call: (10) clause(r(_g450), _G489)? creep ^ Exit: (10) clause(r(2), true)? creep Call: (10) clause_tree(true, [r(2), p(3)], _G479)? creep Exit: (10) clause_tree(true, [r(2), p(3)], true)? creep Exit: (9) clause_tree(r(2), [p(3)], tree(r(2), true))? creep #1 clause_tree(true, _, true) :-!. #2 clause_tree((g,r), Trail, (TG,TR)) :- clause_tree(g, Trail, TG), clause_tree(r, Trail, TR). #3 clause_tree(g, _, prolog(g)) :- ( predicate_property(g, built_in) ; predicate_property(g, compiled) ), call(g). %% let Prolog do it #4 clause_tree(g, Trail, _) :- loop_detect(g, Trail), fail. #5 clause_tree(g, Trail, tree(g,t)) :- clause(g, Body), clause_tree(body, [G Trail], T). p(x) :- q(x), r(y), X < Y. q(3). r(2). r(5). r(10). 20

The trace result of making a tree list (3) #3 #1 #3 Call: (9) clause_tree(3<2, [p(3)], _G476)? creep ^ Call: (10) predicate_property(3<2, built_in)? creep ^ Exit: (10) predicate_property(user: (3<2), built_in)? creep Call: (10) 3<2? creep Fail: (10) 3<2? creep Fail: (9) clause_tree(3<2, [p(3)], _G476)? creep ^ Exit: (10) clause(r(5), true)? creep Call: (10) clause_tree(true, [r(5), p(3)], _G479)? creep Exit: (10) clause_tree(true, [r(5), p(3)], true)? creep Exit: (9) clause_tree(r(5), [p(3)], tree(r(5), true))? creep Call: (9) clause_tree(3<5, [p(3)], _G476)? creep ^ Call: (10) predicate_property(3<5, built_in)? creep ^ Exit: (10) predicate_property(user: (3<5), built_in)? creep Call: (10) 3<5? creep Exit: (10) 3<5? creep Exit: (9) clause_tree(3<5, [p(3)], prolog(3<5))? creep Exit: (8) clause_tree((r(5), 3<5), [p(3)], (tree(r(5), true), prolog(3<5)))? creep Exit: (7) clause_tree((q(3), r(5), 3<5), [p(3)], (tree(q(3), true), tree(r(5), true), prolog(3<5)))? creep #1 clause_tree(true, _, true) :-!. #2 clause_tree((g,r), Trail, (TG,TR)) :- clause_tree(g, Trail, TG), clause_tree(r, Trail, TR). #3 clause_tree(g, _, prolog(g)) :- ( predicate_property(g, built_in) ; predicate_property(g, compiled) ), call(g). %% let Prolog do it #4 clause_tree(g, Trail, _) :- loop_detect(g, Trail), fail. #5 clause_tree(g, Trail, tree(g,t)) :- Exit: (6) clause_tree(p(3), [], tree(p(3), (tree(q(3), true), tree(r(5), true), prolog(3<5))))? creep X = 3, clause(g, Body), Tree = tree(p(3), (tree(q(3), true), tree(r(5), true), prolog(3<5))). clause_tree(body, [G Trail], T). p(x) :- q(x), r(y), X < Y. q(3). r(2). r(5). r(10). 21

Drawing clause trees why(g) :- clause_tree(g, [], T), nl, draw_tree(t, 5). draw_tree(tree(root, Branches), Tab) :- tab(tab), write(' -- '), write(root), nl, Tab5 is Tab + 5, draw_tree(branches,tab5). draw_tree((b, Bs), Tab) :- draw_tree(b, Tab), draw_tree(bs, Tab). draw_tree(node,tab) :- tab(tab), write(' -- '), write(node), nl.?- why(p(x)). -- p(3) -- q(3) -- true -- r(5) -- true -- prolog(3 < 5) X = 3 ; -- p(3) -- q(3) -- true -- r(10) -- true -- prolog(3 < 10) X = 3 ; No 22

Drawing the 1 st clause tree why(g) :- clause_tree(g, [], T), nl, draw_tree(t, 5). draw_tree(tree(root, Branches), Tab) :- tab(tab), write(' -- '), write(root), nl, Tab5 is Tab + 5, draw_tree(branches,tab5). draw_tree((b, Bs), Tab) :- draw_tree(b, Tab), draw_tree(bs, Tab). draw_tree(node,tab) :- tab(tab), write(' -- '), write(node), nl. tree( p(3), (tree(q(3),true), tree(r(5),true), prolog(3 < 5)) ) (tree(q(3),true), tree(r(5),true), prolog(3 < 5)) tree(q(3),true) q(3) true tree(r(5),true), prolog(3 < 5) tree(r(5),true) r(5) true prolog(3 < 5)?- why(p(x)). -- p(3) -- q(3) -- true -- r(5) -- true -- prolog(3 < 5) X = 3 ; 23

Drawing the 2 nd clause tree why(g) :- clause_tree(g, [], T), nl, draw_tree(t, 5). draw_tree(tree(root, Branches), Tab) :- tab(tab), write(' -- '), write(root), nl, Tab5 is Tab + 5, draw_tree(branches,tab5). draw_tree((b, Bs), Tab) :- draw_tree(b, Tab), draw_tree(bs, Tab). draw_tree(node,tab) :- tab(tab), write(' -- '), write(node), nl. tree( p(3), (tree(q(3),true), tree(r(10),true), prolog(3 < 10)) ) (tree(q(3),true), tree(r(10),true), prolog(3 < 10)) tree(q(3),true) q(3) true tree(r(10),true), prolog(3 < 10) tree(r(10),true) r(10) true prolog(3 < 10) -- p(3) -- q(3) -- true -- r(10) -- true -- prolog(3 < 10) X = 3 ; No 24

Iterative Deepening clause_tree(true, _, _) :-!. clause_tree(_, D, Limit) :- D > Limit, fail. %% reached depth limit clause_tree((a,b), D, Limit) :- clause_tree(a, D, Limit), clause_tree(b, D, Limit). clause_tree(a, _, _) :- predicate_property(a, built_in), call(a). iterative_deepening(g, D) :- clause_tree(g, 0, D). iterative_deepening(g, D) :- write('limit='), write(d), write('(hit Enter to Continue.)'), get0(c), ( C == 10 -> D1 is D + 5, iterative_deepening(g, D1) ). clause_tree(a, D, Limit) :- clause(a, B), D1 is D+1, clause_tree(b, D1, Limit). 25

Prolog Input (1) get0(-char) Edinburgh version of the ISO get_code/1 predicate. Note that Edinburgh Prolog didn't support wide characters and therefore technically speaking get0/1 should have been mapped to get_byte/1. The intention of get0/1, however, is to read character codes. get_code(-code) Read the current input stream and unify Code with the character code of the next character. Code is unified with -1 on end of file. See also get_char/1. get_char(-char) Read the current input stream and unify Char with the next character as a one-character atom. See also atom_chars/2. On end-of-file, Char is unified to the atom end_of_file. get_byte(-byte) Read the current input stream and unify the next byte with Byte (an integer between 0 and 255). Byte is unified with -1 on end of file. 26

Prolog Input (2) input in Prolog, read, end_of_file, get, get_byte, getc, flush_output read(x) reads the next term in the current input stream end_of_file read(x) causes X to be bound to this special symbol get_byte(c) reads a single character from the current input stream get(c) reads the first non-blank character flush_output is actually an output goal get0(c) reads character codes. eg. 10 (0A) LF (line feed) 27

Prolog if-then-else statement The built-in infix predicate X -> Y ; Z functions as an if X then Y else Z facility. min(a, B, Min) :- A < B -> Min = A ; Min = B. min(a, B, A) :- A <= B. min(a, B, B) :- B < A. If -> Then ; _Else :- If, Then. If -> _Then ; Else :- Else. If -> Then :- If, Then. Please note that (If -> Then) acts as (If -> Then ; fail), making the construct fail if the condition fails. This unusual semantics is part of the ISO and all de-facto Prolog standards. 28

Predicate Description Notations (1) predicate(?variable1, +Variable2, Variable3)?Var1: +Var2: Var3: Var1 can be either instantiated or not. Both ways are possible. Var2 is an input to the predicate. As such it must be instantiated. Var3 is an output to the predicate. It is usually non-instantiated, but may be instantiated if you want to check for a specific "return value". 29

Predicate Description Notations (2) + Argument must be fully instantiated to a term that satisfies the required argument type. Think of the argument as input. - Argument must be unbound. Think of the argument as output.? Argument must be bound to a partial term of the indicated type. Note that a variable is a partial term for any type. Think of the argument as either input or output or both input and output. For example, in stream_property(s, reposition(bool)), the reposition part of the term is input and the uninstantiated Bool is output. : Argument is a meta-argument. Implies +. @ Argument is not further instantiated. Typically used for type tests.! Argument contains a mutable structure that may be modified using setarg/3 or nb_setarg/3. 30

Infinite Descent connected(x,y) :- connected(x,z), connected(z,y). connected(1,2). connected(2,3). connected(3,4). connected(4,5).?- connected(1,what) connected(1,z1) connected(1, Z2) connected(z2, Z1) connected(1, Z3) connected(z3, Z2) connected(z1,what)?- connected(1,2).... connected(x,y) :- connected(x,z), connected(z,y). connected(x,y) :- connected(x,z), connected(z,y). connected(x,y) :- connected(x,z), connected(z,y). 31

Iterative Deepening clause_tree(true, _, _) :-!. clause_tree(_, D, Limit) :- D > Limit, fail. %% reached depth limit clause_tree((a,b), D, Limit) :- clause_tree(a, D, Limit), clause_tree(b, D, Limit). clause_tree(a, _, _) :- predicate_property(a, built_in), call(a). clause_tree(a, D, Limit) :- clause(a, B), D1 is D+1, clause_tree(b, D1, Limit). A = true No D > Limit No A = (X, Y) No A = built_in No A B stop w/ true this rule fail clause_tree(x, D, Limit) clause_tree(y, D, Limit) call(a) clause_tree(b, D+1, Limit) 32

Iterative Deepening iterative_deepening(g, D) :- clause_tree(g, 0, D). iterative_deepening(g, D) :- write('limit='), write(d), write('(hit Enter to Continue.)'), get0(c), ( C == 10 -> D1 is D + 5, iterative_deepening(g, D1) ). iterative_deepening(g, D) clause_tree(g,0,d) stop No iterative_deepening(g, D+5) clause_tree(g, 0, D) clause_tree(_, D, Limit) current level max level 33

Infinite Descent connected(x,y) :- connected(x,z), connected(z,y). connected(1,2). connected(2,3). connected(3,4). connected(4,5).?- iterative_deepening(connected(1,what), 1). What=3 ; What=2 ; Limit=1(Hit Enter to Continue) What=5 ; What=5 ; What=5 ; What=4 ; What=5 ; What=5 ; What=4 ; What=3 ; What=2 ; Limit=6(Hit Enter to Continue.) What=5 %% stop connected (1,Z1)?- connected(1,2)....?- connected(1,what) Z1=2 What=3 connected (Z1,What) What=2 connected (1,2) 1 st rule 1 st fact Yes 34

Infinite Descent?- [ideep]. % ideep compiled 0.00 sec, 9 clauses true.?- [ideep_rule]. % ideep_rule compiled 0.00 sec, 7 clauses true.?- trace(clause_tree). % clause_tree/3: [call,redo,exit,fail] true. 35

Trace result with D+1 (1) [debug]?- iterative_deepening(connected(1,what), 1). T Call: (7) clause_tree(connected(1, _G357), 0, 1) T Redo: (7) clause_tree(connected(1, _G357), 0, 1) T Redo: (7) clause_tree(connected(1, _G357), 0, 1) T Call: (8) clause_tree((connected(1, _G435), connected(_g435, _G357)), 1, 1) T Redo: (8) clause_tree((connected(1, _G435), connected(_g435, _G357)), 1, 1) T Call: (9) clause_tree(connected(1, _G435), 1, 1) T Redo: (9) clause_tree(connected(1, _G435), 1, 1) T Redo: (9) clause_tree(connected(1, _G435), 1, 1) T Call: (10) clause_tree((connected(1, _G453), connected(_g453, _G435)), 2, 1) T Fail: (10) clause_tree((connected(1, _G453), connected(_g453, _G435)), 2, 1) T Call: (10) clause_tree(true, 2, 1) T Exit: (10) clause_tree(true, 2, 1) T Exit: (9) clause_tree(connected(1, 2), 1, 1) T Call: (9) clause_tree(connected(2, _G357), 1, 1) T Redo: (9) clause_tree(connected(2, _G357), 1, 1) T Redo: (9) clause_tree(connected(2, _G357), 1, 1) T Call: (10) clause_tree((connected(2, _G459), connected(_g459, _G357)), 2, 1) T Fail: (10) clause_tree((connected(2, _G459), connected(_g459, _G357)), 2, 1) T Call: (10) clause_tree(true, 2, 1) T Exit: (10) clause_tree(true, 2, 1) T Exit: (9) clause_tree(connected(2, 3), 1, 1) T Exit: (8) clause_tree((connected(1, 2), connected(2, 3)), 1, 1) T Exit: (7) clause_tree(connected(1, 3), 0, 1) What = 3 ; T Call: (8) clause_tree(true, 1, 1) T Exit: (8) clause_tree(true, 1, 1) T Exit: (7) clause_tree(connected(1, 2), 0, 1) What = 2 ; clause_tree(true, _, _) :-!. clause_tree(_, D, Limit) :- D > Limit, fail. %% reached depth limit clause_tree((a,b), D, Limit) :- clause_tree(a, D, Limit), clause_tree(b, D, Limit). clause_tree(a, _, _) :- predicate_property(a, built_in), call(a). clause_tree(a, D, Limit) :- clause(a, B), D1 is D+1, clause_tree(b, D1, Limit). iterative_deepening(g, D) :- clause_tree(g, 0, D). iterative_deepening(g, D) :- write('limit='), write(d), write('(hit Enter to Continue.)'), get0(c), ( C == 10 -> D1 is D + 1, iterative_deepening(g, D1) ). 36 c(1,z3)

Trace result with D+1 (2) limit=1(hit Enter to Continue.) T Call: (8) clause_tree(connected(1, _G357), 0, 2) T Redo: (8) clause_tree(connected(1, _G357), 0, 2) T Redo: (8) clause_tree(connected(1, _G357), 0, 2) T Call: (9) clause_tree((connected(1, _G438), connected(_g438, _G357)), 1, 2) T Redo: (9) clause_tree((connected(1, _G438), connected(_g438, _G357)), 1, 2) T Call: (10) clause_tree(connected(1, _G438), 1, 2) T Redo: (10) clause_tree(connected(1, _G438), 1, 2) T Redo: (10) clause_tree(connected(1, _G438), 1, 2) T Call: (11) clause_tree((connected(1, _G456), connected(_g456, _G438)), 2, 2) T Redo: (11) clause_tree((connected(1, _G456), connected(_g456, _G438)), 2, 2) T Call: (12) clause_tree(connected(1, _G456), 2, 2) T Redo: (12) clause_tree(connected(1, _G456), 2, 2) T Redo: (12) clause_tree(connected(1, _G456), 2, 2) T Call: (13) clause_tree((connected(1, _G474), connected(_g474, _G456)), 3, 2) T c(1, 2) Fail: (13) clause_tree((connected(1, _G474), connected(_g474, _G456)), 3, 2) T Call: (13) clause_tree(true, 3, 2) T Exit: (13) clause_tree(true, 3, 2) T Exit: (12) clause_tree(connected(1, 2), 2, 2) c(1, 3) T Call: (12) clause_tree(connected(2, _G438), 2, 2) T Redo: (12) clause_tree(connected(2, _G438), 2, 2) T Redo: (12) clause_tree(connected(2, _G438), 2, 2) T Call: (13) clause_tree((connected(2, _G480), connected(_g480, _G438)), 3, 2) T c(2, 3) Fail: (13) clause_tree((connected(2, _G480), connected(_g480, _G438)), 3, 2) T Call: (13) clause_tree(true, 3, 2) T Exit: (13) clause_tree(true, 3, 2) T Exit: (12) clause_tree(connected(2, 3), 2, 2) T Exit: (11) clause_tree((connected(1, 2), connected(2, 3)), 2, 2) T Exit: (10) clause_tree(connected(1, 3), 1, 2) T Call: (10) clause_tree(connected(3, _G357), 1, 2) T Redo: (10) clause_tree(connected(3, _G357), 1, 2) T c(1, 5) Redo: (10) clause_tree(connected(3, _G357), 1, 2) 37

Trace result with D+1 (3) c(1, 5) T Call: (11) clause_tree((connected(3, _G486), connected(_g486, _G357)), 2, 2) T Redo: (11) clause_tree((connected(3, _G486), connected(_g486, _G357)), 2, 2) T Call: (12) clause_tree(connected(3, _G486), 2, 2) T Redo: (12) clause_tree(connected(3, _G486), 2, 2) T Redo: (12) clause_tree(connected(3, _G486), 2, 2) T Call: (13) clause_tree((connected(3, _G504), connected(_g504, _G486)), 3, 2) T c(3, 4) Fail: (13) clause_tree((connected(3, _G504), connected(_g504, _G486)), 3, 2) T Call: (13) clause_tree(true, 3, 2) T Exit: (13) clause_tree(true, 3, 2) T c(3, 5) Exit: (12) clause_tree(connected(3, 4), 2, 2) T Call: (12) clause_tree(connected(4, _G357), 2, 2) T Redo: (12) clause_tree(connected(4, _G357), 2, 2) T Redo: (12) clause_tree(connected(4, _G357), 2, 2) T Call: (13) clause_tree((connected(4, _G510), connected(_g510, _G357)), 3, 2) T c(4, 5) Fail: (13) clause_tree((connected(4, _G510), connected(_g510, _G357)), 3, 2) T Call: (13) clause_tree(true, 3, 2) T Exit: (13) clause_tree(true, 3, 2) T Exit: (12) clause_tree(connected(4, 5), 2, 2) T Exit: (11) clause_tree((connected(3, 4), connected(4, 5)), 2, 2) T Exit: (10) clause_tree(connected(3, 5), 1, 2) T Exit: (9) clause_tree((connected(1, 3), connected(3, 5)), 1, 2) T Exit: (8) clause_tree(connected(1, 5), 0, 2) What = 5 ; T Call: (11) clause_tree(true, 2, 2) T Exit: (11) clause_tree(true, 2, 2) T Exit: (10) clause_tree(connected(3, 4), 1, 2) T Exit: (9) clause_tree((connected(1, 3), connected(3, 4)), 1, 2) T Exit: (8) clause_tree(connected(1, 4), 0, 2) What = 4 ; 38

Infinite Descent (4) T Call: (11) clause_tree(true, 2, 2) T c(1, 2) Exit: (11) clause_tree(true, 2, 2) T Exit: (10) clause_tree(connected(1, 2), 1, 2) T Call: (10) clause_tree(connected(2, _G357), 1, 2) T Redo: (10) clause_tree(connected(2, _G357), 1, 2) T Redo: (10) clause_tree(connected(2, _G357), 1, 2) T Call: (11) clause_tree((connected(2, _G462), connected(_g462, _G357)), 2, 2) T Redo: (11) clause_tree((connected(2, _G462), connected(_g462, _G357)), 2, 2) T Call: (12) clause_tree(connected(2, _G462), 2, 2) T Redo: (12) clause_tree(connected(2, _G462), 2, 2) T Redo: (12) clause_tree(connected(2, _G462), 2, 2) T Call: (13) clause_tree((connected(2, _G480), connected(_g480, _G462)), 3, 2) T c(1, 4) c(2, 3) Fail: (13) clause_tree((connected(2, _G480), connected(_g480, _G462)), 3, 2) T Call: (13) clause_tree(true, 3, 2) T Exit: (13) clause_tree(true, 3, 2) T Exit: (12) clause_tree(connected(2, 3), 2, 2) T Call: (12) clause_tree(connected(3, _G357), 2, 2) T Redo: (12) clause_tree(connected(3, _G357), 2, 2) T Redo: (12) clause_tree(connected(3, _G357), 2, 2) T Call: (13) clause_tree((connected(3, _G486), connected(_g486, _G357)), 3, 2) T c(3, 4) Fail: (13) clause_tree((connected(3, _G486), connected(_g486, _G357)), 3, 2) T Call: (13) clause_tree(true, 3, 2) T Exit: (13) clause_tree(true, 3, 2) T Exit: (12) clause_tree(connected(3, 4), 2, 2) T Exit: (11) clause_tree((connected(2, 3), connected(3, 4)), 2, 2) T Exit: (10) clause_tree(connected(2, 4), 1, 2) T Exit: (9) clause_tree((connected(1, 2), connected(2, 4)), 1, 2) T Exit: (8) clause_tree(connected(1, 4), 0, 2) What = 4 ; 39

Trace result with D+1 (5) T c(1, 3) c(2, 3) Call: (11) clause_tree(true, 2, 2) T Exit: (11) clause_tree(true, 2, 2) T Exit: (10) clause_tree(connected(2, 3), 1, 2) T Exit: (9) clause_tree((connected(1, 2), connected(2, 3)), 1, 2) T Exit: (8) clause_tree(connected(1, 3), 0, 2) What = 3 ; T c(1, 2) Call: (9) clause_tree(true, 1, 2) T Exit: (9) clause_tree(true, 1, 2) T Exit: (8) clause_tree(connected(1, 2), 0, 2) What = 2 ; limit=2(hit Enter to Continue.)?- c(1,what) What=5 ; What=4 ; What=3 ; What=2 ; c(1,z1) c(z1,w) c(1,a) c(1,z2) c(z2,z1) c(1,b) 40

Tree result with D+1 (1)?- c(1,5) #1 What=5 ; #2 What=4 ;?- c(1,4) c(1,3) c(3,5) c(1,2) c(2,4) c(1,2) c(2,3) c(3,4) c(4,5) c(1,2) c(2,3) c(3,4)?- c(1,4) #1 What=4 ; #2 What=3 ;?- c(1,3) c(1,3) c(3,4) c(1,2) c(2,3) c(1,2) c(2,3) c(3,4) c(1,2) c(2,3) 41

Tree result with D+1 (2) #1 What=2 ;?- c(1,2) c(1,2) 42

References [1] en.wikipedia.org [2] en.wiktionary.org [3] U. Endriss, Lecture Notes : Introduction to Prolog Programming [4] http://www.learnprolognow.org/ Learn Prolog Now! [5] http://www.csupomona.edu/~jrfisher/www/prolog_tutorial [6] www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/intro.html [7] www.cse.unsw.edu.au/~billw/dictionaries/prolog/negation.html 44