簡體   English   中英

列表列表-遞歸對序言

[英]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的將暫停解釋,並添加帶格式化為元素FormatList 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM