2016-07-07 63 views
0

這裏,有沒有隨着時間進入。 我想下面的代碼來找出哪些是最後一個條目:得到或給予?在Prolog中查找最後一個條目

got(1). 
gave(2). 
got(3). 
gave(4). 
got(5). 
gave(6). 
got(7). 

isLastGot():- 
    findall(G, Got(G), Lg), 
    findall(A, Gave(A), La), 
    Lgg is lastElement(Lg), 
    Laa is lastElement(La), 
    Lgg > Laa. 

lastElement([H|T],A):-lastElement([T],A). 
lastElement([A],A). 

但它不工作:

?- isLastGot(). 
ERROR: functor/3: Domain error: `compound_non_zero_arity' expected, found `isLastGot()' 
?- isLastGot. 
ERROR: toplevel: Undefined procedure: isLastGot/0 (DWIM could not correct goal) 
?- 

問題出在哪裏以及如何可以把它糾正?

編輯:如果我用下面,我得到的錯誤上載:

isLastGot:- 
    findall(G, Got(G), Lg), 
    findall(A, Gave(A), La), 
    Lgg is lastElement(Lg), 
    Laa is lastElement(La), 
    Lgg > Laa. 

錯誤:... /gotgave.pl:11:14:語法錯誤:操作員預計 也有許多的警告作者:got/1的條款不在源文件中 (類似的警告也爲給/ 1)

該文件未加載。

即使把所有的GOT和所有給了一起,雖然警告和錯誤都走了,主運行時錯誤仍然堅持後:

1 ?- isLastGot. 
ERROR: toplevel: Undefined procedure: isLastGot/0 (DWIM could not correct goal) 
2 ?- isLastGot(). 
ERROR: functor/3: Domain error: `compound_non_zero_arity' expected, found `isLastGot()' 
3 ?- 

這是無論我是否使用isLastGot(): - 或isLastGot: - 在聲明中。

+0

'isLastGot()'在Prolog中是無效的語法。嘗試'isLastGot'。在*兩個地方(聲明和呼叫)。 – lurker

+0

即使將其更正爲isLastGot: - 然後嘗試與isLastGot。我得到的錯誤:錯誤:toplevel:未定義的過程:isLastGot/0(DWIM無法更正目標) – rnso

+0

代碼中有許多問題。你顯示'Got(G)'和'Gave(A)'都是大寫的,這是一個錯誤。這些應該是'得到(G)'和'給(A)'。我想我已經提到過幾次,Prolog中的謂詞不是* functions *。他們不像功能。所以'Lgg是lastElement(Lg)'沒有意義。它應該是'lastElement(Lg,Lgg)'。您可能還收到了有關不連續謂詞的警告(交替「got」和「give」)。在一些序言中,不連貫的事實/謂詞將被忽略。 – lurker

回答

0

我在我的評論中引用了所示代碼中的幾個基本問​​題。我會在這裏更清楚地說明它們。

got(1). 
gave(2). 
got(3). 
gave(4). 
got(5). 
gave(6). 
got(7). 

在上面的部分,你應該看到的警告對「不連續」謂詞,謂詞或「不在一起」(這是「不連續」的意思)。這是因爲您定義了got/1,然後是gave/1,然後返回到got/1。您有gotgave散佈或交錯。許多Prolog實現將忽略不連續的定義,所以這是一個問題。如果你想表示的事實,他們需要的是連續的:

got(1). 
got(3). 
got(5). 
got(7). 
gave(2). 
gave(4). 
gave(6). 

當然,我知道這對工作搞清楚的問題的前提下,這一個排在最後。使用斷言順序作爲創建具有兩種不同函子的特定事實序列的手段並不是一種好方法。將序列表示爲列表會更有意義,例如:[got(1), gave(2), got(3), gave(4), got(5), gave(6), got(7)]。然後處理列表。

isLastGot():- 

如前所述,這是基本的,無效的語法。 Prolog不使用空括號來表示沒有參數。正確的形式是,isLastGot :-

findall(G, Got(G), Lg), 
    findall(A, Gave(A), La), 

上述兩個電話有一個錯誤,可能是排印:GotGave都大寫,但他們不應該。它們應該是gotgave

Lgg is lastElement(Lg), 
    Laa is lastElement(La), 

以上兩個語句治療的Prolog 謂詞就好像它是一個功能。Prolog 謂詞不是函數並且不能這樣調用。

lastElement(Lg, Lgg), 
    lastElement(La, Laa), 

最後:

lastElement([H|T],A):-lastElement([T],A). 
lastElement([A],A). 

lastElement([T], A)調用應該是lastElement(T, A)您有兩個參數,並呼籲這將是正確的方式定義lastElement/2。由於T[H|T]的尾部,因此它已經是一個列表,不應表示爲[T]。這將只是一個元素的列表,它本身就是一個列表。你的謂詞不會像書面一樣工作。還要注意的是,Prolog已經有last/2這正是這個。

+0

完美。糾正所有錯誤後,它就可以工作。答案是:? - isLastGot。 爲真。 !謝謝。 – rnso

相關問題