2013-10-14 7 views
1

Я пытаюсь сравнить S1 с A1, S2 с A2, ..., S5 с A5 и получить общее количество пар, которые соответствуют друг другу. Но интерпретатор показывает «синтаксическая ошибка, ожидаемый оператор». Есть ли простой подход для решения этой проблемы и что не так с моим кодом? Благодаря!Ошибка синтаксиса: ожидаемый оператор при попытке сравнения

grade(S1, S2, S3, S4, S5, A1, A2, A3, A4, A5, N):- 
    S1 = A1, grade2(S2, S3, S4, S5, A2, A3, A4, A5, N+1). 

grade(S1, S2, S3, S4, S5, A1, A2, A3, A4, A5, N):- 
    \+ S1=A1, grade2(S2, S3, S4, S5, A2, A3, A4, A5, N). 

grade2(S2, S3, S4, S5, A2, A3, A4, A5, N):- 
    S2=A2, grade3(S3, S4, S5, A3, A4, A5, N+1). 

grade2(S2, S3, S4, S5, A2, A3, A4, A5, N):- 
    \+ S2=A2, grade3(S3, S4, S5, A3, A4, A5, N). 

grade3(S3, S4, S5, A3, A4, A5, N):- 
    S3=A3, grade4(S4, S5, A4, A5, N+1). 

grade3(S3, S4, S5, A3, A4, A5, N):- 
    \+ S3=A3, grade4(S4, S5, A4, A5, N). 

grade4(S4, S5, A4, A5, N):- 
    S4=A4, grade5(S5, A5, N+1). 

grade4(S4, S5, A4, A5, N):- 
    \+ S4=A4, grade5(S5, A5, N). 

grade5(S5, A5, N):- 
    S5=A5, N is 1. 

grade5(S5, A5, N):- 
    \+ S5=A5, N is 0. 

ответ

0

Я не получаю синтаксическую ошибку в коде, но он не может выполнить: ваше первое правило (например) следует читать

grade(S1, S2, S3, S4, S5, A1, A2, A3, A4, A5, N):- 
    S1 = A1, grade2(S2, S3, S4, S5, A2, A3, A4, A5, M), 
    N is M+1. 

Вы используется/2 в единственном месте где это бесполезно. Последнее правило (s) мог прочитать

grade5(S5, S5, 1):-!. 
grade5(_, _, 0). 

Тогда для некоторого легче читать код (понимание кода слишком много бесполезных деталей вредно для моего бедного мозга ...), используя библиотеку (складочном)

grade(S1, S2, S3, S4, S5, A1, A2, A3, A4, A5, N):- 
    aggregate_all(count, 
    (nth1(I,[S1,S2,S3,S4,S5],X), 
    nth1(I,[A1,A2,A3,A4,A5],X) 
    ), N). 

я

4 ?- grade(a,b,c,d,e, u,v,c,d,x, N). 
N = 2. 
0

Я не смог воспроизвести вашу ошибку. Однако, так как сейчас он не может работать из-за того, как вы вычисляете значение N. Если вы выполните трассировку, вы сможете увидеть, где это происходит.

Во всяком случае, хотя, кажется, заранее знать, сколько пар вы сравниваете, более общий подход, чтобы положить пары в двух списках, или даже лучше, в списке пар:

[S1-A1, S2-A2, ...] 

- здесь всего лишь способ написать -(S, A) и обычный способ Пролога представлять пары. После того, как список пар в этой форме, вы могли бы явно написать:

grade([], 0). 
grade([S-A|Rest], N) :- 
    ( S == A 
    -> Add = 1 
    ; Add = 0 
    ), 
    grade(Rest, N0), 
    N is N0 + Add. 

Обратите внимание, что вы не можете использовать хвостовую рекурсию, если у вас есть дополнительный аргумент, чтобы собрать результат до сих пор:

grade([], N, N). 
grade([S-A|Rest], Acc, N) :- 
    ( S == A 
    -> NewAcc is Acc + 1 
    ; NewAcc = Acc 
    ), 
    grade(Rest, NewAcc, N). 

(вам нужно «инициализировать» аккумулятор при вызове предиката)

?- grade(List, 0, N). 

Так что для вашего случая:

  • использовать первоначальный подход, но исправить, как N рассчитываются с любым из этих двух подходов, продемонстрировавших
  • представляют список пара в качестве фактического списка пара
  • , если вы работаете со списками, есть и другие методы доступны, например, в библиотеке (совокупности). Может быть полезно для более сложных проблем одного и того же типа.
+0

Вы также можете использовать хвостовую рекурсию, если используете ограниченные ограничения вашей системы (вам не нужен дополнительный аргумент). Если вы пишете «N # = N0 + Add», вы можете свободно перемещать цель до рекурсивного вызова.Если оценки являются целыми числами, вы также можете использовать переопределение ограничений, например 'S # = A # <==> Добавить' вместо не декларативного использования if/then/else. Это позволяет использовать предикат во всех направлениях. – mat

1

С SWI-Prolog и модуль лямбда вы можете написать:

:- use_module(library(lambda)). 

grade(S1, S2, S3, S4, S5, A1, A2, A3, A4, A5, N) :- 
    foldl(\X^Y^Z^T^(X = Y -> T is Z+1 ; T = Z), 
     [S1, S2, S3, S4, S5], 
     [A1, A2, A3, A4, A5], 
     0, N). 
Смежные вопросы