[英]list of lists- recursive pairs prolog
如何將所有對放在一個列表中?
我有 -
pair([H|T], [H,E]) :- member(E, T).
pair([_|T], P) :- pair(T, P).
我希望答案將是成對的列表。
所以我嘗試-
listPairs([],[Res1]):-
Res1=[].
listPairs(L,[Res2]):-
L=[H|T],
append(pair([H|T],[Res2]),listPairs(T,[Res2])).
但我錯過了一些清單..因為它沒有被編譯。
我真的看不到您打算對append/2
做些什么。 您絕對不能將目標應該在append/3
調用,因為在這種情況下,它們將被視為函子。
但是,您可以輕松地使用幾乎在所有Prolog系統中實現的findall/3
謂詞(至少我所看到的所有正在使用的謂詞):
listPairs(L,Pairs) :-
findall(Pair,pair(L,Pair),Pairs).
findall/3
工作方式如下:
findall(Format,Goal,List).
在這里,您可以指定一個Goal
(此處為pair(L,Pair)
),Prolog會將其稱為Goal
。 每次Goal
成功,Prolog的將暫停解釋,並添加帶格式化為元素Format
的List
。 當Goal
失敗時,將返回所有Format
的列表。
如果運行查詢,則會得到:
?- listPairs([1,a,2,'5'],Pairs).
Pairs = [[1, a], [1, 2], [1, '5'], [a, 2], [a, '5'], [2, '5']].
請注意, L
必須接地(如列表所示,意味着沒有未實例化的尾巴,一個未實例化的元素就可以了),因為否則,您將生成的pair/2
元素的數量是無限的,因此您將耗盡全局堆棧(或內存在一般)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.