那麼,如何以聲明方式閱讀
remove([X|Xs], [X|Ys]) :-
Xs = [_,_|_],
remove(Xs,Ys).
最重要的是你第一次意識到什麼是012其實是指。
頭:-
身體.
這意味着:每當身體成立,我們可以得出結論,也頭成立。注意箭頭的相當不直觀的方向。它從右到左。而不是從左到右,就像你在結束某些事情時經常寫的那樣。然而,這個錯誤指向了我們「走出去」的方向。
爲了更好地看到這個,你可以輸入Body作爲查詢!
?- Xs = [_,_|_], remove(Xs,Ys).
Xs = [A, B],
Ys = [B] ;
Xs = [A, B, C],
Ys = [A, C] ;
...
所以我們得到了所有的答案,除了那些Xs
有不到兩個元素。
請注意,在程序上,事情發生在另一個方向 - 這對初學者來說非常混亂。更重要的是,因爲Prolog使用了兩個「非傳統」特徵:按時間順序回溯和變量 - 我的意思是real變量,意思是所有可能的術語 - 而不是從命令式和函數式語言中知道的這些編譯時構造。在這些語言中,變量是運行時值的持有者。具體的價值。在Prolog中,變量在運行時也存在。欲瞭解更多信息,請參閱Difference between logic programming and functional programming
另外還有一個問題,我不確定你是否理解。想想:
?- remove(Xs, [1,2]).
Xs = [1, A, 2] ;
false.
這裏刪除了什麼?沒有!恰恰相反,我們正在向列表中添加更多元素。由於這個原因,名稱remove/2
在Prolog中並不理想 - 它讓我們想起了命令式編程語言,它強制給出一些參數並計算其他參數。你可能會首先認爲這並不重要,畢竟它只是一個名字。但是不要忘記,編程時你經常沒有時間全盤考慮。所以一個好的關係名稱可能更可取。
要找到一個,請從類型開始:list_list/2
,然後再細化或list__without_2nd_last/2
。