2017-09-30 92 views
1

我在使用SWI-Prolog中的round/1floor/1內置插件時遇到問題。在我的代碼中使用它們時,它們無法識別,並在提交它們作爲查詢時;例如?- round(1.6).,Prolog會告訴我該程序不被識別。難道我做錯了什麼?我在線上Swish版本和我自己的Windows安裝版本上都試過了,但是在兩者上都得到相同的錯誤。爲什麼Prolog不能識別這些內置函數?

回答

1

round/1floor/1沒有內置謂詞,round/2floor/2

Prolog使用謂詞。這意味着謂詞只能是truefalse(或錯誤)。此外,它可以統一變量(更多)。

因此,計算floor爲1.6的唯一方法是使用兩個變量,並使第二個變量位於第一個變量的底部。例如:

?- round(1.6,X). 
X = 2. 

?- floor(1.6,X). 
X = 1. 

因爲用這種方式編寫謂詞有時很麻煩。 Prolog定義了一些函子,這些函數可以用is/2謂詞解釋。 round/1floor/1是仿函數與在is/2謂詞語義:

?- X is round(1.6). 
X = 2. 

?- X is floor(1.6). 
X = 1. 

is可以用更高級的表達式樹工作,以及像:

?- X is floor(0.4+0.4+0.4). 
X = 1. 

但是請注意,is實際上是謂也。我們已經寫:

is(X, floor(0.4+0.4+0.4)). 

窗簾後面,is/2斷言將調用floor/2。但是請注意,你不能簡單地通過這種方式注入自己的謂詞。您不能簡單地寫is(X, foo(2))並期望Prolog撥打foo(2.X)

+1

*由於以這種方式編寫謂詞有時很麻煩,您也可以將它寫爲:... *我會在這裏小心。你可能會留下這樣的印象:表達式的任何謂詞'functor(...,X)'也可以表示爲'X是函數(...)',這顯然不是普遍適用的。它表明任何謂詞都有一個功能形式。對於所有的算術函數也並非總是如此。例如,你可以寫'X is min(2,3).'並得到'X = 2'。但'min(2,3,X)'失敗,因爲'min/3'不存在。 – lurker

+0

@lurker:已更新。更好? –

+1

我認爲* functor *的定義太具體。對於帶有參數的形式「foo(...)」的術語,「foo」被稱爲* functor *。它不是特定於算術函數。我可能會說Prolog中的某些內置謂詞是*算術函數*,因此可以與'is/2'以及其他算術運算符(*例如*,'>/2')一起使用。我不確定我會說替代形式是因爲另一種形式是「繁瑣的」(它們都是大致相同的打字量)。他們只是替代品。一個被明確用作算術函數。其他不是。 – lurker

相關問題