Deklaratív programozás - Prolog vizsgafeladat: merőleges vektorok

A VIK Wikiből
A nyomtatható változat már nem támogatott, és hibásan jelenhet meg. Kérjük, frissítsd a böngésződ könyvjelzőit, és használd a böngésző alapértelmezett nyomtatás funkcióját.

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


Feladat

Segédpredikátum

=skalar(A, B, C)=: A és B bemenő vektorok skalár szorzatát adja C-ben pl.

	skalar([1,2,3], [0,1,0], C).

	C=[0,2,0]

Főpredikátum

=meroleges(A,B,V1,V2)=: A és B bemenő vektorlisták közötti egymásra merőleges párokat adja ki V1-ben és V2-ben. pl.

	meroleges([[0,1,0], [1,2,0]], [[1,0,0], [0,0,1]], A, B).

	A = [0, 1, 0]
	B = [1, 0, 0] ;

	A = [0, 1, 0]
	B = [0, 0, 1] ;

	A = [1, 2, 0]
	B = [0, 0, 1] ;

Megoldás

(biztos nem így kell, de ez müxik):

skalar([A1|A], [B1|B], [C1|C]) :-
	integer(A1), integer(B1), C1 is A1*B1,
	skalar(A, B, C).
skalar([], [], []).

meroleges([A1|A], B, V1, V2) :-
	merolegiter(A1, B, V1, V2) ;
	meroleges(A, B, V1, V2).

merolegiter(A, [B1|B], V1, V2) :-
	skalar(A, B1, C),
	csaknulla(C),
	V1=A, V2=B1;
	merolegiter(A,B,V1,V2).

csaknulla([A1|A]) :-
	number(A1), A1 =:= 0, csaknulla(A).
csaknulla([]).