問題是;我有一個混合元素的串列[Y, donkey, horse, 30, father(max)]/code>。我想從這個串列中專門用原子做一個新的串列,
我想寫一個名為 atoms/2 的 Prolog 謂詞,當在第一個引數位置提供一個串列時,將在第二個引數位置提供的變數實體化為輸入串列中出現的所有原子的串列(包括任何可能的重復元素)。
像這樣:
? - atoms([Y, donkey, horse, 30, father(max)], Result) 。
Result = [Donkey, horse].
uj5u.com熱心網友回復:
我假設這是為學校作業準備的,你的老師希望你能滾出自己的代碼,而不是使用內置的,member/2和findall/3。
Prolog有一個內置的謂詞,atom/1,我們將使用它來識別原子。
而且Prolog是一種遞回語言。訣竅是要學會遞回思考。大多數遞回問題可以被分解為1或2個特殊情況,然后是更普遍的遞回情況。
所以...
我們有一個特殊情況,即空串列:
atoms( [] , [] ) 。
而且我們有兩種一般的、遞回的情況。一種是串列的頭部(第一項)是一個原子的情況,這種情況下我們將串列項添加到結果串列中并向下遞回:
atoms( [X|Xs], [X|Atoms] ) :- atom(X), ! , atoms(Xs,Atoms) 。
另一種/最后一種情況是當前串列項不是原子的情況,在這種情況下,我們只需丟棄串列項并向下遞回。
atoms( [X|Xs], Atoms ) := atom(X), atoms(Xs, Atoms).
把它放在一起,你會得到
。atoms( []/span> , []/span> ) 。
atoms( [X|Xs] , [X|Atoms] ) :- atom(X),atoms(Xs,Atoms)。
atoms( [X|Xs] , Atoms ) :- atom(X), atoms(Xs, Atoms) 。
注意,這可以被簡化以消除多余的原子性測驗。將一個串列項識別為一個原子是確定性的,也就是說,當我們再次看它時,這個串列項不會停止成為一個原子,所以我們可以使用 cut (!) 運算子來修剪搜索樹:
atoms( []/span> , []/span> ) .
atoms( [X|Xs] , [X|Atoms] ) :- atom(X),!, atoms(Xs,Atoms)。
atoms( [X|Xs] , Atoms ) :- atoms(Xs,Atoms) 。
uj5u.com熱心網友回復:
- 安裝SWI-Prolog. 。
- 啟動它。
- 鍵入,在
?-提示下。edit(include/3).然后點擊Enter。 - 當你看到
include/3的庫定義時,你會驚嘆不已。 - 使用這個作為你的謂詞的起點。
- 思考開放源代碼的重要性。
另外,請查看這個答案。
uj5u.com熱心網友回復:
由于大多數 Prolog 系統實作了 member/2 串列成員謂詞和標準的 atom/1 和 findall/3 謂詞,一個簡單的可移植解決方案是:
atoms(List, Atoms) :-
findall(
原子。
(member(Atom, List), atom(Atom))。
原子
).
呼叫示例:
| ?- atoms([Y, donkey, horse, 30, father(max)], Atoms)。
原子=[驢子,馬]
是。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/319304.html
標籤:
下一篇:Dart-遞回函式回傳null
