1

序言应该找到五个语句语句的顺序。一切正常,但是当我调用查询时, solution([A, B, C, D, E])我得到一个像这样的沙盒错误:

错误:

Sandbox restriction!
Could not derive which predicate may be called from
      call(C)
      all(schoolgirl,[A,B,C,D,E])
      solution([A,B,C,D,E])

完整的序言程序:

all(_,[]).
all(Pred, [X|Xs]):-
    P =..[Pred,X],
    call(P),
    all(Pred,Xs).
distinct([]).
distinct([X|Xs]):- 
    not(member(X, Xs)), distinct(Xs).
x0r(A, B):- 
    A, not(B).
x0r(A, B):-
    not(A), B.

schoolgirl(betty).
schoolgirl(ethel).
schoolgirl(joan).
schoolgirl(kitty).
schoolgirl(mary).

betty(Snd,Trd):- 
    x0r(Snd=kitty, Trd=betty).
ethel(Fst, Snd):- 
    x0r(Fst=ethel, Snd=joan).
joan(Trd, Fith):- 
    x0r(Trd=joan, Fith=ethel).
kitty(Snd, Forth):- 
    x0r(Snd=kitty, Forth=mary).
mary(Forth, Fst):- 
    x0r(Forth=mary, Fst-betty).

solution([Fst, Snd, Trd, Forth, Fith]):-
    all(schoolgirl, [Fst,Snd, Trd, Forth, Fith]),
    distinct([Fst, Snd, Trd, Forth, Fith]),
    betty(Snd, Trd),
    ethel(Fst, Snd),
    joan(Trd, Fith),
    kitty(Snd, Forth),
    mary(Forth, Fst).

电话是

solution([A, B, C, D, E])
4

1 回答 1

3

正如评论者所说,这似乎是使用 SWI-Prolog 的基于浏览器的 SWISH 系统 ( https://swish.swi-prolog.org/ ) 时的特殊限制。它不希望您使用call/1它不太了解的术语。

幸运的是,您可以提供更多信息:您call/1在以下上下文中使用:

P =..[Pred,X],
call(P),

也就是说,对于Pred只有一个参数的谓词的调用X。有一个更直接的语法:

call(Pred, X)

这足以使错误消失,并使 SWISH 愿意运行您的程序。(事实上​​,这种语法更通用一些,因为它只需要一个额外的参数来添加到已经在 中的参数Pred,所以call(f(a), b)会调用目标f(a, b)。)

您的查询现在将因一个有点模糊的错误而死:

procedure `A-B' does not exist
Reachable from:
      call(_1690-betty)
      not(A-betty)
      x0r(A=mary,B-betty)
      mary(A,B)
      solution(A)

您的mary/2谓词定义中有错字。

于 2021-11-24T19:57:35.090 回答