是否存在具有以下特征的编程语言?
Does a programming language with the following features exist?
是否有一种语言可以支持以下概念,或者是否有一种模式可以实现与现有语言类似的功能?
概念
我想定义一个具有以下属性的 Rectangle
:Length
、Height
、Area
、Perimeter
;其中 Area = Length * Height
和 Perimeter = (2 * Length) + (2 * Height)
.
鉴于上面的陈述,如果我想通过给它一个 Length
和一个 Height
来创建一个 Rectangle
,它当然应该自动填写其余的属性.
但是,它应该更进一步,自动允许您创建具有任意两个属性(比如 Height
和 Perimeter
)的 Rectangle
,因为这在数学上也足以创建相同 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);
}
Notice how I didn't need to define constructors for Rectangle
. Notice I did not need specify the specific logic needed if a Rectangle
was created using Height
and Area
.
编辑:举个恰当的例子,应该是矩形而不是正方形。
您正在寻找的是一种具有集成计算机代数系统的语言。它必须能够解决关于不同变量的方程式。
虽然可以实现这样的东西,但我怀疑它是否有意义,因为在许多情况下,要么没有解决方案,要么有多个解决方案。
如果仅给出面积和周长,即使您的简单示例也无法运行,因为通常会有两种解决方案。 (我假设你的 class 实际上代表一个矩形而不是正方形,否则你不应该有单独的长度和高度变量。)
示例:
Input: area = 2, perimeter = 6
Solution 1: length = 2, height = 1
Solution 2: length = 1, height = 2
另一条与您的问题无关的评论:您的 class 显然包含多余的成员变量。由于各种原因,这是一件坏事,最重要的是不一致的可能性。除非你有 非常 严格的性能限制,否则你应该只存储其中的两个,比如长度和宽度,并在需要时提供计算其他方法的方法.
在 C# 中,您可以使用具有隐式 getter 和 setter 的属性。这样你就可以这样写:
public class Square {
public int Length {
get { return length; }
set { length = value; }
}
public int Area {
get { return length * length; }
set { length = Math.Sqrt(value); }
}
public int Perimeter {
get { return length * 4; }
set { length = value / 4; }
}
private int length;
}
现在你可以写:
Square square = new Square();
square.Length = 2;
Console.WriteLine(square.Length); // "2"
Console.WriteLine(square.Area); // "4"
Console.WriteLine(square.Perimeter); // "8"
square.Area = 9;
Console.WriteLine(square.Length); // "3"
Console.WriteLine(square.Area); // "9"
Console.WriteLine(square.Perimeter); // "12"
编辑:
C# 还允许您在实例化对象时根据自己的选择命名属性:
Square square1 = new Square { Perimeter = 12 };
Square square2 = new Square { Length = 4 };
我不认为这样的东西以编程语言的形式存在。
Ontology
然而,我能想到的第一种方法是定义一个 Ontology,我的意思是一组关于
的规则
- 实体:矩形、正方形、狗、汽车等...
- 属性:面积、高度、车轮数量等...
- (1) 和 (2) 之间的关系:矩形的面积为高 * 宽,...
现在给定一个属性列表和所需的输出实体
I have height
and width
and I need a Rectangle
系统可以通过规则图搜索路径,以根据提供的输入产生所需的结果。
现实世界的例子
Wolfram Alpha 可能遵循上述技术
当然有这种语言。正如您现在在自己对此答案的评论中指出的那样,很多人都这样做了。
在下面的示例中,我将使用 Powerloom representation system, implemented in a language called STELLA。
您可以在 Common Lisp 环境中使用它。
安装完所有内容后,您可以通过 运行:
加载语言
(cl:load "load-powerloom.lisp")
(in-package "STELLA")
(in-dialect "KIF")
这就是开始构建超棒的几何对象所需的全部内容。
在 STELLA 中,您可以使用原语 defconcept
:
定义一个概念
(defconcept Rectangle (?r)
:documentation "Curious geometrical objects that live on a plane.")
并用 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))
要确定矩形的面积、周长和边之间的关系,您必须做出一些断言。这就是你 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))))))
您是在告诉 STELLA,对于所有矩形,面积是高度和长度的乘积,对于所有矩形,周长是高度的两倍加上长度的两倍。
现在你可以实例化你的对象了,你给它什么属性并不重要,只要它们有意义。
(definstance rect1 :Rectangle true :rect-height 10 :rect-length 10)
(definstance rect2 :Rectangle true :area 40 :rect-height 20)
这里你实例化 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
如果您厌倦了矩形并决定建造一个漂亮的正方形,为什么不推导出一个概念呢?
(defconcept Square ((?r Rectangle))
:documentation "Weird rectangles that fascinated the Greeks"
:<=> (= (rect-height ?r) (rect-length ?r)))
简单地告诉STELLA,正方形是长方形,高和长相等。
现在试试看:
STELLA> (definstance nice-rectangle :Rectangle true :rect-length 10 :area 100)
|i|NICE-RECTANGLE
STELLA> (ask (Square nice-rectangle))
TRUE
我根本不是专家,但我觉得这门语言很吸引人。遗憾的是,互联网上关于它的信息太少了。甚至手册也不完整。
有关更多信息,我建议从 these slides.
开始
名著 SICP 讲授了如何为这种语言构建非确定性求值器 here.
最后,可以看到一篇描述这些想法背后的动机和应用的精彩文章 here。
是否有一种语言可以支持以下概念,或者是否有一种模式可以实现与现有语言类似的功能?
概念
我想定义一个具有以下属性的 Rectangle
:Length
、Height
、Area
、Perimeter
;其中 Area = Length * Height
和 Perimeter = (2 * Length) + (2 * Height)
.
鉴于上面的陈述,如果我想通过给它一个 Length
和一个 Height
来创建一个 Rectangle
,它当然应该自动填写其余的属性.
但是,它应该更进一步,自动允许您创建具有任意两个属性(比如 Height
和 Perimeter
)的 Rectangle
,因为这在数学上也足以创建相同 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);
}
Notice how I didn't need to define constructors for
Rectangle
. Notice I did not need specify the specific logic needed if aRectangle
was created usingHeight
andArea
.
编辑:举个恰当的例子,应该是矩形而不是正方形。
您正在寻找的是一种具有集成计算机代数系统的语言。它必须能够解决关于不同变量的方程式。
虽然可以实现这样的东西,但我怀疑它是否有意义,因为在许多情况下,要么没有解决方案,要么有多个解决方案。
如果仅给出面积和周长,即使您的简单示例也无法运行,因为通常会有两种解决方案。 (我假设你的 class 实际上代表一个矩形而不是正方形,否则你不应该有单独的长度和高度变量。)
示例:
Input: area = 2, perimeter = 6
Solution 1: length = 2, height = 1
Solution 2: length = 1, height = 2
另一条与您的问题无关的评论:您的 class 显然包含多余的成员变量。由于各种原因,这是一件坏事,最重要的是不一致的可能性。除非你有 非常 严格的性能限制,否则你应该只存储其中的两个,比如长度和宽度,并在需要时提供计算其他方法的方法.
在 C# 中,您可以使用具有隐式 getter 和 setter 的属性。这样你就可以这样写:
public class Square {
public int Length {
get { return length; }
set { length = value; }
}
public int Area {
get { return length * length; }
set { length = Math.Sqrt(value); }
}
public int Perimeter {
get { return length * 4; }
set { length = value / 4; }
}
private int length;
}
现在你可以写:
Square square = new Square();
square.Length = 2;
Console.WriteLine(square.Length); // "2"
Console.WriteLine(square.Area); // "4"
Console.WriteLine(square.Perimeter); // "8"
square.Area = 9;
Console.WriteLine(square.Length); // "3"
Console.WriteLine(square.Area); // "9"
Console.WriteLine(square.Perimeter); // "12"
编辑:
C# 还允许您在实例化对象时根据自己的选择命名属性:
Square square1 = new Square { Perimeter = 12 };
Square square2 = new Square { Length = 4 };
我不认为这样的东西以编程语言的形式存在。
Ontology
然而,我能想到的第一种方法是定义一个 Ontology,我的意思是一组关于
的规则- 实体:矩形、正方形、狗、汽车等...
- 属性:面积、高度、车轮数量等...
- (1) 和 (2) 之间的关系:矩形的面积为高 * 宽,...
现在给定一个属性列表和所需的输出实体
I have
height
andwidth
and I need aRectangle
系统可以通过规则图搜索路径,以根据提供的输入产生所需的结果。
现实世界的例子
Wolfram Alpha 可能遵循上述技术
当然有这种语言。正如您现在在自己对此答案的评论中指出的那样,很多人都这样做了。
在下面的示例中,我将使用 Powerloom representation system, implemented in a language called STELLA。 您可以在 Common Lisp 环境中使用它。 安装完所有内容后,您可以通过 运行:
加载语言(cl:load "load-powerloom.lisp")
(in-package "STELLA")
(in-dialect "KIF")
这就是开始构建超棒的几何对象所需的全部内容。
在 STELLA 中,您可以使用原语 defconcept
:
(defconcept Rectangle (?r)
:documentation "Curious geometrical objects that live on a plane.")
并用 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))
要确定矩形的面积、周长和边之间的关系,您必须做出一些断言。这就是你 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))))))
您是在告诉 STELLA,对于所有矩形,面积是高度和长度的乘积,对于所有矩形,周长是高度的两倍加上长度的两倍。
现在你可以实例化你的对象了,你给它什么属性并不重要,只要它们有意义。
(definstance rect1 :Rectangle true :rect-height 10 :rect-length 10)
(definstance rect2 :Rectangle true :area 40 :rect-height 20)
这里你实例化 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
如果您厌倦了矩形并决定建造一个漂亮的正方形,为什么不推导出一个概念呢?
(defconcept Square ((?r Rectangle))
:documentation "Weird rectangles that fascinated the Greeks"
:<=> (= (rect-height ?r) (rect-length ?r)))
简单地告诉STELLA,正方形是长方形,高和长相等。
现在试试看:
STELLA> (definstance nice-rectangle :Rectangle true :rect-length 10 :area 100)
|i|NICE-RECTANGLE
STELLA> (ask (Square nice-rectangle))
TRUE
我根本不是专家,但我觉得这门语言很吸引人。遗憾的是,互联网上关于它的信息太少了。甚至手册也不完整。 有关更多信息,我建议从 these slides.
开始名著 SICP 讲授了如何为这种语言构建非确定性求值器 here. 最后,可以看到一篇描述这些想法背后的动机和应用的精彩文章 here。