2011-09-24 46 views
1

我在prolog中遇到了一個簡單的問題。 讓我們考慮的方案swi-prolog中的「NOT EXISTS」

worker(bill). 
worker(smitt). 
worker(fred). 
worker(dany). 
worker(john). 
car(bmw). 
car(mazda). 
car(audi). 
owner(fred,mazda). 
owner(dany,bmw). 
owner(john,audi). 

我需要添加更多的謂詞no_car(X),這將是真實的,如果作業者X沒有汽車,也就是,如果我們輸入一個查詢 : - no_car(X )。 序言應該回答

X=smitt, 
X=bill, 
yes 

我所做的是

hascar(X):-owner(X,_). 
    nocar(X):- worker(X),not hascar(X). 

但這種方法是行不通的,因爲anonimous變量只能用於查詢avaliable。 所以,我真的堅持這一點。 我知道SQL中有「NOT EXISTS」字樣,它允許在查詢中表達這個邏輯,但是在序言中有沒有類似於它們的東西?

+0

如果您使用\ +而不是使用\ +,則它與匿名變量無關。 –

回答

5

我下面的作品,並提供預期的結果:

no_car(W):- 
    worker(W), 
    \+ owner(W, _). 

現在,這是接近你所擁有的。首先,你可以當然使用_謂詞;它不限於查詢。我通常使用\*否定,而not在這裏給我一個語法錯誤!?

編輯:

啊!在我的,雖然過時的Prolog版本中,您必須使用not(hascar(X))才能使其正常工作,因此不需要將/ 1用作術語,而不是操作員。但該手冊還說not已棄用\+

+0

謝謝!不(hascar(X))正常工作。使用其他版本的prolog後,看起來很奇怪,我沒有想到要檢查它。 –