2011-12-25 2 views
7

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

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

Например, допустим, что этот факт в БД

mammal(dolphin). 

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

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

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

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

В вене http://en.wikipedia.org/wiki/Reason_maintenance

Приветствия,

ответ

8

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

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

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

:- dynamic(mammal/1). 

mammal(dolphin). 

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

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

+0

Ага, я обычно использую not() только для удобства чтения при первом взломе, даже если он устарел. Должно было измениться это для должности. В любом случае, это именно то, что я искал. Я не использовал пролог, так как класс, который я узнал об этом некоторое время назад, я переучиваю. Полностью забыл '= ../2', чтобы это разрешило. Я уточню программу выше. –

+0

о вашем редактировании: кажется, является законной причиной манипулирования db:] – m09

Смежные вопросы