Пролог бесконечный цикл
Это программа, которая должна выяснить, кто совместим с Джоном. Я новичок в Прологе. Чтобы сообщить Прологу, например. 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