Пролог: поиск N-го элемента в списке - PullRequest
1 голос
/ 06 апреля 2010

Я пытаюсь найти n-й элемент списка в прологе. Вот код, который я пытаюсь использовать:

Cells = [OK, _, _, _, _, _] .

...

next_safe(_) :-
facing(CurrentDirection),
delta(CurrentDirection, Delta), 
in_cell(OldLoc), 
NewLoc is OldLoc + Delta,
nth1(NewLoc, Cells, SafetyIdentifier),
SafetyIdentifier = OK .

По сути, я пытаюсь проверить, в порядке ли данная ячейка для перехода. Я что-то упустил?

Ответы [ 2 ]

5 голосов
/ 03 января 2011

есть предопределенный предикат с именем nth0 ..

5 ?- nth0(1,[1,2,3],X).
X = 2.

6 ?- listing(nth0).
lists:nth0(A, B, C) :-
        integer(A), !,
        A>=0,
        nth0_det(A, B, C).
lists:nth0(A, B, C) :-
        var(A), !,
        nth_gen(B, C, 0, A).

true.

индекс начинается с 0 надеюсь, это поможет ..

2 голосов
/ 13 апреля 2010

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

Вещи, начинающиеся с заглавной буквы в Прологе, - это переменные, с которыми нужно сопоставлять правила. _ - это специальный символ, который можно использовать вместо имени переменной, чтобы указать, что любое значение может совпадать.

Следовательно,

next_safe(_) может дать вам верный / ложный ответ, только если вы дадите ему конкретное значение. Одним из основных преимуществ Prolog является способность объединяться с переменной посредством обратного отслеживания (как сказал только один). Это будет означать, что при правильном написании вы можете просто спросить Prolog next_safe(X)., и он вернет все возможные значения (безопасные ходы), которые объединяются с X.

Чтобы вернуться к первому пункту о заглавных буквах. Это означает, что OK на самом деле является переменной, ожидающей сопоставления. Это фактически пустое поле, которое вы пытаетесь сопоставить с другим пустым полем. Я думаю, что вы намереваетесь использовать значение ok, которое отличается. Вы не присваиваете переменные так же, как в других стилях программирования. Что-то вроде следующего может быть ближе к тому, что вы ищете, хотя я все еще не уверен, что это правильно, поскольку похоже, что вы пытаетесь назначить вещи, но я не уверен, как работает ваш nth1.

Cells = [ok, _, _, _, _, _] .

...

next_safe(NewLoc) :-
    facing(CurrentDirection),
    delta(CurrentDirection, Delta), 
    in_cell(OldLoc), 
    NewLoc is OldLoc + Delta,
    nth1(NewLoc, Cells, ok).
...