Levente Zsíros <zslevi(a)gmail.com> writes:
:- use_module(library(clpfd)).
clpsum(Sum,L,AddStr):-
clpsum2(L,AddStr),AddStr#=Sum.
clpsum2([H],H).
clpsum2([H|T],AddStr):-
clpsum2(T,AddStr2),
AddStr = H+AddStr2.
| ?- X in 1..100,Y in 1..100,clpsum(10,[X,Y],A).
! Type error in argument 1 of user: #= /2
! integer expected, but _76+_77 found
! goal: _76+_77#=10
| ?-
A clpsum-nak elvileg osszeg korlatot kellene tennie listaban szereplo
valtozokra (2. kishf-hez kellene).
Errol a "paranormalis" jelensegrol a magikus sorozatok kapcsan beszeltem,
lasd foliak 68. oldal
(
http://cs.bme.hu/~szeredi/oktatas/nlp/nlp09_all-foliak.pdf):
Megjegyzés
Az aritmetikai beépített eljárások megengednek (aritmetikai) struktúrákat
tartalmazó változókat, pl. Kif = S1+S2, ..., Kif =:= 0.
CLPFD-ben ez nem megengedett: Kif=S1+S2, ..., Kif #= 0 ==>
Hiba! Ennek oka: a korlát-kifejtés csak betöltéskor történik meg.
A megoldás a korlát-kifejtési fázis késleltetése: Kif=S1+S2, ...,
call(Kif #= 0).
Tehat itt is a megoldas az, hogy `AddStr#=Sum' helyett a
`call(AddStr#=Sum)' hivast teszed be.
-Peter