# How can I use scasp operators in the query in embed mode?

**URL:** <https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681>\
**Category:** Help!\
**Created:** [December 18, 2024, 8:56pm UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681 "2024-12-18T20:56:03Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Frank\_Schwidom](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/frank_schwidom/32/7662_2.png) [@Frank\_Schwidom](https://swi-prolog.discourse.group/u/Frank_Schwidom)\
**Post date:** [December 18, 2024, 8:56pm UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681/1 "2024-12-18T20:56:03Z")

</div>

Hi,

I am figuring out the example from the document [http://ceur-ws.org/Vol-2970/gdepaper1.pdf](http://ceur-ws.org/Vol-2970/gdepaper1.pdf)

```prolog
member(X, [X|Xs] ).
member(X, [_|Xs] ):- member(X, Xs).
list( [1,2,3,4,5] ).
?- list(A), not member(B, A).

```

This in fact works.

In embed mode:

```prolog
:- use_module( library( scasp)).

:- begin_scasp(member,[member/2,list/1]). 

member(X, [X|Xs] ).
member(X, [_|Xs] ):- member(X, Xs).
list( [1,2,3,4,5] ).

:- end_scasp.

```

How can I perform the same query? I am stumbling over the not operator at this point.

Regards

---

<div class="post-metadata">

**Author:** ![archit-rastogi](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/archit-rastogi/32/6899_2.png) [@archit-rastogi](https://swi-prolog.discourse.group/u/archit-rastogi)\
**Post date:** [December 19, 2024, 7:11am UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681/2 "2024-12-19T07:11:55Z")

</div>

The begin\_scasp/end\_scasp does not seem to work. From previous threads, it may not be there at all, will let some one confirm.  
When i tried, i get error like below:

```prolog
ERROR: catch/3: Unknown procedure: begin_scasp/2

```

---

<div class="post-metadata">

**Author:** ![jan](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/jan/32/4_2.png) [@jan](https://swi-prolog.discourse.group/u/jan)\
**Post date:** [December 19, 2024, 9:11am UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681/3 "2024-12-19T09:11:17Z")

</div>

The begin/end scasp was the first attempt to embed sCASP in Prolog. I consider it failed. Write normal Prolog code and evaluate it using sCASP semantics using scasp\_call/2, ?/1, etc. That is way cleaner 🙂

---

<div class="post-metadata">

**Author:** ![Frank\_Schwidom](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/frank_schwidom/32/7662_2.png) [@Frank\_Schwidom](https://swi-prolog.discourse.group/u/Frank_Schwidom)\
**Post date:** [December 19, 2024, 11:11am UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681/4 "2024-12-19T11:11:34Z")

</div>

Thanks. Now it works:

```prolog

:- use_module( library( scasp)).

member(X, [X|_] ).
member(X, [_|Xs] ):- member(X, Xs).

list( [1,2,3,4,5] ).

```

```prolog
?- ? list(A), not member(B, A).
A = [1, 2, 3, 4, 5],
% s(CASP) model
{ list([1,2,3,4,5]), not member(B,[1,2,3,4,5]), not member(B,[3,4,5]), not member(B,[5]),
  not member(B,[]), not member(B,[2,3,4,5]), not member(B,[4,5])
},
B ∉ [1,2,3,4,5] ;
false.

```

---

<div class="post-metadata">

**Author:** ![Frank\_Schwidom](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/frank_schwidom/32/7662_2.png) [@Frank\_Schwidom](https://swi-prolog.discourse.group/u/Frank_Schwidom)\
**Post date:** [December 19, 2024, 1:32pm UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681/5 "2024-12-19T13:32:23Z")

</div>

Interestingly it works also when I do not define ‘member’. Scasp then seems to use the builtin member predicate. How does scasp decide how deep it has to interpret the code? Obviously I cannot call ‘writeln’ without creating an error from a scasp interpreted predicate ( “No permission to scasp procedure `system:writeln/1’”).

This can only mean that there should be a means for the call of a prolog predicate out of a scasp context.

After searching the discourse discussions about that I came up with no substantial insights.

Maybe it is also not needed. Normally a pure scasp program don’t call prolog predicates.

But to be more dynamic it should be at least possible to assert the scasp rules dynamically via assertz and then call it.

---

<div class="post-metadata">

**Author:** ![Frank\_Schwidom](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/frank_schwidom/32/7662_2.png) [@Frank\_Schwidom](https://swi-prolog.discourse.group/u/Frank_Schwidom)\
**Post date:** [December 19, 2024, 2:04pm UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681/6 "2024-12-19T14:04:55Z")

</div>

I have it, I only need to define

```prolog
:- prolog writeln/1 as opaque.

```

---

<div class="post-metadata">

**Author:** ![jan](https://yyz2.discourse-cdn.com/free1/user_avatar/swi-prolog.discourse.group/jan/32/4_2.png) [@jan](https://swi-prolog.discourse.group/u/jan)\
**Post date:** [December 19, 2024, 4:17pm UTC](https://swi-prolog.discourse.group/t/how-can-i-use-scasp-operators-in-the-query-in-embed-mode/8681/7 "2024-12-19T16:17:59Z")

</div>

> [@Frank\_Schwidom](#):
>
> `:- prolog writeln/1 as opaque.`

Yes. That is very new and a bit experimental feature. It calls the target predicate using findall/3 and acts as if there was set of facts with the results. So, if we have `not between(1,5,X)`, it will call findall(X, between(1,5,X), Xs) and say `X ∉ [1,2,3,4,5]`.

Other than that, it establishes the whole call tree and verify that every predicate it finds follows the sCASP restrictions.
