2017-06-13 80 views
1

謂詞change_pos(E1, E2,Lin,Lout).我如何改變一個列表(PROLOG)

Lin具有任意數量的元素的兩個元素的位置,我需要改變的E1所有出現到E2,反之亦然。並在Lout返回。

我當時就想,做這樣的事情:

change(X, Y, [], []). 
change(X, Y, [X|L], [Y,L1]):- change(X,Y,L,L1). 
change(X, Y, [Z|L], [Z,L1]:- X \== Z, change(X,Y,L,L1). 

但這種方式並不刷卡二號列表

+0

這功課嗎? – Enigmativity

+0

而你並沒有改變兩個元素的位置。你正在取代元素。兩件不同的事情。 – Enigmativity

+0

你應該嘗試一些然後告訴我們,而不是隻是要求我們爲你做這項工作。 –

回答

2

你是幾乎沒有的。您的基本情況(空列表)和您的第二條規則(交換XY)基本上沒有問題(除了評論中指出的細節外)。但是,您錯過了的規則(交換Y對於X)。在你的最後一條規則中,你可能想要確保Z不僅與X不同,而且也與Y不同,否則Z將受制於規則二或三。

change(X, Y, [], []). 
change(X, Y, [X|L], [Y|L1]) :- 
    change(X,Y,L,L1). 
change(X, Y, [Y|L], [X|L1]) :- % <- vice versa case 
    change(X,Y,L,L1). 
change(X, Y, [Z|L], [Z|L1]) :- 
     dif(X,Z),     % <- neither X=Z 
     dif(Y,Z),     % <- nor vice versa 
     change(X,Y,L,L1). 

以下是一些示例查詢。 什麼[1,2,3,4]樣子交換12反之亦然後?

?- change(1,2,[1,2,3,4],L). 
L = [2,1,3,4] ? ; 
no 

什麼了[2,1,3,4]樣子交換12反之亦然過嗎?

?- change(1,2,L,[2,1,3,4]). 
L = [1,2,3,4] ? ; 
no 

哪些元素已經在[1,2,3,4]被換,如果結果列表是[2,1,3,4]

?- change(X,Y,[1,2,3,4],[2,1,3,4]). 
X = 1, 
Y = 2 ? ; 
X = 2, 
Y = 1 ? ; 
no 
+0

所有這些';沒有'......那麼,改變(a,a,[a],[a])的兩(2)個多餘的答案呢? – false

+0

@false:有趣的事實:在Yap中,查詢'? - change(a,a,[a],[a])。'確定性地成功。 :-) – tas

+1

與'repeat.'一樣?是? – false

4

我假設,因爲這是家庭作業,這是一個學習列表處理和遞歸的練習。但在序言,在列表處理依次在每個學期的常用工具是maplist

% Rule for changing one element 
change_element(X, Y, X, Y). 
change_element(X, Y, Y, X). 
change_element(X, Y, Z, Z) :- dif(X, Z), dif(Y, Z). 

% Rule for changing a list 
change(X, Y, L1, L2) :- 
    maplist(change_element(X, Y), L1, L2). 

其中產量:

?- change(a, b, [a,b,c,b,a], L). 

L = [b, a, c, a, b] ? ; 

no 
?- 


對於 解決方案,您可以使用 if_/3

change1(X, Y, A, B) :- 
    if_(=(Y, A), B = X, A = B). 
change2(X, Y, A, B) :- 
    if_(=(X, A), B = Y, change1(X, Y, A, B)). 

change(X, Y, L1, L2) :- maplist(change2(X, Y), L1, L2). 

其中收益率:

?- change(a, b, [a,b,c,b,a], L). 

L = [b, a, c, a, b]. 

?- 
+1

你可以讓這個確定嗎? – false

+0

...理想情況下在一個單獨的答案已被阻止通過這個關閉 – false

+0

現在你可以做出另一個答案! (順便說一句,=可以用作操作符,並且不需要'change1/4'作爲單獨的謂詞 – false