Пролог: невозможно объединить для второго выражения из-за предпочтения первого выражения - PullRequest
0 голосов
/ 04 апреля 2011

В моем файле есть следующее прологическое выражение, которое само собой разумеется. У меня есть все необходимые функции, которые необходимы для этого правила (назовите его 1), реализованные и протестированные правильно.

cal(plus(X,Y),Z):-cal(X,int(Z1)),cal(Y,int(Z2)),add(Z1,Z2,Z3),Z=int(Z3) ; cal(X,real(Z1)),cal(Y,real(Z2)),add(Z1,Z2,Z3),Z=real(Z3).

После нескольких часов попыток я не смог понять следующее:

?-call(plus(int(9),int(10)),Z). 

работает правильно и возвращает: -

Z = int(19).

но оно не объединяется с

?-call(plus(real(9.0),real(10.0),Z).

Я перепробовал многие вещи и пришел к выводу, что это связано с тем, что целочисленная часть (перед;) в правиле 1 была указана первой, а не вещественная часть (я обменял их на две, и она начала работать в обратном порядке). Он пытается объединиться с первой частью и повторяется. Поскольку такого факта не существует, он просто входит в бесконечный цикл. Пожалуйста, укажите альтернативный способ сделать то же самое. Это единственная часть моего задания, которая осталась, и я нахожусь в ней часами.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 04 апреля 2011

Ну вот и ответ.

cal(plus(X,Y),G,Z):-cal(X,G,Z1),cal(Y,G,Z2),((Z2 = int(Z22),Z1 = int(Z11));(Z2 = real(Z22),Z1 = real(Z11))),add(Z11,Z22,Z3),(Z3=int(Z4) -> Z=int(Z3); Z=real(Z3)).

Вы должны вызывать функцию cal только один раз для определенного входа .Избыточный вызов вызывает проблемы.

0 голосов
/ 04 апреля 2011

Проблема с приоритетом ";"против оператора ",".Используйте скобки или напишите два отдельных правила:

cal(plus(X,Y),Z):- 
    cal(X,int(Z1)),
    cal(Y,int(Z2)),
    add(Z1,Z2,Z3),
    Z=int(Z3).
cal(plus(X,Y),Z):- 
    cal(X,real(Z1)),
    cal(Y,real(Z2)),
    add(Z1,Z2,Z3),
    Z=real(Z3).
...