我想定義謂詞,其中需要一個列表,將一個元素添加到列表中,讓我們說數字「1」,然後返回列表。序言 - 修改和返回列表
我發現我可以使用append/3將元素添加到列表中,但我想在另一個謂詞中使用,因此我希望它返回「我的修改列表」。
我的面向對象的思維方式告訴我要求解釋器如下所示:?-append(X,5,X)。 ,所以它需要列表X,增加5,並返回「新的X」,但我知道這不是統一的工作方式,所以我的思想有點不對勁。
任何人都可以請嘗試解釋這樣的事情可以實現嗎?
我想定義謂詞,其中需要一個列表,將一個元素添加到列表中,讓我們說數字「1」,然後返回列表。序言 - 修改和返回列表
我發現我可以使用append/3將元素添加到列表中,但我想在另一個謂詞中使用,因此我希望它返回「我的修改列表」。
我的面向對象的思維方式告訴我要求解釋器如下所示:?-append(X,5,X)。 ,所以它需要列表X,增加5,並返回「新的X」,但我知道這不是統一的工作方式,所以我的思想有點不對勁。
任何人都可以請嘗試解釋這樣的事情可以實現嗎?
您已經是非常接近的解決方案,所以我只改一下你開始什麼已經感覺到:
首先,你不能修改純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中進行面向對象的編程,所以在您的「面向對象的思維模式」中指責這一點也有點短。
儘管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|_]
。