教prolog如何执行这个简单的JavaScript程序?

时间:2017-04-04 17:52:20

标签: javascript prolog logic

如何让Prolog再次智能化?

我有一个JavaScript程序,我的任务是将我的JavaScript源文件转换为可用的Prolog程序。

在Prolog版本中,JavaScript程序保持不变,但前面是prolog代码,用于自定义Prolog环境,并教会它如何使用JavaScript语法执行(后续遇到的)程序。

我的解决方案几乎正常。缺少的是能够说出console.log'。

JavaScript中的解决方案

    $ node

    > function program(_)
    {
        console.log(1) ;
        console.log(2) ;
    }

    > program(_) ;
    1
    2
    undefined
    >

    ^D

    $

预计在Prolog工作

    $ swipl

    ?- [user] .

    /* %% insert needed solution here %% */

    ^D

    ?- [user] .

    function program(_)
    {
        console.log(1) ;
        console.log(2) ;
    }
    .

    ^D

    ?-  program(_) ; .
    1
    2
    true.

    ?-

Prolog中的部分解决方案

    ?- [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

有人可以帮忙吗?

另外,我很好奇有关上述分号实施的意见。您认为;之类的语义是否与典型计算机编程脚本中固有的符号学期望相匹配?

0 个答案:

没有答案