2015-10-29 6 views
0

Я бегу в стену при написании пролога с помощью пролога YAP. Я изолированных мою проблему этих двух строк кода:Бесконечная петля в прологе

is_a(G, A2):-is_a(G, A1), is_a_link(A1, A2). 
is_a(x, y). 

Если я эти две строки кода в файле, и обращаться к файлу, еп спросить пролог, если is_a(x,y), программа никогда не заканчивается, что приводит меня к мысли, есть бесконечный цикл.

Но я не понимаю, почему была бы петля, я просто спросил пролог, является ли одна из ее аксиом истинной, не так ли (без второй мысли) просто выплюнуть Yes?

Я имею в виду, насколько я понимаю, как работает пролог, он попытается найти истинное утверждение в базе знаний, которое «доказывает» утверждение. Я смущен, почему он не просто возвращает аксиому.


EDIT:

Переключение строк кода, т.е.

is_a(x, y). 
is_a(G, A2):-is_a(G, A1), is_a_link(A1, A2). 

делает пролог не врезаться, так как очевидно, первая встречает истинное утверждение.

+1

Как 'is_a_link/2' реализованного? Несмотря на то, что вы заменили этот факт предикатом, он все равно не прекратится. Просто бывает, что вы производите бесконечное решение 'x' и' y' вместо одного раза. – lurker

ответ

0

Переименуйте факт что-то другое:

is_a_fact_or_whatever(x,y). 
is_as(G,A2) :- is_a_fact_or_whatever(G,A1), is_a_link(A1,A2). 
Смежные вопросы