Могу ли я использовать переменные с 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).
Но я не уверен, что вы пытаетесь сделать прямо здесь. Довольно часто, когда новичок в прологе хочет манипулировать базой данных, это происходит из-за того, что конкретный механизм пролога не понят должным образом. Опять же, вы не новичок, и мое замечание может быть глупым, в таком случае, просто забудьте об этом! Но если вы новичок, вы можете уточнить, чего вы пытаетесь достичь, чтобы мы могли подтвердить, что эти манипуляции необходимы!