Могу ли я использовать переменные с assert / 1? - PullRequest
9 голосов
/ 25 декабря 2011

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

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

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

mammal(dolphin).

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

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

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

EDIT Мне нужно отредактировать базу данных, чтобы иметь динамическую базу данных, с которой пользователь может взаимодействовать.Я создаю машину аргументов, и мне нужно разрешить пользователю сообщать системе, что он «знает факт наверняка», чтобы система могла иметь дело со знаниями вне своей области.

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

Ура,

1 Ответ

9 голосов
/ 25 декабря 2011

Вы можете использовать оператор 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).

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

...