Другим способом определения причин отсутствия прерывания является уменьшение количества выводов, которые будет выполнять ваша программа, путем добавления в вашу программу целей false
:
q(Y) :- r(X), <b>false</b>, <s>r(Y)</s>.
r(X) :- r(f(X)), <b>false</b>.
<s>r(a) :- <b>false</b>, p(c)</s>.
<s>r(a) :- <b>false</b>, p(a)</s>.
<s>r(b) :- <b>false</b>, p(b)</s>.
?- q(Y).
** LOOPS **
С тех порПрограмма все еще находится в цикле, вам нужно что-то изменить в видимой части.Обратите внимание, сколько вещей было удалено полностью!Независимо от того, как определен p/1
, эта проблема будет сохраняться.
Если вы внимательно посмотрите на q/1
, вы увидите одну из проблем:
q(Y) :- r(X), <b>false</b>, <s>r(Y)</s>.
Переменная Y
вообще не используется в видимой части.X
появляется только один раз.Таким образом, r(X)
будет самым общим возможным запросом, и, следовательно, он будет иметь наихудшее возможное свойство завершения (которое действительно зависит от определения r/1
).В любом случае, аргумент q/1
не влияет на завершение!
Есть еще одно свойство, на котором можно сделать вывод: порядок предложений не влияет на свойство завершения!Это легко увидеть: независимо от того, где появляются пункты, которые были полностью удалены с помощью false
, их можно удалить.
Подробнее см. fault-slice .