Пролог бесконечный цикл

Это программа, которая должна выяснить, кто совместим с Джоном. Я новичок в Прологе. Чтобы сообщить Прологу, например. met(X,Y) = met (Y,X) много кода было написано. Теперь, когда я начинаю запрос

?- compatible(john, X)

это входит в бесконечный цикл...

Исходный код:

compatible(X,Y) :- reading(X), reading(Y).
compatible(X,Y) :- football(X), football(Y).
compatible(X,Y) :- friends(X,Y).
compatible(X,Y) :- mutual(X,Y).
friends(X,Y) :- havemet(X,Y), compatible(X,Y).
havemet(X,Y) :- met(X,Y).
havemet(X,Y) :- met(Y,X).
mutual(X,Y) :- friends(X,Temp), friends(Y,Temp).
mutual(X,Y) :- friends(Temp,X), friends(Y,Temp).
mutual(X,Y) :- friends(X,Temp), friends(Temp,Y).
mutual(X,Y) :- friends(Temp,X), friends(Temp,Y).

football(john).
football(james).
friends(john, carl).
friends(carl, john).
reading(carl).
reading(fred).
reading(emily).
met(carl, emily).
met(fred, james).
met(fred, emily).

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

3 ответа

Так в чем же проблема с вашей программой? Вот способ локализовать проблемы, которые у вас есть. Вставляя цели false мы получаем срез неудачи. Это фрагмент, который по-прежнему имеет много общих свойств с исходной программой. В частности: если зацикливается срез-срез, то зацикливается и оригинальная программа. Таким образом, срез-срез показывает нам часть программы, которую необходимо изменить, чтобы преодолеть первоначальную проблему. По вашему запросу я получаю следующий фрагмент, который все еще не заканчивается:

? - совместимо (john, X), false. совместимый (X, Y): - ложь, чтение (X), чтение (Y). совместимый (X, Y): - false, футбол (X), футбол (Y). совместимый (X, Y): - false, друзья (X, Y). совместимый (X, Y): - взаимный (X, Y), ложный. друзья (X, Y): - имеют мет (X, Y), совместимы (X, Y). друзья (Джон, Карл): - ложь. друзья (Карл, Джон). Хавмет (X, Y): - ложно, встретил (X, Y). иметь (X, Y): - встретил (Y, X). взаимное (X, Y): - false, друзья (X,Temp), друзья (Y, Temp). взаимное (X, Y): - друзья (Temp,X), друзья (Y, Temp), false. взаимное (X, Y): - друзья (X,Temp), false, друзья (Temp, Y). взаимное (X, Y): - false, друзья (Temp,X), друзья (Temp, Y). встретил (Карл, Эмили). встретил (Фред, Джеймс): - ложь. встретил (Фред, Эмили): - ложь. 

Но не должен просто запрос compatible/2 прекратить? Для наиболее общего запроса срез ошибки может быть уменьшен еще больше:

? - совместимый (X, Y), ложный.

совместимый (X, Y): - ложь, чтение (X), чтение (Y).
совместимый (X, Y): - false, футбол (X), футбол (Y).
совместимый (X, Y): - false, друзья (X, Y).
совместимый (X, Y): - взаимный (X, Y), ложный.

друзья (X, Y): - имеют мет (X, Y), совместимы (X, Y).
друзья (Джон, Карл): - ложь.
друзья (Карл, Джон): - ложь.

Хавмет (X, Y): - ложно, встретил (X, Y).
иметь (X, Y): - встретил (Y, X).

взаимное (X, Y): - false, друзья (X,Temp), друзья (Y, Temp).
взаимное (X, Y): - false, друзья (Temp,X), друзья (Y, Temp).
взаимное (X, Y): - друзья (X,Temp), false, друзья (Temp, Y).
взаимное (X, Y): - false, друзья (Temp,X), друзья (Temp, Y).

встретил (Карл, Эмили).
встретил (Фред, Джеймс): - ложь.
встретил (Фред, Эмили): - ложь.

Именно в оставшейся части вы должны как-то решить проблему. Могут быть и другие причины не прекращения. Но вы должны исправить это в любом случае.

И если это все еще не достаточно хорошо, вы можете добавить цели V = const в программу. Но я думаю, что этого должно быть достаточно...

Я не удивлен, что у вас есть бесконечный цикл. compatible зависит от friends в то время как friends зависит от compatible, Вы уверены, что это то, что вы хотите?

Обратите внимание, что если вы действительно хотите, чтобы ваши правила были рекурсивными, вам понадобится условие остановки. Но я не понимаю, почему вам понадобится рекурсия для такой простой задачи, как сопоставление аффинности.

Какую систему Prolog вы используете? Вам необходимо использовать определенную систему?

Ваша программа в том виде, в каком она есть, не прекратит работу в стандартном Прологе, но будет в Прологе с поддержкой табуляции, такой как XSB-Prolog http://xsb.sourceforge.net/ или B-Prolog http://www.probp.com/ - просто добавь :- auto_table. как первая строка вашей программы.

| ?- compatible(john, X).
compatible(john, X).
X = john ?;
X = james ?;
X = carl ?;
X = emily ?;
no
Другие вопросы по тегам