2009-11-12 95 views
2

在Prolog你可以寫一個地面事實爲:在Prolog中使用非基礎事實?

lost(jen). 

你也可以寫一個非地面的事實爲:

lost(X). 

這是否使任何意義?你能告訴我一個實際/真實的例子,其中使用了非基礎事實嗎?

感謝,

回答

3

另一種避免列表的情況是大多數情況是「真實的」,而您只是想排除一些錯誤的情況。所以你故意不通過案件,然後讓其他一切都通過。

然後你就可以做,說...

inhabited(antarctica) :- !, fail. 

% all the other continents are inhabited 
inhabited(_). 
2

好了,你可以在事實以外的事情除了原子,例如,你可以有名單。一旦你做到了這一點,你可能想知道一個元素的列表,你可以有

oneelement([X]). 

同樣,說你要比較的是在一個列表

lastelement([X],X). 
lastelement([_|Remainder],X) :- lastelement(Remainder,X). 
的最後一個元素

非常有用member謂詞被定義爲

member([X|_],X). 
member([_|Remainder],X) :- member(Remainder,X). 

每個這些使用非接地事實作爲基礎的情況下,通過匹配的一種特殊形式,它比只是更具體210

+0

我只想做一個備註,如果你會使用一個變量子句中只有1次(不2種或更多用法),序言(特別是SWI)會給你varning,就像「Warning:/path/to/file.pro:123: Singleton variables:[Var]」 你應該在這些地方使用_。 – Xonix 2009-11-12 22:22:10

+0

@Xonix:或者只是用這樣的下劃線作爲現有名稱的前綴:'_Foobar'。這樣可以避免單身人士的警告,同時讓你使用一個解釋性的名字。 – bcat 2009-11-14 23:45:49

+0

@Xonix:在(Sicstus)Prolog中,您還必須確保_後的字母是大寫字母(如變量名稱)以避免警告。 – Rune 2014-05-11 10:07:54