2009-12-03 177 views
2

我試圖做出這樣的謂詞,使得對於列表X和Y,如果X和Y是相同的列表,但事實上Y有更多的元素,則rmlast爲真。所以[1] [1,2]或[3,2] [3,2,5]。Prolog初學者

rmlast([], [_]). :- true. 
rmlast([X|xtail], [Y|ytail]) :- rmlast(xtail,ytail), X is Y. 

但是,這對於基本情況以外的任何情況都會產生錯誤結果。

+0

下一次請標記作業問題,如:http://www.cs.toronto.edu/~yilan/324f09/324f09a5.pdf – Stephan202 2009-12-03 23:33:51

回答

6

您的代碼不起作用,因爲xtailytail是用小寫字母寫的,因此不是變量。這工作:

rmlast([], [_]). 
rmlast([X|T1], [X|T2]) :- rmlast(T1, T2). 

除此之外

  1. 正如你看到的,有沒有必要有變量XY在這種情況下:只要使用X兩次,在合適的地方。

  2. 你寫:

    rmlast([], [_]). :- true. 
    

    這是一樣的:

    rmlast([], [_]). 
    :- true. 
    

    正如你所看到的,第二條語句添加任何內容,並因此可以安全地取出。

+1

我從來沒有在變量實例化之前真正見過大小寫敏感。那肯定確實解決了,謝謝。 – meunierd 2009-12-03 18:25:17

1
rmlast([H],[]). 
rmlast([H1|Tail1],[H2|Tail2]):- 
      H1 = H2,rmlast(Tail1,Tail2). 

不要用 '是',它不是一個邏輯運算符。這是一個賦值操作符。改用'='。