2012-05-03 2 views
1
resultList(UsersQuery):- 
    question(X,H), 
    write(H), 
    myintersection(H,UsersQuery,Match,TotalQuestionKeywords), 
    Percent is Match/TotalQuestionKeywords*100, 
    write('Question: '), 
    write(X),nl,write('Quality: '), write(Percent),write('%'),nl, 

    /* please look at this part 
    Percent>=50, 
    assert(listofQuestions(Percent,Question)), 
    write(Percent),write(Question),nl, 
    fail. 
resultList(_). 

Я хочу заполнить базу данных фактов с именем «listofQuestions». Все работает нормально, но вещи, которые я утверждаю, остаются в памяти. Итак, если я снова запустил свою программу, я получаю ту же кучу фактов, добавленных в «listofQuestions».Prolog - Как утвердить/сделать базу данных только один раз

Я только хочу иметь один набор данных.

Thankyou

+0

попробуйте использовать если-то-иначе встроенный предикат '(listofQuestions (P, Q) -> Истинные; утверждают (listofQuestions (P, Q))) ' –

+0

, который работает в порядке. Но то, что я хотел бы, это новый пустой список «QuoQuestions» каждый раз, когда я буду называть свое правило. Это происходит только в том случае, если я перезапускаю пролог. Любая помощь? – HungryCoder

ответ

1

Может быть сделать retractall/1, прежде чем повторно запустить программу.

+0

Большое спасибо. Впоследствии у меня было предложение retractall. Но, прочитав ваш комментарий, я поставил его на одну строку раньше. И это работает как персик! xD – HungryCoder

2

Сделайте отдельный предикат для утверждения, который проверяет, если факт еще не утверждал:

assertThisFact(Fact):- 
    \+(Fact),!,   % \+ is a NOT operator. 
    assert(Fact). 
assertThisFact(_). 
+0

Мне нравится этот ответ. Является ли эта концепция пуленепробиваемой? Как насчет этого 'не', это' swi-prolog' совместимый? –

+0

Альтернативно, в одном предложении и без отрицания: 'assert_once (факт): - (факт,! ; assertz (факт)) .' –

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