2016-02-29 36 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