Не успявам да разбера поведението на swi-prolog, когато базата данни
на(a,b).
се запитва с
:- върху (A, B), върху (C, D).
Доколкото разбирам, това, което трябва да се случи, е следното: първо, най-лявата цел в заявката се съпоставя с базата данни. Това успява незабавно, което води до премахването на споменатия гол от заявката, както и до замяната
[A=a,B=b]
След това това заместване се прилага към оставащия гол, което не прави нищо, тъй като нито А, нито Б се появяват във втория гол. Сега оставащата цел се съпоставя с базата данни, което отново успява. Сега сме готови и трябва да останем със смяната
[A=a,B=b,C=a,D=b]
И това трябва да е единственото заместване, което интерпретаторът може да измисли, при условие че разбирането ми за процедурната семантика на пролозите е правилно. За съжаление, swi-prolog мисли друго. Вместо това идва със замяната
[A=C,B=D,C=a,D=b]
Ако сте много щедри, бихте могли да кажете, че „и двата отговора означават едно и също“, но аз никога не съм щедър, когато става въпрос за разбиране какво прави една програма, и се натъкнах на това в контекст, в който това наистина има значение. Така че ще бъда много благодарен, ако някой може да ми помогне да разбера какво се случва.
[A=C,B=D,C=a,D=b]
вместо[A=C,B=D,C=a,D=a]
- person David Tonhofer   schedule 11.04.2020