如何让Prolog再次智能化?
我有一个JavaScript程序,我的任务是将我的JavaScript源文件转换为可用的Prolog程序。
在Prolog版本中,JavaScript程序保持不变,但前面是prolog代码,用于自定义Prolog环境,并教会它如何使用JavaScript语法执行(后续遇到的)程序。
我的解决方案几乎正常。缺少的是能够说出console.log'。
$ node
> function program(_)
{
console.log(1) ;
console.log(2) ;
}
> program(_) ;
1
2
undefined
>
^D
$
$ swipl
?- [user] .
/* %% insert needed solution here %% */
^D
?- [user] .
function program(_)
{
console.log(1) ;
console.log(2) ;
}
.
^D
?- program(_) ; .
1
2
true.
?-
?- [user] .
:- use_module(library(clpfd)) .
:- op(10'1,'fy','once') .
:- op(10'1,'xfy','forall') .
/* #### goal_true_false #### */
(
goal_true_false(GOAL,TRUE,FALSE)
)
:-
(
GOAL *-> TRUE ; FALSE
)
.
/* #### op #### */
:- op(10'1,'yf',{}) .
:- op(10'1,'yf',';') .
:- op(10'1,'xfy',';') .
:- op(10'1,'fy','function') .
/* #### semicolon #### */
(
semicolon(A,OUT)
)
:-
(
OUT
=
(
goal_true_false(A,(true),(throw({ problem: false , culprit: (A) , reporter: ';' })))
)
)
.
(
goal_expansion(IIN,OUT)
)
:-
(
IIN
=
(
A ; B ; C
)
,
semicolon(A,A_SEMICOLON)
,
semicolon(B,B_SEMICOLON)
,
OUT
=
(
A_SEMICOLON , B_SEMICOLON ; C
)
)
.
(
goal_expansion(IIN,OUT)
)
:-
(
IIN
=
(
A ; B ;
)
,
semicolon(A,A_SEMICOLON)
,
semicolon(B,B_SEMICOLON)
,
OUT
=
(
A_SEMICOLON , B_SEMICOLON
)
)
.
(
goal_expansion(IIN,OUT)
)
:-
(
IIN
=
(
A ; B
)
,
semicolon(A,A_SEMICOLON)
,
semicolon(B,B_SEMICOLON)
,
OUT
=
(
A_SEMICOLON , B_SEMICOLON
)
)
.
(
goal_expansion(IIN,OUT)
)
:-
(
IIN
=
(
A ;
)
,
semicolon(A,A_SEMICOLON)
,
OUT
=
(
A_SEMICOLON
)
)
.
/* #### function SIGNATURE { BODY } #### */
term_expansion(IIN,OUT)
:-
(
IIN
=
(
function SIGNATURE { BODY }
)
,
OUT
=
(
SIGNATURE :- ( BODY )
)
)
.
/* #### console_log #### */
function console_log(IT)
{
once
(
writeq(IT)
,
nl
)
}
.
^D
我故意将console_log
用于此解决方案,而不是console.log
因为我还不知道如何使console.log
工作。
?- [user] .
function program(_)
{
console_log(1) ;
console_log(2) ;
}
.
^D
?- program(_) ; .
1
2
true.
还有待完成的工作是弄清楚如何处理.
中的console.log
。
有人可以帮忙吗?
另外,我很好奇有关上述分号实施的意见。您认为;
之类的语义是否与典型计算机编程脚本中固有的符号学期望相匹配?