2014-12-11 4 views
0

Вот часть моего кода:Как проверить, возвращается ли Prolog false?

find_paths(A, B) :- 
    path([A], B, Path, 0, Length), 
    reverse(Path, DirectPath), 
    printPath(DirectPath), 
    writef(' with distance of %d\n', [Length]), 
    ("IF PROLOG RETURN FALSE", write('End'); fail). 

Все остальные части работают нормально, когда я хотел, чтобы проверить, если он возвращает ложь после получения всех данных из базы данных из цикла, за исключением. «IF PROLOG RETURN FALSE» - это то, где я хотел вставить контрольную часть, но я не знаю, что положить. Я пробовал код ниже, но он не выводит слово «Конец».

find_paths(A, B) :- 
    path([A], B, Path, 0, Length), 
    reverse(Path, DirectPath), 
    printPath(DirectPath), 
    writef(' with distance of %d\n', [Length]), 
    fail, 
    write('End'). 
+0

'fail' всегда терпит неудачу. Пролог никогда не сможет «написать» («Конец»), поскольку его предыдущая цель никогда не преуспеет. –

+0

Что означает «ЕСЛИ PROLOG RETURN FALSE» означает в этот момент в пункте? Я предполагаю, что вы имеете в виду: «СДЕЛАЙТЕ НЕКОТОРЫЕ ПРОЧИЕ ВОПРОСЫ (или ЗАПРОСЫ), и ЕСЛИ НЕИСПРАВЛЯТЬ ТОГДА, напишите (« Конец »), иначе просто сработайте», и вся статья не работает, в конечном счете, в любом случае? – lurker

+0

Почему вы хотите, чтобы ваш предикат потерпел неудачу, когда он нашел путь и закончил? – lurker

ответ

0

Для того, чтобы напечатать сообщение, если цель не удается вы можете использовать что-то типа:

p:- goal, !. 
p:- write('Failed'). 

Теперь, если вы пытаетесь удовлетворить p, Пролог будет использовать первое правило. Если goal удастся, то оператор разреза удалит ранее созданные точки выбора для цели p и не будет использовать второе правило. Если goal не работает, Prolog отступает до p, использует второе предложение и отображает сообщение.

может быть одной проблемой с этим: из-за оператора разреза, goal выполняется не более одного раза.

Смежные вопросы