Пролог - Использование динамических с утверждениями

Я новичок в Прологе, и мне трудно использовать динамический предикат.

Во-первых, вот код, который я выполняю

:- dynamic(list/1).

add(X, LL) :- asserta(list([])), asserta(list(X)), retract(list(LL)).

Я знаю, что код выглядит странно, но я просто ищу правильный синтаксис для использования.

Теперь, если я сделаю:

добавить (2, LL).

Ответ будет:

LL = 2;

LL = [].

Но я хочу добавить X (2) в массив ([]). Так..

LL = [2].

Это выглядит просто (вероятно, так), но я не могу заставить его работать.

Большое спасибо.

1 ответ

Решение

Если вы хотите добавить X в начало списка:

add(X, LL) :-
    (   retract(list(Prev))
    ->  LL = [X|Prev]
    ;   LL = [X]
    ),
    asserta(list(LL)).

Но я согласен с советом @jschimpf. Assert/retract следует использовать только при определенных обстоятельствах, которые могут быть весьма эффективными в некоторых приложениях.

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