Преобразование базы данных в факты в Прологе - PullRequest
0 голосов
/ 24 января 2019

Итак, у меня есть база данных, которая выглядит примерно так:

DB = [
    data([table, keyboard,cup, box,watch]),
    data([green,red, yellow,white,blue]),
    data([alex, john,sasha,  sabrina,  ben]),
    data([coffee, tea,  syrup,  vodka, beer]),
    data([bookA, bookB, bookC, bookD, bookE])
]

Я бы хотел сохранить DB как факт. Затем мы должны создать отношение db_to_facts, которое находит все факты.

Пример:

data([true, false]).
data([dog,cat]).

Выход:

db_to_facts(DB).
DB = [data([true, false]), data([dog, cat])].

Каким был бы самый чистый способ достичь этого?

Edit:

Мне кажется, я понял:

db_to_facts(L) :- findall(data(X),data(X),L).

Но если база данных пуста, она потерпит неудачу. Как сделать так, чтобы он возвращал пустой список?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Конечно, использование dynamic(data/1) - лучший способ. Просто чтобы сообщить вам, есть еще один способ проверить, существует ли data/1. Вы можете использовать current_predicate/2 следующим образом:

db_to_facts(L):-
    ( current_predicate(data,_) -> findall(data(X),data(X),L) ; L = []).

Если вы скомпилируете его (вы не можете использовать swish онлайн, он дает No permission to call sandboxed ...), вы получите предупреждение о том, что вы должны определить data/1, но если вы все равно выполните запрос, вы получите пустой список:

?- db_to_facts(L).
L = [].

Это не самый чистый способ, но он работает:)

0 голосов
/ 24 января 2019

В начале вашей программы Prolog используйте директиву dynamic(data/1).. Это говорит Prolog, что у вас есть динамическая база данных, которая может со временем меняться и все равно распознает запрос data(X), даже если данных нет.

Без директивы:

1 ?- data(X).
ERROR: Undefined procedure: data/1 (DWIM could not correct goal)
2 ?-

С директивой:

2 ?- dynamic(data/1).
true.

3 ?- data(X).
false.

И тогда ваш findall/3 вызов даст [], если нет данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...