Могу ли я использовать переменные с assert/1?

То, что я сейчас имею, проверяет, что X(Y) не является принятым фактом в моей маленькой БД. Поскольку X(Y) возвращает false, он попытается утвердить его. (Я понимаю, что это создает проблемы, когда X является правилом, а не фактом)

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    assert(X(Y)).

Например, скажем, что этот факт находится в БД

mammal(dolphin).

Я спрашиваю, если не добавить (млекопитающее, слон).

Я хочу это увидеть? млекопитающим (слон). ложно, а затем утверждают млекопитающее (слон).

Очевидно, что "утверждать (X(Y))". линия неправильна, но чем я могу заменить ее? Я просматриваю прологическую документацию и форумы за ответ, но пока не повезло. Я также пытаюсь написать что-то, что сделает это самостоятельно.

РЕДАКТИРОВАТЬ Мне нужно отредактировать БД, чтобы иметь динамическую базу данных, с которой пользователь может взаимодействовать. Я создаю машину аргументов, и мне нужно разрешить пользователю сообщать системе, что он "знает факт наверняка", чтобы система могла иметь дело со знаниями вне своей области.

В духе http://en.wikipedia.org/wiki/Reason_maintenance

Ура,

1 ответ

Решение

Вы можете использовать оператор Univ =../2 чтобы построить термин перед его утверждением (обратите внимание, что рассматриваемый предикат должен быть объявлен динамическим, чтобы он работал):

ifNotAdd(X,Y):-
    not(call(X,Y)),
    !,
    Term =.. [X, Y],
    assert(Term).

Кстати, если вы хотите ifNotAdd/2 чтобы не потерпеть неудачу, когда не нужно добавлять факт в базу данных, вы должны обернуть это в структуру if, плюс, not/1 устарела, (\+)/1 является предпочтительным:

:- dynamic(mammal/1).

mammal(dolphin).

ifNotAdd(X, Y):-
    (   \+ call(X, Y)
     -> Term =.. [X, Y],
        assert(Term)
     ;  true).

Но я не уверен, что вы пытаетесь сделать прямо здесь. Довольно часто, когда новичок в прологе хочет манипулировать базой данных, это происходит из-за того, что конкретный механизм пролога не понят должным образом. Опять же, вы не новичок, и мое замечание может быть глупым, в таком случае, просто забудьте об этом! Но если вы новичок, вы можете уточнить, чего вы пытаетесь достичь, чтобы мы могли подтвердить, что эти манипуляции необходимы!

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