2016-02-29 71 views
0

我在Prolog中擁有此數據庫,並且我試圖返回Henry擁有的以及誰擁有一輛汽車和一輛卡車。我嘗試了所有我能想到的方式來歸還亨利擁有的東西,並找不到解決方案。我知道如何歸還誰擁有一輛汽車或一輛卡車 - 擁有(X,汽車(,,_)),但不是在同一時間。任何幫助將不勝感激。瞭解如何在Prolog中使用arg/3和univ/2

owns(bill, car(ford, mustang, 1964)). 
owns(sue, car(pontiac, gto, 1967)). 
owns(george, car(honda, civic, 2013)). 
owns(betty, truck(ford, f150, 2013)). 
owns(henry, motorcycle(honda, goldwing, 2010)). 
+0

'findall/3'如何?喜歡這個; (所有者,擁有者(所有者,汽車(_,_,_)),所有者).' – findall

+0

' - 擁有(henry,X)。' - 現在'X'是'henry'擁有的。 –

回答

4

prolog有一個關係數據模型,但允許遞歸術語而不是像atom這樣的atomics,並且不給'columns'命名。鬆散:

 
╒═════════════╤═════════════╕ 
│ SQL   │ Prolog  │ 
╞═════════════╪═════════════╡ 
│ table  │ predicate │ 
│ record  │ clause  │ 
│ table name │ functor  │ 
│ column  │ argument │ 
╘═════════════╧═════════════╛ 

因此,需要關於屬性位置的知識。通常情況下,我們可以關聯函數中的屬性'名稱:

% get an owner of any kind listed 
kinds_owner(Kinds, Owner) :- 
    owns(Owner, Object), Object =.. [Kind|_], member(Kind, Kinds). 

% get owners of any kind listed 
kinds_owners(Kinds, Owners) :- 
    setof(Owner, kinds_owner(Kinds, Owner), Owners). 

?- kinds_owner([truck,motorcycle],X). 
X = betty ; 
X = henry. 

?- kinds_owners([truck,motorcycle],Xs). 
Xs = [betty, henry]. 
+2

┼1這個漂亮的桌子! – false

+0

@CapelliC prolog的DB的限制在哪裏?如果沒有,包括一個SQL數據庫或使用內部數據庫的優雅方式是什麼? –

+0

@AnsPiter:限制:它在內存中......最優雅的界面......我會說[datalog](http://www.fdi.ucm.es/profesor/fernan/DES/),但它是一個實際的語言本身,所以很多學習... – CapelliC