【问题标题】:How do you define an operator in prolog to make a list?你如何在prolog中定义一个运算符来制作一个列表?
【发布时间】:2011-06-11 06:30:57
【问题描述】:

我想以某种方式定义一个运算符“++>”,以便键入“a ++> b”将生成一个 [a,b] 列表。

我已经编写了以下代码,但它似乎无法完成这项工作。

++>(X,Y) :-
 [X,Y].

:- op(500,xfy,++>).

【问题讨论】:

  • 这里确实有两个问题,将运算符“++>”定义为中缀符号,并将表达式“a ++> b”设置为“评估”为术语 [a,乙]。正如您从提到 op/3 中所知道的,第一部分是相当标准的 Prolog。让机器到位以“评估”涉及新运营商的条款更加棘手。对于算术函数,SWI-Prolog 有一个指令允许 is/2 使用用户定义的函数,但你的不是算术函数。我可以向您展示如何定义一个新的谓词 iz/2 来“评估” ++> 个术语。
  • 我有机会去挖掘 SWI-Prolog 的 arithmetic_function/1 指令,我注意到它是 deprecated, perhaps dropped

标签: list operators prolog


【解决方案1】:
:- op(500,xfy,++>).
++>(X,Y,[X,Y]).

并像使用它

?- ++>(1,2,X).
X = [1, 2].

实际上,Prolog 不是面向计算的,因此运算符只是术语的同义词。 您需要一个术语\3,其中一个元素是另一个元素的列表。因此,在这种情况下,您不能使用 2 位运算符。顺便说一句,您不能在这种情况下使用 is,因为它仅用于算术情况。

【讨论】:

  • 在您的示例中声明运算符是没有用的。您声明了一个 2 参数运算符 (++>/2) 但定义了一个 3 参数谓词 (++>/3)
  • 对,那我们来声明一些 3place 运算符
【解决方案2】:

这对你有用吗:

++>((X,Y),Z) :-Z= [X,Y].

:- op(500,xfy,++>).

【讨论】:

    【解决方案3】:

    [a,b,c] 只是'.'(a,'.'(b,'.'(c)))) 的语法糖。所以你可以同样定义你的操作符并编写一个转换谓词:

    :- op(500,xfy,'++>').
    
    convert('++>'(A,B),[A|R]) :-
        convert(B,R).
    convert(Any,[Any]).
    

    例子:

    | ?- X = 1++>2++>3, convert(X,Y).                                    
    X = 1++>2++>3
    Y = [1,2,3] ?
    yes
    

    【讨论】:

      猜你喜欢
      • 2011-04-30
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      相关资源
      最近更新 更多