您的changeFst/4
的定義在很多方面不正確,例如changeFst(o,[o,o],n,[m,y,s,t,e,r,y]).
成功,但顯然它會失敗。原因是你對裁剪的不正確使用。如果你想學習Prolog,請先堅持純粹的聲明性子集。這意味着沒有削減,也沒有副作用。
所以在這裏是不依賴於削減一個定義:
這樣一個純粹的關係
changeFst(Old,[Old|Olds],New,[New|Olds]).
changeFst(Old,[E|Olds],New,[E|News]):-
dif(Old, E),
changeFst(Old,Olds,New,News).
一個好處是,我們可以用最普通的查詢,看看有什麼答案,我們得到:
| ?- changeFst(Old, Olds, New, News).
Olds = [Old|_A],
News = [New|_A] ? ;
Olds = [_A,Old|_B],
News = [_A,New|_B],
prolog:dif(Old,_A) ? ;
Olds = [_A,_B,Old|_C],
News = [_A,_B,New|_C],
prolog:dif(Old,_A),
prolog:dif(Old,_B) ? ;
Olds = [_A,_B,_C,Old|_D],
News = [_A,_B,_C,New|_D],
prolog:dif(Old,_A),
prolog:dif(Old,_B),
prolog:dif(Old,_C) ? ...
你注意到答案總是包含:Olds
a 部分列表?像: Olds = [Old|_A]
在第一個答案。這可能是有點太一般了,畢竟這意味着,即使nonlists正在接受:
| ?- changeFst(o,[o|nonlist], New, News).
News = [New|nonlist] ?
yes
所以,你可能希望確保Olds
和News
總是列出。
但是我的觀點是,你要向你展示一個純粹的關係,你會看到很多事情,一個被切斷的程序永遠不會直接告訴你。
如果我們在這裏:如何處理空白列表?目前的版本暗示changeFst/4
應該失敗。不知道你想要什麼,但如果你想要它成功,首先添加一個事實changeFst(_,[],_,[]).
。
請參閱this answer定義dif/2
(prolog-dif)如果您的Prolog不支持它。
你的定義不正確:'changeFst(鄰,[O, o],n,[o,n])。'成功了,但根據你的描述,它應該失敗! – false
即使'changeFst(鄰,[O,O-]中,n,[])。'成功這顯然應該失敗。 – false