Ik zit een beetje met Prolog te spelen; Ik heb mezelf een paar opgaven gegeven, waaronder lists.
Nu heb ik een stukje code geschreven dat een item X in een lijst vervangt door een item Y, als volgt:
Nu geeft Prolog in principe het juiste antwoord:
Maar, Prolog geeft er nog veel meer:
Nu kan ik dit wel voorkomen door een cut te gebruiken:
Maar kan ik mijn definitie dusdanig verbeteren dat ik geen cut nodig heb?
Waarom gaat Prolog de andere getallen ook aanpassen? De X verandert verder toch niet?
Nu heb ik een stukje code geschreven dat een item X in een lijst vervangt door een item Y, als volgt:
code:
1
2
3
| replace_item([], _, _, []). % basisgeval replace_item([Ah|At], X, Y, [Ah|Bt]) :- Ah \= X, replace_item(At, X, Y, Bt). % oude houden replace_item([_|At], X, Y, [Y|Bt]) :- replace_item(At, X, Y, Bt). % X vervangen door Y |
Nu geeft Prolog in principe het juiste antwoord:
code:
1
2
| replace_item([1,2,3,4,5], 5, a, Z). Z = [1, 2, 3, 4, a] ; |
Maar, Prolog geeft er nog veel meer:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| Z = [1, 2, 3, a, a] ; Z = [1, 2, a, 4, a] ; Z = [1, 2, a, a, a] ; Z = [1, a, 3, 4, a] ; Z = [1, a, 3, a, a] ; Z = [1, a, a, 4, a] ; Z = [1, a, a, a, a] ; Z = [a, 2, 3, 4, a] ; Z = [a, 2, 3, a, a] ; Z = [a, 2, a, 4, a] ; Z = [a, 2, a, a, a] ; Z = [a, a, 3, 4, a] ; Z = [a, a, 3, a, a] ; Z = [a, a, a, 4, a] ; Z = [a, a, a, a, a]. |
Nu kan ik dit wel voorkomen door een cut te gebruiken:
code:
1
2
3
| replace_item([], _, _, []). replace_item([Ah|At], X, Y, [Ah|Bt]) :- Ah \= X, !, replace_item(At, X, Y, Bt). replace_item([_|At], X, Y, [Y|Bt]) :- replace_item(At, X, Y, Bt). |
code:
1
2
| 144 ?- replace_item([1,2,3,4,5], 5, a, Z). Z = [1, 2, 3, 4, a]. |
Maar kan ik mijn definitie dusdanig verbeteren dat ik geen cut nodig heb?
Waarom gaat Prolog de andere getallen ook aanpassen? De X verandert verder toch niet?
[ Voor 3% gewijzigd door Verwijderd op 06-03-2011 10:22 ]