Пролог терпит неудачу, не пробуя ни одно из правил 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. Почему это происходит? Что я должен изменить, чтобы сделать эту работу?
1 ответ
Вы уже получили правильные ответы в комментариях некоторых опытных программистов Prolog. Но, возможно, остановитесь на некоторое время и подумайте, как вы могли бы найти такие ошибки.
Хорошая вещь в Прологе состоит в том, что программы могут быть обобщены очень простым способом: удаляя цели и удаляя подтермы. Если такая обобщенная программа также дает сбой, в оставшемся фрагменте должна быть ошибка. В вашем примере это будет:
: - op (950, фу, *). * _. 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). ? - разрешение ([_/ * [a, b] * /], [], M).
Запрос здесь все еще не выполняется, поэтому ошибка должна быть в оставшейся видимой части.