bug-prolog
[Top][All Lists]

## Re: Just crashed gprolog

 From: Lindsey Spratt Subject: Re: Just crashed gprolog Date: Mon, 5 May 2003 09:51:57 -0500

```
On Sunday, May 4, 2003, at 02:26  AM, Emmanuel Mogenet wrote:

```
```ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- ancestor(X,Z), ancestor(Z,Y)
```
```[snip]
```
```| ?- ancestor(X,leo).

X = manu ? ;

X = jolene ? ;

X = francis ? ;
Segmentation fault (core dumped)

Am I doing something wrong ?
```
```yes, you have an infinite recursion.

```
```Is the tree of ancestors that huge that I'm
causing the unification to fail ?
```
```no.

```
You have encountered gprolog's graceful method of telling you that you have an infinite recursion: it recurses until it overwrites some memory and then faults.
```
```
Your second ancestor/2 clause: "ancestor(X,Y) :- ancestor(X,Z), ancestor(Z,Y)." is "left-recursive" (the first goal is a recursive call). This is not supported by Prolog. Once ancestor/2 exhausts the solutions for 'ancestor(X,leo)', it gets into an infinite recursive loop through this second clause with 'ancestor(X,Z)' trying first to find a satisfactory parent/2 solution (which is no longer possible), then falling info the second ancestor/2 clause (recursively), which tries the parent/2 clauses again then recursively falls into the 2nd ancestor/2 clause, etcetera.
```
This can be simply fixed by:
```
```ancestor(X,Y) :- parent(X,Y).
ancestor(X,Y) :- parent(X,Z), ancestor(Z,Y)
```
```

Lindsey Spratt
http://homepage.mac.com/lspratt

```