-
41. Data: 2014-05-28 00:02:52
Temat: Re: Prolog i hierarchiczna baza faktów
Od: Edek <e...@g...com>
Dodam, że chętnie pogrzebię w literaturze i podzielę się tym co znajdę,
temat mnie i tak interesuje, ale przydałaby się precyzyjna definicja
problemu, z kompletnymi przykładami. Jeżeli nie są tajne oczywiście.
--
Edek
-
42. Data: 2014-05-28 00:13:36
Temat: Re: Prolog i hierarchiczna baza faktów
Od: Edek <e...@g...com>
Szarym od mżawki świtem Sun, 25 May 2014 15:00:03 +0100, Andrzej Jarzabek
wyrzucił pustą ćwiartkę i oznajmił:
> On 25/05/2014 03:27, A.L. wrote:
>> On Sun, 25 May 2014 01:58:13 +0100, Andrzej Jarzabek
>> <a...@g...com> wrote:
>>> On 24/05/2014 22:43, Sebastian Biały wrote:
>>>> On 2014-05-24 19:09, A.L. wrote:
>>>>> jakiego rodzaju to sa zapytania (przykaldy).
>>>> "Kto mieszka na ulicy X i ma blond włosy".
>>> Do takich zapytań świetnie nadaje się SQL.
>>
>> Owszem, ale nie wszystko da sie zalatwic przy pomocy SQL.
>
> Chodziło mi o to, że jeśli SQL się nie nadaje, to powinno się myśleć i
> podawać przykłady zapytań, do których SQL się nie nadaje.
NoSQL tak samo się nie nadaje jak SQL, ale to zależy.
Bottom line, można za pomocą bazy stworzyć graf i adekwatnie
tworzyć cząstkowe zapytania -
samo SQL jak ktoś zauważył nie ma takich możliwości, co
nie znaczy, że bazy nie da się użyć. Zostają pytania o
wydajność i wygodę. W ogóle, zależnie od problemu możemy
mieć graf (dwie tabele: sam graf i tabela "rodzajów") albo
wiele tabel (stała struktura rodzajów relacji, żeby zrobić
to co sugerowane, czyli "where a.ulica = x and włosy = blond
order by neigbourhood_distance").
Tak czy inaczej: SQL + kod, nie samo SQL. SQL dostarcza relacji
i często wydajnych operacji Boolean na zbiorach wyników,
NoSQL nie ale takie Mongo potrafi wykonać JS na serwerze.
Zależnie od problemu, albo mamy gotowe relacje i da się, albo
mamy graf i baza jest nieco nadmiarowa.
--
Edek
-
43. Data: 2014-05-28 02:57:26
Temat: Re: Prolog i hierarchiczna baza faktów
Od: A.L. <a...@a...com>
On Tue, 27 May 2014 21:52:30 +0000 (UTC), Edek
<e...@g...com> wrote:
>Szarym od mżawki świtem Thu, 22 May 2014 21:48:04 +0200, Sebastian Biały
>wyrzucił pustą ćwiartkę i oznajmił:
>
>> Mam takie zagadnienie abstrakcyjne.
>
>Nie ty pierwszy - poczytaj zanim się zabierzesz do tematu.
>Oprogramowanie potrafiące "przeczytać" książkę w miarę techniczną
>potrafiło zbudować bazę faktów i na jej podstawie odpowiadać
>na proste pytania przed albo około 2000,
We wczesnych latach 80. Wspomniany przeze mnie Cullingford wlasnie
wtedy sbudowal system ktory potrafil czytac historyjki polityczne z
New York Times, pzretranslowac na baze wiezy i odpowiadac na dosyc
zlozone pytania na ich temat.
Link do artykulu zamiescilem
Bardziej prymitwmy system zrobil niejaki Fisher Black, w roku chyba
1968. Bez analizy jezyka naturalnego, ale za to z projektem bazu
wiedzy ktore (jak sadze) byla natchnieniem dla Cullingorda
A.L..
-
44. Data: 2014-05-28 03:05:32
Temat: Re: Prolog i hierarchiczna baza faktów
Od: A.L. <a...@a...com>
On Tue, 27 May 2014 22:02:52 +0000 (UTC), Edek
<e...@g...com> wrote:
>Dodam, że chętnie pogrzebię w literaturze i podzielę się tym co znajdę,
>temat mnie i tak interesuje, ale przydałaby się precyzyjna definicja
>problemu, z kompletnymi przykładami. Jeżeli nie są tajne oczywiście.
Owszem, popieram. Definicja problemu jest bardzo "rozmyta"
A.L.
-
45. Data: 2014-05-28 08:23:42
Temat: Re: Prolog i hierarchiczna baza faktów
Od: Roman W <b...@g...pl>
On Tue, 27 May 2014 19:57:26 -0500, A.L. <a...@a...com> wrote:
> Bardziej prymitwmy system zrobil niejaki Fisher Black, w roku chyba
> 1968. Bez analizy jezyka naturalnego, ale za to z projektem bazu
> wiedzy ktore (jak sadze) byla natchnieniem dla Cullingorda
Chyba nie ten Fisher Black od modelu Blacka-Scholesa?
RW
-
46. Data: 2014-05-28 09:20:44
Temat: Re: Prolog i hierarchiczna baza faktów
Od: Andrzej Jarzabek <a...@g...com>
On 27/05/2014 23:13, Edek wrote:
> Szarym od mżawki świtem Sun, 25 May 2014 15:00:03 +0100, Andrzej Jarzabek
> wyrzucił pustą ćwiartkę i oznajmił:
>
>> Chodziło mi o to, że jeśli SQL się nie nadaje, to powinno się myśleć i
>> podawać przykłady zapytań, do których SQL się nie nadaje.
>
> NoSQL tak samo się nie nadaje jak SQL, ale to zależy.
Coś przegapiłem, czy jednak NoSQL nie jest językiem zapytań do bazy?
-
47. Data: 2014-05-28 14:41:08
Temat: Re: Prolog i hierarchiczna baza faktów
Od: A.L. <a...@a...com>
On Wed, 28 May 2014 07:23:42 +0100, Roman W
<b...@g...pl> wrote:
>On Tue, 27 May 2014 19:57:26 -0500, A.L. <a...@a...com> wrote:
>> Bardziej prymitwmy system zrobil niejaki Fisher Black, w roku chyba
>> 1968. Bez analizy jezyka naturalnego, ale za to z projektem bazu
>> wiedzy ktore (jak sadze) byla natchnieniem dla Cullingorda
>
>Chyba nie ten Fisher Black od modelu Blacka-Scholesa?
>
>RW
Zupelnie inny. I calkiem dzis zapomniany
A.L.
-
48. Data: 2014-05-28 20:35:23
Temat: Re: Prolog i hierarchiczna baza faktów
Od: Sebastian Biały <h...@p...onet.pl>
On 2014-05-27 23:52, Edek wrote:
> Nie ty pierwszy - poczytaj zanim się zabierzesz do tematu.
> Oprogramowanie potrafiące "przeczytać" książkę w miarę techniczną
Nie analizuje języka naturalnego.
> Hierarchiczną? Czy punkt a jest b czy b nad a i dlaczego?
Ponieważ niezygle czesto wystepują tam zalezności "coś jest wewnątrz
czegoś". Z programowania to oznacza częste relacje parent<->child
wyrażone z relacji między obiektami w pamięci. Myślę że to dość istotna
obsewacja.
> Sformułuj
> najpierw problem. Nie ja jedyny chętnie bym zobaczył drobny przykład,
> albo kilka, które pokazywałyby w czym jest problem.
To nie jest trywialne. Rzeczywisty problem jest - powiedzmy - komercyjny
i nie bardzo mogę go przedstawić w naturalnej postaci.
> Domena nie gra
> roli, może być "jakie kfiatki rosną nad rzeczką w której pływał
> pstrąg którego zjadł złodziej kradnąc go z marketu".
Sprawdze czy mogę przygotowac probkę danych.
> - to jest graf. Nie chce mi się uzasadniać.
Zgadzam sie, jednak przypuszczam że sensowniej będzie powiedzieć: to
wiele grafów, niekoniecznie zaleznych od siebie, pracujące na wspólnych
węzłach.
> - nie widzę hierarchii
"hierarchia" oznacza że mam taką strukture wejściową w formie relacji
elementów wlasnie tak zapisaną (dla bardzo ciekawskich: obiekty w C++
mające "iteratory na dzieci", oraz relacje przez indeksy w mapach). Mogę
ją przekształcić do dowolnej postaci oczywiście.
> Sam SQL nie, ale tak w kwestii technicznej zacząłbym (co już było) od
> pytania "co trzeba zrobić i jak" a potem wybrał narzędzia. Może SQL,
> który sam w sobie nie ma takich możliwości, da się użyć tworząc serię
> zapytań a wtedy podstawową strukturę grafu ma się za free. Pytanie
> też ile tych danych jest i czy trzeba trzymać je na dysku. Czyli aspekty
> techniczne, w tym kopanie się z koniem Prologiem, którego się nie zna.
Danych jest *bardzo* dużo, powiedzmy ze zajmuja solidne gigabajty w
pamięci. Jednak relacji nie ma za wiele, w dodatku mają taką cechę że
raczej układają się w gęste grupy powiązane dość luźno między sobą.
Istnieje widoczne lokalne zagęszczenie.
> Jeżeli nauczenie się Prologu zajmuje 12-18 miesięcy do tego przeczytanie
> książki, pytanie jest: czy problem jest na tyle rozbudowany, żeby poświęcać
> na niego tyle czasu. Drugie: nawet jeżeli tak, to czy nie lepiej odpuścić
> Prolog i zaimplementować struktury danych i algorytmy samemu z pomocą
> dostępnych bibliotek, a czas poświęcić na przeszukanie dostępnych źródeł
> wiedzy na temat problemu.
Szukam metod wielowątkowo. Z mojej strony zrobiłem już pewne fragmenty w
C++ (oryginalne struktury pamięciowe są w nim wlasnie), w javascripcie,
zrzuciłem do standardowej bazy danych SQL. Te etapy mam wstepnie za
sobą. Przy czym *bardzo* istotny element to wlasnie umozliwienie
koncowemu userowi grzebanie w "zapytaniach".
> Niestety nie znam dostępnej literatury, ale google scholar wypluwa
> po kilkadziesiąć tysi publikacji, trzeba poświęcić trochę czasu na
> dospracowanie zapytań, wybrać przeglądowe prace na początek, albo
> dać konkretny przykład Panu A.L.
Zgadza się, wiele przeszukałem sieci zanim zadałem pytanie, ale utopiłem
się w ilości zagadnień o ktorych mam nikłe pojęcie. Interesuje mnie
głównie filtr który pozwoli mi zawężyć zakres literatury. Przypuszczam
że prologowcy mają o tym największe pojęcie.
> Powiedz od razu, że chcesz się nauczyć Prologa
Nie chcę :). Ale mam wrażenie, że ten język będzie po prostu godny uwagi
w tym zastosowaniu.
>, po co zarzucasz jakiś
> abstrakcyjny temat... żartuję, ale może najpierw problem potem narzędzie.
Problem już został wstepnie rozwiązany w C++ i tam mam najbardziej
rozbudowane "zapytania" eksperymentalne. Niestety wygląd kodu ukrywa
intencje (więcej emulacji logiki niż sensu zapytania). Chcę zrobić
eksperyment z językiem zorientowanym logicznie aby sprawdzić czy będzie
bardziej czytelny. Nie jestem tez zadowolony z mojej "bazy danych" i mam
przeczucie że zmiene jej organizacji może coś pomóc. Tu muszę szeroko
poczytać o innych organizacjach baz danych.
Nie jestem ograniczony czasowo.
-
49. Data: 2014-05-28 23:54:36
Temat: Re: Prolog i hierarchiczna baza faktów
Od: Andrzej Jarzabek <a...@g...com>
On 28/05/2014 19:35, Sebastian Biały wrote:
> On 2014-05-27 23:52, Edek wrote:
>
>> Hierarchiczną? Czy punkt a jest b czy b nad a i dlaczego?
>
> Ponieważ niezygle czesto wystepują tam zalezności "coś jest wewnątrz
> czegoś". Z programowania to oznacza częste relacje parent<->child
> wyrażone z relacji między obiektami w pamięci. Myślę że to dość istotna
> obsewacja.
Rozumiem, że chodzi ci o możliwość definiowania w języku zapytań reguł
typu "jeśli a jest wewnątrz b a b jest wewnątrz c, to a jest rónież
wewnątrz c?
> Danych jest *bardzo* dużo, powiedzmy ze zajmuja solidne gigabajty w
> pamięci. Jednak relacji nie ma za wiele,
Co rozumiesz przez "relację"? Chodzi o to, że rodzajów powiązań między
danymi jest niewiele?
Generalnie nie znam się zbyt dobrze, ale z wykorzystaniem Prologa do
przeczesywania dużej ilości danych może być problem.
Ja bym rozważył możliwość zembedowania jakiegoś języka skryptowego,
który ci będzie łatwo zintegrować (np. ten twój JavaScript czy Python) i
wystawienia mu API. W dowolnym języku Turing complete możesz wtedy
napisać dowolne zapytania (nawet jeśli ich wyrażenie nie będzie zbyt
eleganckie). W miarę identyfikacji typowych wzorców zapytań możesz
zrefaktoryzować swoje zapytania w bibliotekę/framework i efektywnie
stworzyć DSL-a osadzonego w wybranym języku.
> Problem już został wstepnie rozwiązany w C++ i tam mam najbardziej
> rozbudowane "zapytania" eksperymentalne. Niestety wygląd kodu ukrywa
> intencje (więcej emulacji logiki niż sensu zapytania).
C++, zwłaszcza C++11 jest dość ekspresywny, powinieneś móc zdefiniować
infrastrukturę tak, żeby "emulację logiki" poukrywać w klasach,
funkcjach, ostatecznie makrach - przy odpowiedniej bibliotece powinieneś
mieć czytelny sens zapytania z dodatkowym bonusem w postaci type safety.
Oczywiście nadal pozostaje ci problem taki, że jak masz mieć język
zapytań w C++ to musisz w swoją aplikację wbudować kompilator (albo
kazać użytkownikowi kompilować te zapytania samodzielnie), plus gdybyś
chciał je uruchamiać po stronie serwera to zabezpieczenie aplikacji jest
znacznie trudniejsze - tak więc C++ niekoniecznie jest dobrym pomysłem
tak czy inaczej.
> Chcę zrobić
> eksperyment z językiem zorientowanym logicznie aby sprawdzić czy będzie
> bardziej czytelny. Nie jestem tez zadowolony z mojej "bazy danych" i mam
> przeczucie że zmiene jej organizacji może coś pomóc. Tu muszę szeroko
> poczytać o innych organizacjach baz danych.
Może wrzuć w relacyjną?
-
50. Data: 2014-05-29 01:36:21
Temat: Re: Prolog i hierarchiczna baza faktów
Od: A.L. <a...@a...com>
On Wed, 28 May 2014 20:35:23 +0200, Sebastian Bia?y
<h...@p...onet.pl> wrote:
>On 2014-05-27 23:52, Edek wrote:
>> Nie ty pierwszy - poczytaj zanim się zabierzesz do tematu.
>> Oprogramowanie potrafiące "przeczytać" książkę w miarę techniczną
>
>Nie analizuje języka naturalnego.
>
>> Hierarchiczną? Czy punkt a jest b czy b nad a i dlaczego?
>
>Ponieważ niezygle czesto wystepują tam zalezności "coś jest wewnątrz
>czegoś". Z programowania to oznacza częste relacje parent<->child
>wyrażone z relacji między obiektami w pamięci. Myślę że to dość istotna
>obsewacja.
Moze cie natchnie co prolog moze. To kalsyczny przykald bazy wiedzy, a
pytanie brzmi: kto jest wlascicielem zebry?
1. The Englishman lives in the red house.
2. The Spaniard owns the dog.
3. Coffee is drunk in the green house.
4. The Ukrainian drinks tea.
5. The green house is immediately to the right of the ivory house.
6. The Porsche driver owns snails.
7. The Masserati is driven by the man who lives in the yellow house.
8. Milk is drunk in the middle house.
9. The Norwegian lives in the first house on the left.
10. The man who drives a Saab lives in the house next to the man
with the fox.
11. The Masserati is driven by the man in the house next to the
house where the horse is kept.
12. The Honda driver drinks orange juice.
13. The Japanese drives a Jaguar.
14. The Norwegian lives next to the blue house.
To, jak mie sie wydaje, troche podobne do teojej bazy faktow. A to
ejst program w Prologu. Uzywa prologu zwanego SICStus
Daje taka odpowiedz:
Q: zebra(S).
A: S = [[yellow,norwegian,masserati,water,fox],
[blue,ukranian,saab,tea,horse],
[red,english,porsche,milk,snails],
[ivory,spanish,honda,orange,dog],
[green,japanese,jaguar,coffee,zebra]].
Mzoe jednak warto sprobowac z Prologiem?...
A tu caly program
/*
zebra.pl: Based on the classic zebra puzzle
(C) Pieter Valcke, 2003-2004
(C) Tom.Schrijvers at cs.kuleuven.be, 2003-2004
This program is distributed under the terms of the GNU General Public
License:
http://www.gnu.org/licenses/gpl.html
%% DESCRIPTION
Solves the classic "zebra puzzle" a.k.a. "Einstein's Riddle"
(cf. http://en.wikipedia.org/wiki/Zebra_Puzzle):
1. The Englishman lives in the red house.
2. The Spaniard owns the dog.
3. Coffee is drunk in the green house.
4. The Ukrainian drinks tea.
5. The green house is immediately to the right of the ivory house.
6. The Porsche driver owns snails.
7. The Masserati is driven by the man who lives in the yellow house.
8. Milk is drunk in the middle house.
9. The Norwegian lives in the first house on the left.
10. The man who drives a Saab lives in the house next to the man
with the fox.
11. The Masserati is driven by the man in the house next to the
house where the horse is kept.
12. The Honda driver drinks orange juice.
13. The Japanese drives a Jaguar.
14. The Norwegian lives next to the blue house.
%% HOW TO USE
zebra(S) returns the solution in a 5x5-matrix, one row for each
person:
S = [ [HouseColor1, Nationality1, Car1, Drink1, Pet1],
[ ... ], ... ]
%% SAMPLE QUERIES
Q: zebra(S).
A: S = [[yellow,norwegian,masserati,water,fox],
[blue,ukranian,saab,tea,horse],
[red,english,porsche,milk,snails],
[ivory,spanish,honda,orange,dog],
[green,japanese,jaguar,coffee,zebra]].
*/
:- module(zebra,[zebra/1]).
:- use_module(library(chr)).
:- use_module(library(lists)).
%% Deprecated syntax used for SICStus 3.x
%handler zebra.
%constraints domain/2, diff/2.
%% Syntax for SWI / SICStus 4.x
:- chr_constraint domain/2, diff/2.
domain(_,[]) <=> fail.
domain(X,[V]) <=> X = V.
domain(X,L) <=> nonvar(X) | member(X,L).
diff(X,Y) <=> nonvar(X), nonvar(Y) | X \== Y.
diff(Y,X) \ domain(X,L) <=> nonvar(Y), select(Y,L,NL) | domain(X,NL).
diff(X,Y) \ domain(X,L) <=> nonvar(Y), select(Y,L,NL) | domain(X,NL).
% all_different(L,E) enforces that each element of L is different to E
all_different([],_).
all_different([H|T],E) :-
diff(H,E),
all_different(T,E).
% make_domain(L,D) enforces for each element E of L:
% E is from domain D and different to each other element from L
make_domain([],_).
make_domain([X|L],D) :- all_different(L,X), domain(X,D),
make_domain(L,D).
% left_right(L, R, X) is true when L is to the immediate left of R in
list X
left_right(L, R, List) :- append(_, [L,R|_], List).
% next_to(X, Y, L) is true when X and Y are next to each other in list
L
next_to(X, Y, L) :- left_right(X, Y, L).
next_to(X, Y, L) :- left_right(Y, X, L).
% solves the zebra puzzle and returns solution in S
zebra(S) :-
[ [ ACo, AN, ACa, AD, AP ],
[ BCo, BN, BCa, BD, BP ],
[ CCo, CN, CCa, CD, CP ],
[ DCo, DN, DCa, DD, DP ],
[ ECo, EN, ECa, ED, EP ] ] = S,
make_domain([ACo,BCo,CCo,DCo,ECo], [red,green,ivory,yellow,blue]),
make_domain([AN, BN, CN, DN, EN ],
[english,spanish,ukranian,norwegian,japanese]),
make_domain([ACa,BCa,CCa,DCa,ECa],
[porsche,masserati,saab,honda,jaguar]),
make_domain([AD, BD, CD, DD, ED ],
[coffee,tea,milk,orange,water]),
make_domain([AP, BP, CP, DP, EP ], [dog,snails,fox,horse,zebra]),
[_,_,[_,_,_,milk,_],_,_] = S, % clue 8
[[_,norwegian,_,_,_],_,_,_,_] = S, % clue 9
member( [green,_,_,coffee,_], S), % clue 3
member( [red,english,_,_,_], S), % clue 1
member( [_,ukranian,_,tea,_], S), % clue 4
member( [yellow,_,masserati,_,_], S), % clue 7
member( [_,_,honda,orange,_], S), % clue 12
member( [_,japanese,jaguar,_,_], S), % clue 13
member( [_,spanish,_,_,dog], S), % clue 2
member( [_,_,porsche,_,snails], S), % clue 6
left_right( [ivory,_,_,_,_], [green,_,_,_,_], S), % clue 5
next_to( [_,norwegian,_,_,_],[blue,_,_,_,_], S), % clue 14
next_to( [_,_,masserati,_,_],[_,_,_,_,horse], S), % clue 11
next_to( [_,_,saab,_,_], [_,_,_,_,fox], S). % clue 10