A tupla de cálculo:não tem certeza se o meu raciocínio está correto
-
29-09-2020 - |
Pergunta
Eu estou atualmente trabalhando através de uma tupla de cálculo pergunta e eu corri em uma situação onde eu tenho duas respostas que parecem corretas para mim, e eu não tenho certeza se a minha lógica é errado, ou se ambos são respostas correctas (e se assim for, é mais correto que o outro).
Eu estou tentando encontrar o sid da loja, que fornece a cada item.Os esquemas são:
Stores(sid: integer, sname: string)
Items(iid: integer, iname: string)
Supplies(sid: integer, iid: integer, price: integer)
O que me ocorreu foi:
{ P | ∃ S1 ∈ Supplies(P.sid = S1.sid ∧ ∀ i ∈ Items(∃ S2 ∈ Supplies (S2.iid = i.iid ∧ S2.sid = S1.sid)))}
{ P | ∃ S1 ∈ Supplies(P.sid = S1.sid ∧ ∀ i ∈ Items(S1.iid = i.iid))}
Meu raciocínio é que eu estou olhando para o sid, onde para todos os Itens há uma entrada de Suprimentos tabela que corresponde à iid.A única diferença real entre as minhas respostas é que a segunda não usar uma segunda separado Suprimentos tabela que nos permite cortar o adicional S2.sid = S1.sid
.O meu texto tem uma pergunta semelhante a este e tem uma resposta semelhante a 1, mas o meu raciocínio me leva a segunda resposta.
Solução
Responder
Eu vou mudar o nome de suas tabelas um pouco:
Store(s) -- store [s.sid] has name [s.sname]
Item(i) -- item [i.iid] has name [i.iname]
Offer(o) -- store [o.sid] offers item [o.iid] for $[o.price]
Você deseja que a tupla(s) do (s) formulário < sid > onde
-- store s.sid offers every item, ie
-- for all Items i: store s.sid offers item i.iid, ie
-- for all Items i: there exists Offer o: [o.sid = s.sid ∧ o.iid = i.iid], ie
∀ i ∈ Items ∃ o ∈ Offer [o.sid = s.sid ∧ o.iid = i.iid]
A consulta de tais lojas-e pode haver mais do que uma loja-é:
{ s : < sid > | ∀ i ∈ Items ∃ o ∈ Offer [o.sid = s.sid ∧ o.iid = i.iid] }
Sua resposta 2
Eu estou olhando para o sid, onde para todos os Itens há uma entrada de Suprimentos tabela que corresponde à iid.
Que tem um ""para todos os que não-existe", assim como a minha solução.Mas sua proposta de resposta 2 tem um "não-existe, por que e para todos":
{ P | ∃ S1 ∈ Supplies( P.sid = S1.sid ∧ ∀ i ∈ Items(S1.iid = i.iid) )}
Que pede para tuplas P onde há uma oferta S1, onde [P sid é S1 sid e para todos os Itens S1 s iid é que o item iid].Eu espero que você pode ver que esta envolve um único iid sendo o mesmo que todos os queridos no Item, não o que você deseja.
Sua resposta 1
{ P | ∃ o ∈ Offer ( P.sid = o.sid ∧ ∀ i ∈ Item (∃ o2 ∈ Offer (o2.iid = i.iid ∧ o2.sid = o.sid)) )}
Observe acima que a ∀ ...
significa store o.sid offers every item
.Assim:
{ P | ∃ o ∈ Offer (P.sid = o.sid
∧ store o.sid offers every item )
)}
Se não há ofertas e algumas lojas, depois, em cada loja oferece a cada item.Mas como não existem ofertas, é falso que ∃ o ∈ Offer (P.sid = o.sid))
.Não Ps fazer o que é verdade.Portanto, este é {}.Portanto, esta não é a resposta.
(A sua resposta 1 pode ser modificado a partir de um livro de texto de resposta expressa por Codd original relacionais operador de divisão.Mas então, dividindo Oferece por Itens, na verdade, não retornam tuplas s onde store s.sid offers every item
.Ele retorna linhas onde store s.sid offers every item AND there is at least one item
.Então, a resposta é não expressa por Ofertas/Itens.)
(Na verdade 2 tem um extra ∃ em comparação com a sua natural linguagem de descrição e a minha resposta, mas é a exterior ∃.Assim, a solução 1 é dessa forma que lembra a resposta correta.)