2011-02-05 5 views
2

저는 프롤로그에 술어를 작성하여 iprod(List1, List2, Result)이 길이가 같은 두 개의 목록을 갖고 각각에 정수가 포함되어 있다고 가정합니다. 결과는 두 벡터의 내적입니다.두 벡터의 계산 도트

예를 들어 List1 = [1,2,3], List2 = [4,5,6]이면 결과는 1*4 + 2*5 + 3*6이됩니다. 또한 내장 된 dotproduct 함수를 사용하지 않아도됩니다. 지금까지

내 코드 : 시각 프롤로그에서

iprod([],[], 0). 
iprod([H1|List1], [H2|List2], Result is H1 * H2) :- iprod(List1, List2, Result). 
+1

그래서 질문은 무엇인가? 그것은 "나를 위해이 숙제를 할 것인가"인가? –

+0

에서 숙제에 대한 도움을 요청하는 지침은 [ "숙제 질문 및 답변 방법]"(http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework)을 읽어보십시오. -questions) – outis

+0

이것을 다시 말하게하십시오. 위의 질문은 문제입니다. 나는 Result = ((0은 2 * 4)가 1 * 3 인 지점까지). 결과가 실제 숫자가되지 않는 이유는 무엇입니까? 대신 그 모든 계산을 나에게주는거야? – Victor

답변

2

: 32에서

domains 
    ilist=integer* 

predicates 
    iprod(ilist, ilist, integer, integer) 

clauses 
    iprod([], _, R, R).  
    iprod([X|Xs], [Y|Ys], A, R):- 
    M = X * Y, 
    Rnew = A + M, 
    iprod(XS, Ys, Rnew, R). 


goal 
    iprod([1,2,3],[4,5,6], 0, R). 

결과. 죄송합니다. 다른 Prolog 구현은 현재 제공되지 않습니다. SWI-Prolog에 사용

+0

이것은 좋은 접근 방법이며 약간의 변경은 ISO Prolog : iprod ([], [], R, R)로 바뀔 수 있습니다. iprod ([X | Xs], [Y | Ys], A, R) : - 새로운 것은 (X * Y) + A, iprod (Xs, Ys, Anew, R)입니다. iprod (Xvct, Yvct, DotP) : - iprod (Xvct, Yvct, 0, DotP). 아마도 ** iprod/3 **에서 ** iprod/4 **로 확장하는 것에 대한 설명은 새로운 Prolog 프로그래머에게 도움이 될 것입니다. – hardmath

1

:

 
?- use_module(library(lambda)). 
true. 

?- maplist(\X^Y^Z^(Z=X*Y),[1,2,3],[4,5,6],Dots). 
Dots = [1*4, 2*5, 3*6]. 

?- maplist(\X^Y^Z^(Z is X*Y),[1,2,3],[4,5,6],Dots). 
Dots = [4, 10, 18]. 
+1

두 목록의 엔트리 별 상품을 만들었습니다. 두 벡터의 내적은 (동일한 길이의 목록으로 표시됩니다.) 하나의 스칼라 (숫자 값)로, 생성 한 제품의 합계입니다. – hardmath

+3

사실,하지만 OP의 어려움은 구문 통일 대 산술 평가의 이해에 있습니다. – false

관련 문제