2016-05-11 42 views
1

所以我正在嘗試一些東西。我有以下簡單斷言:我該如何修改我的謂詞來混亂我的輸出結果?

insert([],Y,[Y]). 
insert([H|T],Y,[H,Y|T]). 

所以這將插入我的元素Y進入我的列表。然而,這總是將它放在中間的同一個地方。但說我希望它更像以下幾點:

?- insert([1,2,3], 4, Zs). 

應該成功四次,並給出以下答案:

Zs = [4, 1, 2, 3] 
Zs = [1, 4, 2, 3] 
Zs = [1, 2, 4, 3] 
Zs = [1, 2, 3, 4]. 

我怎麼會相應地修改我的斷言?

+1

根據規則可能會發生什麼想法並根據簡單案例和非重疊遞歸案例來思考是很好的。然後轉換爲Prolog ...(1)將'Y'插入到列表'L'中是以'Y'爲頭部,'L'作爲尾部(休息)的列表,並且(2)將'Y'插入列表中的[H | T]爲[H | R],其中'R'爲插入列表'T'的列表'T'。 – lurker

回答

1

如果您想要在列表中查找元素的可能位置,則必須找到包含要插入的元素的此列表的所有可能連接。

insert(X,Y,Z):- append(A, B, X), append(A, [Y|B], Z). 

存在2子列表,返回列表X,和這兩子列表與所述第二子列表的開頭的值Y級聯的級聯該斷言狀態,返回列表Z:這可以使用append/3謂詞來描述。

?- insert([1,2,3], 4, Z). 
Z = [4, 1, 2, 3] 
Z = [1, 4, 2, 3] 
Z = [1, 2, 4, 3] 
Z = [1, 2, 3, 4] 
false 
2

另一個有用的內置,在SWI-Prolog的延伸到插入處理以及選擇:

?- nth1(_,X,a,[1,2,3]). 
X = [a, 1, 2, 3] ; 
X = [1, a, 2, 3] ; 
X = [1, 2, a, 3] ; 
X = [1, 2, 3, a] ; 
false. 

只是忽略第一個參數(索引本身)

相關問題