Пролог терпит неудачу, не пробуя ни одно из правил 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).

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

Другие вопросы по тегам