@jan, I was trying to do the same.
So far I find sCASP extremely useful, whereas WFS leaves a lot to be desired. Taking the moth example: “something is a moth if it does not fly during daylight”. Let’s say we have incomplete knowledge. Let’s try to code it with sCASP and WFS:
% First sCASP
:- use_module('../../prolog/scasp/embed').
:- use_module('../../prolog/scasp/human').
% something is a moth if it does not fly during daylight.
%
:- begin_scasp(moth, [moth_scasp/1]).
moth_scasp(X) :- not flies_during_day(X).
flies_during_day(B) :- bird(B).
bird(eagle).
bird(hummingbird).
bird(bluejay).
:- end_scasp.
% Now WFS
moth_wfs(X) :- tnot(flies_during_day_wfs(X)).
:- table flies_during_day_wfs/1.
flies_during_day_wfs(B) :- bird_wfs(B).
bird_wfs(eagle).
bird_wfs(hummingbird).
bird_wfs(bluejay).
Now let’s try it with WFS:
5 ?- moth_wfs(X).
false.
Uhh? This is useless. In WFS negation is not really handled the way a human would expect.
Now let’s look at the beauty of sCASP:
4 ?- moth_scasp(X).
sCASP model: [not bird(X),not flies_during_day(X),moth_scasp(X)],
sCASP justification
query ←
moth_scasp(X) ←
not flies_during_day(X) ←
not bird(X) ∧
o_nmr_check,
X ∉ [bluejay,eagle,hummingbird] ;
false.
WOW! It told me X could be a moth if it is not a bluejay or eagle or hummingbird. Much more useful! It uses all the information I gave in the code. Notice the “could be”.
Not only that, but it told me why: because something is a moth if it doesn’t fly during the day. And it also told me that something doesn’t fly during the day if it is not a bird, even though I never said this explicitly in the code
This is quite amazing, and I can see that it solves the negation problem in a satisfactory manner (of course the issue now is performance).
Question
I am trying to figure out what ‘o_nmr_check’ means, could you explain it?
EDIT: just for the sake of completeness, we can add the following line to the scasp code above an it will give us the ‘closed world model’ answer that moth_wfs(X) gives us:
-bird(_).
It is good to see you arrive at pretty much the same results. I’m not sure about calling ordinary Prolog from sCASP. That might be problematic if negation is involved and as negation is typically the reason to consider sCASP it might not be that easy. As for providing the results, I came to this after discussion with Joaquin Arias: