是否存在具有以下功能的编程语言?

hat*_*cyl 6 language-agnostic programming-languages language-design

是否有一种语言可以支持以下概念,或者是否有一种模式可以实现与现有概念类似的东西?

概念

我想定义一个Rectangle具有以下属性:Length,Height,Area,Perimeter,在哪里Area = Length * HeightPerimeter = (2 * Length) + (2 * Height).

鉴于上面的陈述,如果我想Rectangle通过给它a Length和a 创建一个Height,它当然应该自动填写其余的属性.

但是,它应该更进一步,并自动允许您创建Rectangle任何两个属性(说HeightPerimeter),因为这在数学上也足以创建相同的属性Rectangle.

为了帮助解释这个想法,请举个例子:

//Declaration
Rectangle
{
    Height, Length, Area, Perimeter;

    Area = Height * Length;
    Perimeter = (2 * Length) + (2 * Height);
}

//Usage
main()
{
    var rectangleA = new Rectangle(Height, Length);
    var rectangleB = new Rectangle(Height, Area);

    Assert(rectangleA == rectangleB);
}
Run Code Online (Sandbox Code Playgroud)

请注意我不需要为其定义构造函数Rectangle.注意我不需要指定Rectangle使用Height和创建a 时所需的特定逻辑Area.

编辑:对于正确的示例,应该是矩形而不是正方形.

Fra*_*fer 6

您正在寻找的是具有集成计算机代数系统的语言.它必须能够解决关于不同变量的方程.

虽然有可能实现这样的东西,但我怀疑它是否有意义,因为在许多情况下,将无法解决方案或多种解决方案.

如果仅给出区域和周长,即使您的简单示例也不会起作用,因为通常会有两个解决方案.(我假设你的类实际上代表一个矩形而不是一个正方形,否则你不应该有长度和高度的单独变量.)

例:

Input: area = 2, perimeter = 6
Solution 1: length = 2, height = 1
Solution 2: length = 1, height = 2
Run Code Online (Sandbox Code Playgroud)

另一个与您的问题无关的评论:您的类显然包含冗余成员变量.由于各种原因,这是一件坏事,最重要的是可能出现不一致.除非你有非常严格的性能限制,否则你应该只存储其中的两个,比如长度和宽度,并提供在需要时计算其他的方法.


dan*_*gom 3

当然存在这样的语言。正如您现在在对此答案的评论中指出的那样,很多人都这样做。

在下面的示例中,我将使用Powerloom表示系统,该系统以名为STELLA 的语言实现。您可以在Common Lisp环境中使用它。安装完所有内容后,您可以通过运行以下命令加载语言:

(cl:load "load-powerloom.lisp")
(in-package "STELLA")
(in-dialect "KIF")
Run Code Online (Sandbox Code Playgroud)

这就是开始构建令人惊叹的几何对象所需的全部内容。在 STELLA 中,您可以使用原语定义一个概念defconcept

(defconcept Rectangle (?r)
  :documentation "Curious geometrical objects that live on a plane.")
Run Code Online (Sandbox Code Playgroud)

并用以下方式定义其属性deffunction

(deffunction rect-height ((?t Rectangle)) :-> (?n INTEGER))
(deffunction rect-length ((?t Rectangle)) :-> (?n INTEGER))
(deffunction area ((?t Rectangle)) :-> (?n INTEGER))
(deffunction perimeter ((?t Rectangle)) :-> (?n INTEGER))
Run Code Online (Sandbox Code Playgroud)

为了建立矩形的面积、周长和边之间的关系,您必须做出一些断言。这就是你所需要assert的。

(assert (forall (?t Rectangle)
                (= (area ?t) (* (rect-height ?t) (rect-length ?t)))))
(assert (forall (?t Rectangle)
                (= (perimeter ?t) (+ (* 2 (rect-height ?t))
                                     (* 2 (rect-length ?t))))))
Run Code Online (Sandbox Code Playgroud)

您告诉 STELLA,对于所有矩形,面积是高度和长度的乘积,对于所有矩形,周长是高度的两倍加上长度的两倍。

现在您可以实例化您的对象,并且赋予它什么属性并不重要,只要它们有意义即可。

(definstance rect1 :Rectangle true :rect-height 10 :rect-length 10)
(definstance rect2 :Rectangle true :area 40 :rect-height 20)
Run Code Online (Sandbox Code Playgroud)

在这里,您rect1使用高度和长度作为参数以及rect2面积和高度进行实例化。

但检查该语言是否符合您的预期总是好的:

STELLA> (retrieve all ?x (= (area rect1) ?x))
There is 1 solution:
  #1: ?X=100

STELLA> (retrieve all ?x (= (rect-length rect2) ?x))
There is 1 solution:
  #1: ?X=2
Run Code Online (Sandbox Code Playgroud)

如果您厌倦了矩形并决定构建一个美丽的正方形,为什么不推导出一个概念呢?

(defconcept Square ((?r Rectangle))
  :documentation "Weird rectangles that fascinated the Greeks"
  :<=> (= (rect-height ?r) (rect-length ?r)))
Run Code Online (Sandbox Code Playgroud)

只需告诉 STELLA,正方形是高度和长度相等的矩形。

现在尝试一下:

STELLA> (definstance nice-rectangle :Rectangle true :rect-length 10 :area 100)
|i|NICE-RECTANGLE
STELLA> (ask (Square nice-rectangle))
TRUE
Run Code Online (Sandbox Code Playgroud)

我根本不是专家,但我发现这种语言很有趣。遗憾的是,互联网上关于它的信息太少了。就连说明书也不完整。如需了解更多信息,我建议从这些幻灯片开始。

著名的书 SICP 在这里教授了如何为这种语言构建一个非确定性评估器最后,可以在这里 看到一篇精彩的文章,描述了这些想法背后的动机和应用。