2016-05-15 6 views
1

У меня есть этот код:Пролог терпит неудачу, не пытаясь любой из RHS правила

res([],M,M). 
res([[A,B]|G],inM,M) :- 
    dfs(A, [[A,B]|G], [], [], Out), 
    processResponse(Out,inM,M1), 
    dfs(B, [[A,B]|G], [], [], Out2), 
    processResponse(Out2,M1,M2), 
    res(G,M2,M). 

Если я бегу res([],[],M), на переводчика, он отлично работает и возвращает M = [].

Если я запустил res([[a,b]],[],M), он терпит неудачу. Я попытался взглянуть на след, и он сразу же сработал на res, даже не попробовав dfs или любые другие правила. Если я пишу правила непосредственно на интерпретаторе, с тем же вводом, они работают нормально.

Я использую SWI Prolog. Почему это происходит? Что я должен изменить, чтобы сделать эту работу?

+2

'inM' * атом * не * переменная *. В Prolog * переменные * должны начинаться с заглавной буквы. 'res ([[a, b]], [], M)' fail, потому что он не соответствует ни одному из ваших предикатных предложений, потому что '[[a, a]]' не соответствует '[]' в первом и '[]' не совпадает с атомом 'inM' во втором предложении. – lurker

+1

Вы случайно используете ** атом ** в 'inM'. Переменные начинаются с буквы верхнего регистра или, например, если вы японский пользователь, с * подчеркиванием *. – mat

ответ

1

Вы уже получили правильные ответы в комментариях некоторых опытных программистов Пролога. Но, может быть, остановитесь некоторое время и подумайте, как вы найдете такие ошибки.

Хорошая вещь в Prolog заключается в том, что программы могут быть обобщены очень простым способом: удаляя цели и удаляя субтермы. Если такая обобщенная программа также не работает, то имеет в качестве ошибки в остальном фрагменте. В вашем примере это будет:

 
:- op(950, fy, *). 
*_. 

res([],_/*M*/,_/*M*/). 
res([_/*[A,B]*/|_/*G*/],inM,_/*M*/) :- 
    * dfs(A, [[A,B]|G], [], [], Out), 
    * processResponse(Out,inM,M1), 
    * dfs(B, [[A,B]|G], [], [], Out2), 
    * processResponse(Out2,M1,M2), 
    * res(G,M2,M). 

?- res([_/*[a,b]*/],[],M). 

Запрос здесь до сих пор не удается, поэтому ошибка должна быть в оставшейся видимой части.