我能有兩個參數的遞歸Prolog的謂詞,稱爲反向,它返回一個列表的倒數:遞歸Prolog的謂詞反向/迴文
樣品的查詢和預期的結果:
?- reverse([a,b,c], L). L = [c,b,a].
兩個參數的遞歸Prolog謂詞,稱爲
palindrome
,如果給定列表是迴文,則返回true。樣品查詢與預期的結果:
?- palindrome([a,b,c]). false. ?- palindrome([b,a,c,a,b]). true.
7
A
回答
6
廣告1:這是不可能的定義reverse/2
爲(直接編輯THX到@Repeat:尾)遞歸謂詞 - 除非你允許的輔助謂詞。
廣告2:
palindrome(X) :- reverse(X,X).
但是最簡單的方法是與DCG中定義這樣的謂詞:
iseq([]) --> [].
iseq([E|Es]) --> iseq(Es), [E].
reverse(Xs, Ys) :-
phrase(iseq(Xs), Ys).
palindrome(Xs) :-
phrase(palindrome, Xs).
palindrome --> [].
palindrome --> [E].
palindrome --> [E], palindrome, [E].
5
沒有定義reverse/2
與單個遞歸定義,而無需使用一種有效的方式一些輔助謂詞。但是,如果這仍然是允許的,不依賴於任何內置插件一樣append/3
(也應該適用於大多數的Prolog實現)一個簡單的解決辦法是使用蓄能器列表,如下:
rev([],[]).
rev([X|Xs], R) :-
rev_acc(Xs, [X], R).
rev_acc([], R, R).
rev_acc([X|Xs], Acc, R) :-
rev_acc(Xs, [X|Acc], R).
rev/2
是反轉謂詞,它簡單地「委託」到(或包裝)名爲rev-acc/2
的基於累加器的版本,該版本以相反的順序將輸入列表的元素遞歸添加到累加器中。
運行此:
?- rev([1,3,2,x,4],L).
L = [4, x, 2, 3, 1].
而且確如@false已經指出的(+1),
palindrome(X) :- rev(X,X).
2
只是出於好奇在這裏不用遞歸執行反向/ 2不使用輔助謂詞並仍然反轉列表。你可能會認爲它是作弊的,因爲它使用反向/ 2使用列表和結構 -/2作爲參數。
reverse([], []):-!.
reverse([], R-R).
reverse(R-[], R):-!.
reverse(R-NR, R-NR).
reverse([Head|Tail], Reversed):-
reverse(Tail, R-[Head|NR]),
reverse(R-NR, Reversed).
0
conca([],L,L).
conca([X|L1],L2,[X|L3]):- conca(L1,L2,L3).
rev([],[]).
rev([X|Y],N):- rev(Y,N1),conca(N1,[X],N).
palindrome([X|Y]):- rev([X|Y],N),equal([X|Y],N).
equal([X],[X]).
equal([X|Y],[X|Z]):- equal(Y,Z).
+0
-1。你的命名不清的謂詞'conca/3'之間沒有界限,只是'append/3'的一個拷貝,它是ISO,'palindrome/1'會破壞列表而無法獲得任何收益(除了防止空列表成爲否定記號理由),'equal/2'在'=/2'上沒有改進,只是它不必要的更多限制。 「新的東西不好,好的東西不是新的。」 –
相關問題
- 1. 謂詞返回。 Prolog
- 2. SWI-Prolog謂詞
- 3. Prolog powerset謂詞
- 4. Prolog謂詞
- 5. 在Prolog中遞歸謂詞的末尾處切割
- 6. prolog中的謂詞
- 7. PROLOG謂詞順序
- 8. 使用Prolog = ..謂詞
- 9. 從Prolog的謂詞中「返回」列表
- 10. 擴展Prolog的謂詞
- 11. 查找Prolog的謂詞
- 12. Prolog中的成員謂詞
- 13. Prolog中的謂詞控制
- 14. Prolog的謂詞主叫
- 15. Prolog的結合謂詞
- 16. Prolog的謂詞問題
- 17. 遞歸反向
- 18. 遞歸反向
- 19. 從python調用prolog謂詞
- 20. prolog謂詞[sublist(Xs,Ys)]
- 21. Prolog謂詞(\ =)/ 2被忽略
- 22. Prolog - 謂詞運算符
- 23. Prolog,使用多個謂詞
- 24. Prolog謂詞不起作用
- 25. 在Prolog中結合謂詞
- 26. 在prolog中加入謂詞
- 27. 默認Prolog謂詞排序
- 28. Prolog謂詞 - 無限循環
- 29. 滿足一元Prolog謂詞
- 30. 使用Prolog選擇謂詞?
採用DCG中這裏是一個很好的解決方案。 – sharky