2011-02-05 3 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

для получения рекомендаций по заданию справки о домашнем задании на SO, прочитайте [«Как задавать вопросы и отвечать на домашние вопросы?»] (Http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework -questions) – outis

+0

Позвольте мне перефразировать это. Вышеупомянутый вопрос является проблемой. Я добираюсь до точки, где Result = ((0 - 2 * 4) - 1 * 3). Почему результат не будет фактическим? Вместо этого он дает мне все расчеты? – Victor

ответ

2

В Visual Prolog:

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). 

Результаты в 32. К сожалению, никакая другая реализация Prolog не доступна под рукой.

+0

Это хороший подход, и с небольшими изменениями можно превратить в ISO Prolog: iprod ([], [], R, R). iprod ([X | Xs], [Y | Ys], A, R): - Anew is (X * Y) + A, iprod (Xs, Ys, Anew, R). iprod (Xvct, Yvct, DotP): - iprod (Xvct, Yvct, 0, DotP). Возможно, слово объяснения о расширении с ** iprod/3 ** на ** iprod/4 ** было бы полезно для нового программиста Prolog? – hardmath

1

Использование SWI-Пролог:

 
?- 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

Правда, но трудность ОП заключается в понимании синтаксического объединения или арифметической оценки. – false

Смежные вопросы