2016-11-09 41 views
0

我想定義謂詞,其中需要一個列表,將一個元素添加到列表中,讓我們說數字「1」,然後返回列表。序言 - 修改和返回列表

我發現我可以使用append/3將元素添加到列表中,但我想在另一個謂詞中使用,因此我希望它返回「我的修改列表」。

我的面向對象的思維方式告訴我要求解釋器如下所示:?-append(X,5,X)。 ,所以它需要列表X,增加5,並返回「新的X」,但我知道這不是統一的工作方式,所以我的思想有點不對勁。

任何人都可以請嘗試解釋這樣的事情可以實現嗎?

回答

1

您已經是非常接近的解決方案,所以我只改一下你開始什麼已經感覺到:

首先,你不能修改純Prolog的列表。

相反,你應該認爲關係實體之間。在你的情況下,認爲 列表之間的關係。

所以,「加上1號」的列表是一個關係兩者之間的名單,這可能是這樣的:

list_with_one(Ls, [1|Ls]). 

注意,這一切方向工作於!你可以用它來:

  • 產生解答
  • 測試特殊情況下
  • 「反向」 的方向等

所以,你需要在你的情況做就是根據來考慮 列表之間的關係:一個沒有元素,以及這與不同的列表如何關聯元素。

很明顯,這兩個列表將顯示不同變量不同論點

請特別注意,append(X, 5, X)不能抱:首先,append/3,就是要  列表之間的關係,並5一個 列表。其次,假設你寫例如append(Xs, [5], Xs),那麼這將如果那裏有一個列表Xs例如,如果元素5被附加到  Xs,結果列表將再次  Xs是真實的。祝你好運,找到這樣的 列表...另請注意,通過讓變量名以  s結尾來表示列表的命名約定。

由於您可以在  Prolog中進行面向對象的編程,所以在您的「面向對象的思維模式」中指責這一點也有點短。

0

儘管Prolog中的列表無法修改,但可以在a list with an unspecified length的末尾添加元素。通過這種方式,項目可以被「附加」到列表中,而無需創建另一個列表:

:- initialization(main). 

append_to_list(List,Item) :- 
    append_to_list(List,Item,0). 

append_to_list(List,Item,Index) :- 
    % using SWI-Prolog's nth0 predicate 
    (nth0(Index,List,Check_Item), 
    var(Check_Item), 
    nth0(Index,List,Item)); 
    (Next_Index is Index+1, 
    append_to_list(List,Item,Next_Index)). 

main :- 
    A = [1,2,3|_], 
    append_to_list(A,4), 
    append_to_list(A,7), 
    writeln(A). 

在這個例子中,A變得[1,2,3,4,7|_]