Проблема с глубиной первого поискового вывода в прологе - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть следующий код:

s(a, b).
s(b, c).
goal(c).

solve( N, [N] ) :-
    goal( N).

solve( N, [N1 | Sol] ) :-
    s( N, Nl),
    solve( Nl, Sol).

Когда я ввожу запрос:

solve(a, P).

Это дает мне:

P = [_,_,c] ? 

yes

Но я хочу полный путь, например

P = [a,b,c] ?

1 Ответ

0 голосов
/ 09 ноября 2018

В вашем предикате вы используете две переменные, которые похожи (графически):

solve( N, [N] ) :-
    goal( N).

solve( N, [<b>N1</b> | Sol] ) :-
    s( N, <b>Nl</b>),
    solve( <b>Nl</b>, Sol).

Здесь Nl (с буквой L в нижнем регистре) выглядит аналогично N1 (с единицей 1). Фактически интерпретатор Prolog распознает, что N1 используется только один раз, и выдает предупреждение:

?- ['file.pl'].
Warning: /tmp/file.pl:8:
        <b>Singleton variables: [N1] </b>
true.

Переменная N1 не имеет ничего общего с переменной Nl, определенной в теле, и поэтому остается не объединенной.

Но, как говорится, если вы действительно хотите выводить здесь, вы должны использовать N в конструкции "path", а не N1, так как в противном случае для solve(a, L), L начнется с b , не a, и дважды упомянет последний узел (здесь c), поэтому:

solve( N, [N] ) :-
    goal( N).

solve(N, [<b>N</b> | Sol]) :-
    s(N, Nl),
    solve(Nl, Sol).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...