Romaj ciferoj per Prologo 2 - termoj
Termoj, kombinoj kaj operatoroj
Antaŭ trakti romajn nombrojn, t.e. kunmetitajn el ciferoj, per Prologo, ni devas iom profundigi nian scion pri termoj.
Ni jam vidis kiel uzi termojn (datumtipojn) nombro kaj atomo. Oni povas ilin kombini en esprimoj kiel k(e,5).
Tion oni kosekvence nomas kombino:
Kombino_1 = k(e,5), Kombino_2 = +(1,2),
Kombino_3 = roma_cifero('X',10).
Kombinoj aspektas iom kiel funkcioj aŭ esprimoj en aliaj programlingvoj, sed ili ne aŭtomete kalkuliĝas. Uzataj kiel datumtipo, ili simple reprezentas sin mem - kvazaŭ formulo.
Kelkajn specialajn kombinojn oni povas skribi alternative per operatoro kiel en aritmetiko. Interne ili transformiĝas al
sia kombina formo. Ni elprovu tion per operatoro + kaj =:
Kombino = +(1,2), Kombino = A+B.
Do, la egalsigno ne servas por aritmetika kalkulo, sed nur por egaligi du esprimojn. Sed ja ekzistas ankaŭ operatoro por aritmetiko:is:
Sumo is +(1,2), Kombino = 1+2,
Diferenco is Sumo - Kombino.
Sumo kalkuliĝas tuj pro uzo de is, sed Kombino kalkuliĝas nur kiam ni uzas ĝin por kalkuli Diferencon.
Listoj
Kombinoj kun punkto . estas specialaj: oni konstruas per ĝi listojn:
la unua argumento estas la kapo, kaj la dua argumento estas la resto,
kiu siavice povas esti listo. Ĉar tiu ingigo kondukus al multaj malfacile legeblaj krampoj oni pli pratike skribas
listojn per angulaj krampoj. La fino der ĉiu listo estas la malplena listo []:
Fino = [], Listo1 = .(1,[]), Listo1 = .(1,Fino),
Listo123 = .(1,.(2,.(3,[]))).
Por analizi signarojn, kiel romajn nombrojn, ni traktos ilin kiel listoj de signoj. Se ni havas roman nombron en formo atomo ni povas tiel transformi ĝin en liston de signoj:
Nombro = 'MMXXVI', atom_chars(Nombro,Signoj).
Sed ekzistas eĉ pli eleganta maniero: uzante duoblajn citilojn, vorto aŭ teksto estas aŭtomate traktata kiel signolisto.
Signoj = "MMXXVI".
Liston oni povas ĉiam apartigi en kapon kaj reston per vertikala streko |. La unuan, resp. duan
kaj trian elementon oni ricevas do tiel:
Signoj = "MCXXVI", Signoj = [Unua|Resto],
Signoj = [_,Dua,Tria|Ceteraj].
La substreko _ uziĝas kiel ĵokera variablo, kiam oni devas meti ion en certan pozicion de kombino,
kies konkretan valoron oni nek scias, nek bezonas scii.
La longecon de listo oni ricevas per la predikato length/2. Se oni donas la longecon kiel nombro, oni
ricevas ŝablonan liston kun tiom da variablaj elementoj. Per maplist ni povas apliki predikaton al ĉiu
listero, ekzemple egaligante ilin al steleto *.
:- use_module(library(lists)).
length([1,2,3,4,5],L), length(Steloj,3), maplist(=(*),Steloj).
Sed ni tiel ankaŭ povus ĵeti kvazaŭ tri ludkubojn:
:- use_module(library(random)).
length(Kuboj,3), maplist(random_between(1,6),Kuboj).