2017-02-20 20 views
0

Я начал использовать Prolog, и у меня возникла эта проблема с динамическим предикатом - я не получаю правильный результат.Динамический предикат в Prolog

Это моя база данных:

:- dynamic mother/2. 

mother(X,Y). 

grandemother(X,Y) :- 
    mother(X,A), 
    mother(A,Y). 

Вот некоторые из результатов, которые я получаю:

1 ?- assert(mother(alice,lise)). 
true. 

2 ?- assert(mother(lise,kate)). 
true. 

3 ?- grandemother(alice,X). % should only give X = kate. 
true ; 
X = lise ; 
X = kate ; 
true ; 
X = kate. 

4 ?- grandemother(alice,lise). % should only give false. 
true ; 
true ; 
true ; 
false. 

5 ?- grandemother(X,kate). % should only give X = alice. 
true ; 
true ; 
X = alice ; 
X = alice ; 
X = lise. 

Я действительно не знаю, где эта проблема стоит, какие идеи?

+0

Какова цель «матери (X, Y) .'? Это означает, что 'X' является матерью' Y' независимо от того, что 'X' и' Y', поскольку они являются переменными. – lurker

+0

Я знаю, что могу просто поместить их в качестве фактов «мать (Алиса, Лиза)», .. и т. Д., Но я хотел создать экземпляр с использованием предиката assert. – StamDad

+1

Я имею в виду буквально «мать (X, Y).», Строка сразу после вашего «динамического/1» вызова. Это «факт», в котором говорится, что кто-то является матерью кого-либо еще. – lurker

ответ

0

Как сказал @lurker в своем комментарии, проблема заключается в вашей строке mother(X,Y)., непосредственно после динамической декларации.

ломаться точно, что происходит, я буду смотреть на grandemother(alice,X) (после того, как ваш утверждает о mother(alice,lise) и mother(lise,kate)):

grandemother(alice,X) :- mother(alice,A),mother(A,X). 
mother(alice,A) unifies with mother(X,Y). This leaves A unbound. 
mother(A,X) unifies with mother(X,Y). This leaves both A and X unbound. 

Поэтому grandemother(alice,X) удается без привязки X.

мы попросим снова, и на этот раз:

mother(A,X) unifies with mother(alice,lise). (The second mother/2 fact.) 

grandemother(alice,X) преуспевает с X-Боу и лизать. Спросить еще раз ...

mother(A,X) unifies with mother(lise,kate). 

X is kate. Опять же ...

mother(A,X) cannot be unified any more. Backtrack further... 
mother(alice,A) unifies with mother(alice,lise). 
mother(lise,X) unifies with mother(X,Y). X is unbound. 

X является несвязанным снова, так что мы просто получить true. Опять же ...

mother(lise,X) unifies with mother(lise,kate). 

X is kate again. Не больше?

mother(lise,X) cannot be unified any more. Backtrack further... 
mother(alice,A) cannot be unified any more. Backtrack further... 
No more backtracking to be done, so there are no more results. 

Таким образом, мы получаем больше результатов.

Решение, как указал @lurker, заключается в удалении mother(X,Y)., так что это несвязанное поведение не может произойти.

+0

это сработало ... спасибо парни. – StamDad